it-swarm-vi.com

Không "nếu (0 == giá trị) ..." gây hại nhiều hơn lợi?

Đây là một trong những điều mà tôi ghét nhất khi tôi thấy nó trong mã của người khác. Tôi biết ý nghĩa của nó và tại sao một số người làm theo cách này ("nếu tôi vô tình đặt '=' thì sao?"). Đối với tôi nó rất giống như khi một đứa trẻ đi xuống cầu thang đếm những bước chân thành tiếng.

Dù sao, đây là những lập luận của tôi chống lại nó:

  • Nó phá vỡ dòng chảy tự nhiên của việc đọc mã chương trình. Chúng ta, con người, nói "nếu giá trị bằng 0" chứ không phải "nếu không là giá trị".
  • Trình biên dịch hiện đại cảnh báo bạn khi bạn có một bài tập trong điều kiện của bạn, hoặc thực sự nếu điều kiện của bạn chỉ bao gồm bài tập đó, mà, vâng, trông có vẻ đáng ngờ
  • Bạn không nên quên đặt double '=' khi bạn so sánh các giá trị nếu bạn là lập trình viên. Bạn cũng có thể quên đặt "!" khi kiểm tra không bình đẳng.
50
mojuba

À, vâng, "Yoda có điều kiện" ("Nếu không có giá trị là, hãy thực thi mã này!"). Tôi luôn chỉ ra bất cứ ai tuyên bố rằng họ "tốt hơn" tại các công cụ như lint (1). Vấn đề đặc biệt này đã được giải quyết từ cuối những năm 70. Hầu hết các ngôn ngữ hiện đại thậm chí sẽ không biên dịch một biểu thức như if(x = 10), vì chúng từ chối ép buộc kết quả của việc gán cho boolean.

Như những người khác đã nói, nó chắc chắn không phải là một vấn đề, nhưng nó gây ra một chút bất đồng về nhận thức.

59
TMN

Thật đáng ghét vì nó đánh thuế tinh thần nhỏ, nhưng đáng chú ý.

Mọi người đọc từ trái sang phải trong hầu hết tất cả các ngôn ngữ lập trình (và hầu hết các ngôn ngữ tự nhiên).

Nếu tôi thấy 123 == x, Cách tôi phân tích cú pháp đó là:

  • 123 - vậy thì sao? thông tin không đầy đủ.
  • == - tốt, 123 là 123, tại sao phải kiểm tra ...
  • x - ok, vậy đó là điều chúng tôi quan tâm. Chỉ bây giờ tôi có bối cảnh.
  • Quay trở lại xem xét lại 123 Và tại sao x được so sánh với nó.

Khi tôi thấy x == 123 Phân tích cú pháp tinh thần là:

  • x - Cung cấp ngữ cảnh, tôi biết điều kiện đó là gì. Tôi có thể chọn bỏ qua phần còn lại. Dựa trên dòng chảy trước đó, tôi có một ý tưởng tốt tại sao và điều gì sẽ đến (và ngạc nhiên nếu nó khác).
  • == - Tôi cũng nghĩ vậy.
  • 123 - Yup.

Sự gián đoạn là nhỏ (trong một ví dụ đơn giản), nhưng tôi luôn luôn chú ý đến nó.

Đặt giá trị lên trước có thể là một ý tưởng hay nếu bạn muốn để thu hút sự chú ý đến nó, ví dụ: if (LAUNCH_NUKES == cmd). Thông thường đây không phải là ý định.

56
dbkk

Có hại không? Không. Nó hoạt động một trong hai cách.

Thực hành xấu? Tranh cãi, tốt nhất. Đó là chương trình phòng thủ đơn giản.

Đáng để mất ngủ hơn? Không.

47
Wonko the Sane

Điều này về cơ bản là flaimbait.

Không, nó không gây hại nhiều hơn là tốt. Đơn giản.

Thêm nhiều từ ngữ?

Trình biên dịch đối số? Erm, ish, có lẽ - đừng đặt quá nhiều niềm tin vào người khen để cứu bạn khỏi chính bạn.

"Bạn không nên quên" - à duh - dĩ nhiên là bạn không nên mệt mỏi, tôi đã viết mã cả ngày tôi phải sử dụng hai ngôn ngữ khác nhau và đôi khi, chỉ đôi khi, là con người tôi phạm sai lầm.

Điểm quan trọng của loại hành vi này là sự phòng thủ của nó, nó không có ở đó bởi vì bạn dự kiến ​​sẽ phạm sai lầm nhiều hơn bạn có bảo hiểm vì bạn sẽ gặp sự cố ... nhưng nếu bạn thực hiện thì nó sẽ được bảo vệ.

