2008-09-26 38 views
7

Mã egregiously dư thừa nhất xây dựng Tôi thường thấy bao gồm việc sử dụng mã chuỗiđang Redundant xây dựng

if (condition) 
    return true; 
else 
    return false; 

thay vì chỉ đơn giản là viết

return (condition); 

Tôi đã nhìn thấy lỗi người mới bắt đầu này trong tất cả các loại ngôn ngữ : từ Pascal và C sang PHP và Java. Bạn sẽ gắn cờ các cấu trúc khác như thế nào trong đánh giá mã?

+0

Tuy nhiên, đôi khi, khi bạn thiết kế mã để điền. Trong trường hợp đó để lại cấu trúc đó tại chỗ như giàn giáo có ý nghĩa. Nhưng nếu chức năng được coi là "hoàn thành" thì điều đó nên được tối ưu hóa bởi trình mã hóa để bảo trì. –

+0

Phải là một wiki cộng đồng. – tj111

+0

Tôi đặt bit cộng đồng wiki - cảm ơn đề xuất. –

Trả lời

2

Trở vô ích ở cuối:

// stuff 
    return; 
} 
2

Sử dụng ToString trên một chuỗi

9
if (condition == true) 
{ 
    ... 
} 

thay vì

if (condition) 
{ 
    ... 
} 

Edit:

hoặc thậm chí tồi tệ hơn và biến xung quanh kiểm tra điều kiện:

if (condition == false) 
{ 
    ... 
} 

mà có thể dễ dàng đọc như

if (condition) then ... 
+0

Tôi nghĩ rằng bạn đánh bại tôi với nó bằng một vài giây! –

+0

Vâng, tôi phải nhanh hơn một chút. Tôi đã upvote của bạn mặc dù vì sự hài hước :) – Otherside

10
if (foo == true) 
{ 
    do stuff 
} 

Tôi luôn nói với các nhà phát triển nào đó mà nó phải được

if ((foo == true) == true) 
{ 
    do stuff 
} 

nhưng anh chưa nhận được gợi ý.

+3

Đừng cung cấp cho họ lời khuyên đảo ngược, nó sẽ chỉ gây nhầm lẫn cho họ. – Johan

+1

Trên thực tế, nó phải là 'if (((foo == true) == true) == true) {...}' –

3
void myfunction() { 
    if(condition) { 
    // Do some stuff 
    if(othercond) { 
     // Do more stuff 
    } 
    } 
} 

thay vì

void myfunction() { 
    if(!condition) 
    return; 

    // Do some stuff 

    if(!othercond) 
    return; 

    // Do more stuff 
} 
+0

Cấu trúc đó có thể được lập luận là hợp lệ nếu bạn là "nhiều lợi nhuận voilates mã có cấu trúc" kiểu. –

+0

Bạn cần một ví dụ tốt hơn. Chỉ với một cấp độ làm tổ, phong cách "trở về sớm" không tốt hơn. Trong mẫu đó tôi thích cái cũ hơn. Nhưng tôi biết những gì bạn đang nhận được và đồng ý với ý tưởng đó. –

+0

Thậm chí chỉ với một mức làm tổ, 'sự trở lại sớm' vẫn giúp bạn tiết kiệm được mức độ làm tổ đó. Tôi không hiểu tại sao một cấp là không tốt hơn nhưng 2 cấp độ là. :) –

3

Tôi đã từng có một anh chàng liên tục đã làm điều này:

bool a; 
bool b; 
... 
if (a == true) 
    b = true; 
else 
    b = false; 
+1

b = a? đúng sai; Nó phụ thuộc, bạn có muốn b bằng 17 nếu đó là những gì được cân bằng không? – Mez

2

Đưa một tuyên bố exit như tuyên bố đầu tiên trong một chức năng để vô hiệu hóa việc thực hiện các chức năng đó , thay vì một trong các tùy chọn sau:

  • hoàn toàn loại bỏ các chức năng
  • Bình luận các chức năng cơ thể
  • Giữ chức năng nhưng xóa tất cả các mã

Sử dụng exit như tuyên bố đầu tiên làm cho nó rất khó để phát hiện, bạn có thể dễ dàng đọc qua nó.

+1

Để gỡ lỗi, việc xóa chức năng thường không phải là một tùy chọn (nếu được gọi ở nhiều nơi), nhận xét nội dung không hoạt động nếu có nhận xét lồng nhau và xóa mã có nghĩa là bạn phải lưu nó ở đâu đó. 'WTF thực' (tm) để lại câu lệnh thoát. –

+0

Việc xóa mã phải luôn là một tùy chọn vì bạn có quyền kiểm soát nguồn. do đó WTF thực sự không có kiểm soát nguồn. – mattlant

+0

heh, tôi khi tôi tiếp tục đọc một ai đó đã đề cập rằng đã có :) – mattlant

4

Tuyên bố riêng rẽ với nhiệm vụ bằng các ngôn ngữ khác ngoài C:

int foo; 
foo = GetFoo(); 
+0

Tôi thực sự làm điều đó khá thường xuyên trong C + + với không xây dựng-in, nơi tôi có thể hoặc có thể không muốn thêm công cụ vào một vector ví dụ. –

8

Sử dụng ý kiến ​​thay vì kiểm soát nguồn:
-Commenting ra hoặc đổi tên chức năng thay vì xóa chúng và tin tưởng rằng kiểm soát nguồn có thể nhận được chúng trở lại cho nếu cần.
-Thêm nhận xét như "Thay đổi RWF" thay vì chỉ thực hiện thay đổi và cho phép kiểm soát nguồn gán đổ lỗi.

5

Somewhere I đã phát hiện điều này, mà tôi tìm thấy là đỉnh cao của sự dư thừa boolean:

return (test == 1)? ((test == 0) ? 0 : 1) : ((test == 0) ? 0 : 1); 

:-)

+0

Một giấc mơ biên dịch :) – leppie

1

Tôi thường chạy vào như sau:

function foo() { 
    if (something) { 
     return; 
    } else { 
     do_something(); 
    } 
} 

Nhưng nó không giúp nói với họ rằng người khác là vô ích ở đây. Nó phải là một trong hai

function foo() { 
    if (something) { 
     return; 
    } 
    do_something(); 
} 

hoặc - tùy thuộc vào độ dài của kiểm tra được thực hiện trước khi do_something():

function foo() { 
    if (!something) { 
     do_something(); 
    } 
} 
+0

Tôi sẽ không đồng ý về điều đó. Mã gốc không thực hiện bất kỳ điều gì tồi tệ hơn và công việc thực tế nằm trong mã ở cùng cấp độ làm tổ - Tôi thấy dễ đọc hơn. Nó thực sự đi theo quy ước theo nhóm. –

+0

Tôi thấy trường hợp đầu tiên dễ đọc hơn. Có lẽ sự đối xứng thị giác sẽ giúp. –

+0

Nó phụ thuộc. Nếu chúng ta đang nói về lối ra sớm, thì dạng thứ hai là tốt hơn; nếu hai trường hợp có tầm quan trọng tương tự, thì tôi sẽ đi cho mẫu đầu tiên. –

0

Sử dụng một mảng khi bạn muốn hành vi thiết lập. Bạn cần phải kiểm tra mọi thứ để đảm bảo rằng nó không nằm trong mảng trước khi bạn chèn nó, điều này làm cho mã của bạn dài hơn và chậm hơn.

4

Mã dự phòng không phải là lỗi. Nhưng nếu bạn thực sự cố gắng lưu mọi ký tự

return (condition); 

cũng thừa. Bạn có thể viết:

return condition; 
2

Sợ null (điều này cũng có thể dẫn đến những vấn đề nghiêm trọng):

if (name != null) 
    person.Name = name; 

Redundant nếu nhân (không sử dụng khác):