Khó để đọc? Bạn đang phàn nàn rằng một lập trình viên đàng hoàng nên có == hardwired (điều này làm cho tất cả các loại giả định kém) nhưng rằng lập trình viên tương tự cũng không thể đọc 0 == value ??

Không có hại, có lợi ích tiềm năng, câu hỏi ngớ ngẩn, hãy để người khác làm điều đó nếu họ muốn và tiếp tục.

17
Murph

Tôi sẽ không gọi nó là có hại, nhưng nó đáng ghét. Vì vậy, không tôi sẽ không nói nó làm.

11
whatsisname

Tôi chưa bao giờ cảm thấy rằng toàn bộ 'nếu tôi quên a =?' bao giờ thực sự giữ trọng lượng nhiều. Vâng, bạn có thể mắc lỗi đánh máy, nhưng tất cả chúng ta đều mắc lỗi chính tả, có vẻ ngớ ngẩn khi thay đổi toàn bộ phong cách mã hóa của bạn vì bạn sợ mắc lỗi. Tại sao không làm cho tất cả các biến và hàm của bạn đều viết thường mà không có dấu chấm câu, bởi vì bạn có thể quên viết hoa một cái gì đó hoặc quên một dấu gạch dưới một ngày?

10
GSto

Một số người sử dụng nó để làm cho nó rõ ràng chính xác những gì một điều kiện đang làm. Ví dụ:

Cách 1:

FILE *fp;

fp = fopen("foo.txt", "w+");
if (fp == NULL) {

Cách 2:

FILE *fp;

if (NULL == (fp = fopen("foo.txt", "w+"))) {

Một số người cảm thấy rằng ví dụ thứ hai ngắn gọn hơn, hoặc các đối số đảo ngược minh họa điểm của một bài kiểm tra (có điều kiện) trước khi thử nghiệm.

Trong thực tế, tôi cũng không thực sự bận tâm. Tôi có thú cưng của tôi về phong cách và cái lớn nhất là sự không nhất quán. Vì vậy, hãy làm theo cách tương tự, nhất quán và tôi sẽ không đọc mã của bạn.

Trộn nó đến mức trông giống như sáu người khác nhau với phong cách đặc biệt của riêng họ làm việc cùng một lúc, tôi cảm thấy hơi khó chịu.

9
Tim Post

Đối với tôi, đó là điều hòa đơn giản. Là một người đã học (vào những năm 90) C và C++, tôi đã quen với nó và vẫn sử dụng nó, mặc dù các lý do đã được giảm bớt.

Một khi bạn "có điều kiện" để nhìn vào phía bên trái cho "hằng số", nó trở thành bản chất thứ hai.

Tôi cũng chỉ sử dụng nó cho tương đương (hoặc tương đương phủ định), không phải cho lớn hơn/ít hơn.

Tôi hoàn toàn đồng ý với câu trả lời của @ Wonko.

6
DevSolo

Một trường hợp mà tôi thấy nó hữu ích là trong đó phần biến của if khá dài và việc nhìn thấy các giá trị làm cho mã dễ đọc hơn. Các ngôn ngữ không gian tên rải rác có các ví dụ tốt nhất về điều này.

Ví dụ, một cái gì đó tôi đã làm việc với đăng nhập một lần có một tình huống mà bạn có thể có hai phiên đồng thời nếu một loại lỗi nhất định xảy ra và được phục hồi theo một cách nhất định vì vậy tôi phải thêm một trình xử lý cho nó bên trong nếu nó trông như thế đại loại như thế này:

if (2 <= application.httpcontext.current.session["thenameofmysessiontoken"].items.count())

Phải thừa nhận trong ví dụ này có những cách khác để làm điều này, nhưng đây sẽ là trường hợp phiên bản số đầu tiên có khả năng dễ đọc hơn.

5
Bill

Nhưng các lỗi xảy ra. Và đôi khi bạn muốn một bài tập trong một toán tử vòng lặp trong đó bạn có thể kiểm tra sự bằng nhau, hoặc ít nhất đó là cách thực hành tiêu chuẩn để sử dụng nó.

Tôi giữ với nó phần nào. Lời khuyên mà tôi đã làm theo (có thể từ Code Complete) là giữ những gì nên là giá trị thấp hơn ở bên trái trong các so sánh. Tôi đã thảo luận điều này với một đồng nghiệp trước đó và anh ấy nghĩ nó thật điên rồ nhưng tôi đã quen với nó.

Vì vậy, tôi sẽ nói:

if ( 0 <= value )

Nhưng tôi cũng sẽ nói:

if ( value <= 100 )

Bình đẳng Tôi sẽ có xu hướng kiểm tra với biến ở bên trái, nó chỉ dễ đọc hơn.

3
glenatron