kiểm tra
if (!IsPostback) 
{ 
    // do something 
} 
if (IsPostback) 
{ 
    // do something else 
} 

Redundant (Split không bao giờ trả về null):

string[] words = sentence.Split(' '); 
if (words != null) 

Thông tin thêm về kiểm tra (kiểm tra thứ hai là không cần thiết nếu bạn đang đi để lặp)

if (myArray != null && myArray.Length > 0) 
    foreach (string s in myArray) 

Và yêu thích của tôi cho ASP.NET: rải rác DataBind s trên tất cả các mã để làm cho trang render.

2

Sao chép dán dự phòng:

if (x > 0) 
{ 
    // a lot of code to calculate z 
    y = x + z; 
} 
else 
{ 
    // a lot of code to calculate z 
    y = x - z; 
} 

thay vì

if (x > 0) 
    y = x + CalcZ(x); 
else 
    y = x - CalcZ(x); 

hoặc thậm chí tốt hơn (hoặc khó hiểu hơn)

y = x + (x > 0 ? 1 : -1) * CalcZ(x) 
2

Phân bổ các yếu tố trên heap thay vì ngăn xếp.

{ 
    char buff = malloc(1024); 
    /* ... */ 
    free(buff); 
} 

thay vì

{ 
    char buff[1024]; 
    /* ... */ 
} 

hoặc

{  
    struct foo *x = (struct foo *)malloc(sizeof(struct foo)); 
    x->a = ...; 
    bar(x); 
    free(x); 
} 

thay vì

{ 
    struct foo x; 
    x.a = ...; 
    bar(&x); 
} 
+0

Điều này chỉ hợp lệ trong những trường hợp đó, khi bạn biết chính xác bộ đệm phải lớn đến mức nào. Tôi cũng đã có vấn đề trên một số bản phân phối Linux - họ chỉ đơn giản là sẽ từ chối cho tôi một bộ đệm của 4k byte. – Paulius

+0

Tất nhiên! Tôi đang nói về những trường hợp malloc dành cho một bộ nhớ có kích thước cố định. –

1

Từ nhận xét mã cơn ác mộng .....

char s[100]; 

Tiếp theo

memset(s,0,100); 

Tiếp theo

s[strlen(s)] = 0; 

với rất nhiều khó chịu

if (strcmp(s, "1") == 0) 

rải rác về mã.

0

Redundant ToString() lời gọi:

const int foo = 5; 
Console.WriteLine("Number of Items: " + foo.ToString()); 

không cần thiết chuỗi định dạng:

const int foo = 5; 
Console.WriteLine("Number of Items: {0}", foo); 
2

Phổ biến nhất dự phòng đang xây dựng tôi thấy là mã mà không bao giờ được gọi từ bất cứ nơi nào trong chương trình.

Khác là các mẫu thiết kế được sử dụng khi không có điểm trong việc sử dụng chúng. Ví dụ, viết "new BobFactory(). CreateBob()" ở khắp mọi nơi, thay vì chỉ viết "new Bob()".

Xóa mã không sử dụng và không cần thiết có thể cải thiện đáng kể chất lượng của hệ thống và khả năng duy trì của hệ thống. Những lợi ích thường gây sửng sốt cho các nhóm chưa bao giờ xem xét xóa mã không cần thiết khỏi hệ thống của họ. Tôi đã từng thực hiện đánh giá mã bằng cách ngồi với một nhóm và xóa hơn một nửa mã trong dự án của họ mà không thay đổi chức năng của hệ thống của họ. Tôi nghĩ họ sẽ bị xúc phạm nhưng họ thường hỏi tôi về lời khuyên thiết kế và phản hồi sau đó.

+0

+1 cho các nhà máy dư thừa –

+1

Đồng ý về các nhà máy dự phòng. Rõ ràng, vấn đề với họ là phải mất quá nhiều đánh máy để viết chúng. Vì vậy, tôi đã tạo một phiên bản chung: http://gist.github.com/629145 –