Kiếm một khoản lớn từ == đúng không?


105

Có một đồng nghiệp của tôi liên tục viết:

if (someBool == true)

Nó đẩy tôi lên tường! Tôi nên làm cho một vấn đề lớn của nó hoặc chỉ cần bỏ nó?


12
Tôi thích rõ ràng if (some_flag == true)nhưng ẩn if (is_something)hoặc if (has_something). Lưu ý tên biến.
dòng chảy

69
Nhắc nhở đồng nghiệp của bạn rằng loại someBool == truecũng là boolean, do đó, theo logic tương tự nó nên được if ((someBool == true) == true).
Mike Seymour

2
@GSto: Tôi cho rằng bạn biết điều đó, nhưng trong PHP bạn có thể làm điều đó để "truyền" bất cứ thứ gì vào một bool và có thể thực sự hữu ích.
zneak

2
@zneak Hoặc bạn có thể rõ ràng hơn và sử dụng $var = (bool) some_expression. Và trong hầu hết các trường hợp, điều đó thậm chí sẽ không quan trọng vì PHP sẽ thực hiện các chuyển đổi cần thiết một cách linh hoạt.
waiwai933

4
luôn luôn kiểm tra hằng số trước, nếu (true == someBool), trong trường hợp bạn vô tình gõ = thay vì == [vâng tôi đang đùa!]
Steven A. Lowe

Câu trả lời:


126

Đó chỉ là mã thừa, không phải là sống hay chết. Tuy nhiên....

Nếu nó xảy ra nhiều, nó có thể là một vấn đề với cách someBoolđược đặt tên. Một cái tên hay có thể đi một chặng đường dài hướng tới việc loại bỏ nhu cầu về==true

if(IsSomeCondition)

hoặc là

if(hasCondition)

hoặc là

if(somethingExists)

ví dụ.


Chiếc nhẫn này đúng với tôi nhất. Đó là tất cả về sự rõ ràng và nghệ thuật đặt tên, cú pháp ban đầu không phải là xấu nhưng đây là con đường đúng để mã tốt hơn.
TJB

2
Đánh tôi đi! Không có cách đặt tên thích hợp, sự tương đương ngắn gọn hơn không có ý nghĩa gì cả.
Troy Hunt

4
Tôi đã phải sử dụng someBool == truemã kế thừa nhiều lần cho rõ ràng. Nhưng nếu tôi viết từ đầu, tôi đặt tên cho biến đó và sử dụngif (isSomething)
nimcap

Tôi đồng ý, Mặc dù việc đặt tên sẽ giải quyết điều này, giả sử tên đó là someBool, nó có thể có nghĩa là bất kỳ loại nào (một số nguyên bằng với số lượng booleans trong một mảng có lẽ?). Booleans cần một số loại động từ tồn tại, hoặc chúng sẽ luôn khó đọc một mình.
Morgan Herlocker

Tôi đồng ý, đó là tất cả về khả năng đọc. Nếu các biến được đặt tên tốt, bạn không cần nó. Nếu biểu thức đọc tốt hơn với nó, tôi sẽ sử dụng "== true", cũng phù hợp nếu bạn sử dụng "== false" thay vì (xấu xí) "if (! ())".
Ronny Brendel

71

Khi tôi nhìn thấy someBool == true, tôi không thể không cảm thấy như lập trình viên chưa tiếp thu ý tưởng đánh giá , đây là một thiếu sót khá cơ bản.

Tuy nhiên, quan điểm của tôi bị sai lệch bởi vì tôi đã dành nhiều mùa hè trong chương trình giảng dạy đại học cho trẻ em, những người thường xuyên viết các biểu thức như thế này vì chúng thực sự không thành thạo bài tập tinh thần để đánh giá một biểu thức. Một khi họ mò mẫm khái niệm, sự dư thừa trở nên rõ ràng.

Đối với một lập trình viên chuyên nghiệp có thẩm quyền khác, điều này có lẽ không phải là trường hợp. Có lẽ đó chỉ là một thói quen xấu mà họ đã phát triển trong những ngày đầu lập trình và chưa bao giờ bị lung lay. Nhưng nó vẫn sẽ làm tôi sợ một chút nếu đó là điều đầu tiên tôi thấy ai đó làm trong một cuộc phỏng vấn.


Tôi sẽ không nhanh chóng biến điều này thành thói quen. Tôi đã nghe một số điều thực sự tuyệt vời từ miệng của các lập trình viên chuyên nghiệp. Thường được theo dõi ngay sau đó bởi một trong những người mò mẫm, "làm thế nào điều này bao giờ làm việc?"
dash-tom-bang

12
Đồng ý hết lòng về đánh giá. Thỉnh thoảng tôi tự hỏi, "Nó dừng ở đâu?" if ((((x == true) == true) == true)! = false) // và cứ thế ...
yawmark

1
Đôi khi tôi sẽ viết if (c == true) return true; else return false;, nhưng 99% thời gian (1% là có vì tôi không bao giờ có thể chắc chắn rằng mình đã không bỏ lỡ một số thứ) Tôi sẽ ngay lập tức thông báo và thay thế toàn bộ return c. Tôi hy vọng hầu hết các lập trình viên có năng lực sẽ làm điều gì đó tương tự nếu họ phát triển thói quen sớm trong sự nghiệp. Những gì tôi không mong đợi là một phản ứng wtf.
Lie Ryan

1
Oh boy, nghệ thuật suy nghĩ. Tôi thực sự đã bắt gặp điều này trong codebase của chúng tôi tuần trước. if (!someCondition) { someCondition = false; }Tôi đã thấy một số (er, nhiều) dư thừa cũng như một số điều không thể trong mã của chúng tôi, nhưng cái này rất đơn giản nhưng lại quá nặng nề khi nghĩ rằng ai đó thực sự đã viết nó. Nhiều lần, thậm chí.
Anthony Pegram

1
Chỉ cần lưu ý rằng tôi đã thấy một vài trường hợp if(x) x=true;KHÔNG dư thừa, mà là tương đương với x=!!x;(bình thường hóa x đến 0/1)
jkerian

58

Điều đó cũng khiến tôi phát điên, nhưng tôi muốn đề cập đến sự dư thừa cho họ theo cách xây dựng và sau đó bỏ nó ngay cả khi họ không đồng tình.

Ngoài ra, bạn có thể thử phương pháp này:
Bạn: Bạn có thể bắt đầu sử dụng quy ước mã sau để đánh giá Booleans không?

if (someBool==true)&&(true==true) {}

Họ: Tại sao chúng ta sẽ làm điều đó? Nửa sau của tuyên bố đó là dư thừa, nó sẽ luôn luôn đánh giá là đúng.

Bạn: Của George, bạn đúng. Tôi thật ngốc. Hãy đi với một phiên bản mà không có tất cả sự dư thừa sau đó. Làm thế nào về?

if (someBool) {}

6
Vâng, đồng ý. Điều đó thật ngớ ngẩn, nhưng bạn phải chọn chiến đấu của mình, và mã này thực sự đang làm những gì đồng nghiệp của bạn sẽ làm. Đề cập đến nó trong một câu không "Cái quái gì là SAU với bạn?!" loại cách, sau đó thả nó. Mặc dù nếu họ bắt đầu kéo những thứ nhảm nhí như "if (someBool! = True)" hoặc "if (! SomeBool == true)" hoặc những kết luận như vậy, đó có thể là một cuộc chiến đáng để chọn ....
BlairHippo

3
Làm thế nào (someBool == false) tồi tệ hơn nếu (someBool == true)?
FinnNk

5
true=truekhông biên dịch, bạn không thể gán cho true;-)
fredoverflow

1
Tôi đã quen if(somebool == false)hoặc !=, nhưng luôn chống lại sai và không đúng. Tôi thấy nó dư thừa, nhưng vì tiêu chuẩn mã hóa khăng khăng if()trông giống như một hàm gọi khoảng trắng giữa các parens giúp tôi đọc nó. Theo cách riêng của tôi, một bool là một bool, nhưng if (somePointer)không bay; Tôi thích if (somePointer != NULL)vì một con trỏ không phải là một bool.
dash-tom-bang

5
Đó là về khả năng đọc, không phải là vô lý hay (vi mô)
Ronny Brendel

45

Tôi nghĩ rằng, nếu một cái gì đó quá tầm thường là vấn đề lớn nhất của bạn với đồng nghiệp, bạn nên xem mình là người khá may mắn.


5
Chà, thật tốt để phấn đấu cho sự hoàn hảo nhưng chắc chắn có những con cá lớn hơn để chiên
TJB

3
Tôi nghĩ rằng bạn nói điều này về mọi vấn đề đáng để thảo luận.
Dave Van den Eynde

2
Nó có khả năng chỉ ra những vấn đề lớn hơn nhiều. Một vết nhỏ màu nâu trên trần nhà trong nhà để xe của bạn có vẻ không phải là vấn đề lớn, nhưng nó có thể có nghĩa là bạn bị rò rỉ nước lớn.
Josh

42

Bạn chắc chắn nên dừng thói quen xấu này. Dịu dàng...

Thật dễ dàng để quên viết hai dấu bằng, biến mã thành:

if (someBool = true)

Trong C # chẳng hạn, điều này sẽ chỉ tạo ra một cảnh báo, không phải là một lỗi. Vì vậy, trừ khi bạn coi các cảnh báo là lỗi, mã sẽ chạy, đặt biến thành đúng và luôn nhập điều kiện.


6
Đây không phải là một đối số có liên quan. Nếu bạn đang làm việc trong một ngôn ngữ như vậy, bạn có thể chuyển sự thật sang phía bên kia. Câu hỏi là về việc có bao gồm sự thật hay không.
Cam

8
@Cam: Thiếu điểm là bạn. Logic ngược tôi không gợi ý.
Guffa

15
@Cam - Anh ấy đang đưa ra một ví dụ thực tế khi điều này có thể là một vấn đề. Tôi sẽ nói điều này là khá liên quan.
ChaosPandion

1
@Guffa Cam nói rất đúng. Đây không phải là lý do để ngừng sử dụng == (anyType) trong khối if.
Ronny Brendel

2
@Ronny: Không, điều đó không thể xảy ra với bất kỳ loại nào (trừ khi ngôn ngữ thực sự cho phép bất kỳ loại nào là điều kiện). Câu lệnh if (answer = 42) {}đơn giản là không biên dịch vì biểu thức không phải là bool.
Guffa

21

Tôi đồng ý với bạn, nhưng tôi sẽ đóng vai người ủng hộ quỷ dữ ở đây:


Tùy thuộc vào ngôn ngữ và tên của biến, x == true là phù hợp:

Xem xét tình huống sau đây trong một ngôn ngữ với kiểu gõ tĩnh và kiểu ép buộc đối với các kiểu tích phân:

if (actionsAllowed){
    //do actions, since they are allowed
    //...
}

Ai đó đọc phần mã này có thể không nhận ra ngay lập tức rằng các hành động ALLowed là một biến boolean - nó cũng có thể là một số nguyên, đại diện cho số lượng hành động được phép. Vì vậy, bằng cách thêm == true, rõ ràng x là một boolean và không phải là một số nguyên bị ép buộc thành boolean:

if (actionsAllowed == true){
    //do actions, since they are allowed
    //...
}

13
khả năng đọc == GoodThing
Muad'Dib

5
if ((khả năng đọc == GoodThing) == true) ...
JoelFan

1
bool isoodThing = readability? true: (mã hóaSt Chuẩns? true: (InternalizationOfConcept? true: false));
johnc

17
Vì vậy, đổi tên các biến actionsAreAllowed.
Graeme Perrow

9
Bằng cách viết, if (x) { ...bạn đã khẳng định rằng đó xlà boolean hoặc có thể chuyển đổi thành boolean. Những gì bạn gọi nó là không liên quan.
Daniel Earwicker

15

Những gì về bool nullable?

bool? MyFlag = null;

if (MyFlag == true)
    ;  

if (MyFlag)  // error, doesn't compile!
    ; 

if (MyFlag.Value)
johnc

1
Không phải tất cả các ngôn ngữ đều có các giá trị nullable và nhiều ngôn ngữ sẽ chấp nhận cấu trúc thứ hai của bạn.
zneak

1
@johnc: "if (MyFlag.Value)" có thể không thực sự làm những gì bạn muốn vì nó có thể đưa ra một ngoại lệ nếu MyFlag là null (bạn có thể kiểm tra bằng cách kiểm tra MyFlag.HasValue).
Ludovic Chabant

4
Đây là peeve thú cưng của tôi với các bool nullable :)
Jarrod Dixon

3
bool? isValid = null; if (isValid ?? false);
skolima

11

Thông thường, bạn không muốn thực hiện một thỏa thuận lớn về các quy ước mã hóa trừ khi quy ước nói bằng cách nào đó cản trở dự án theo một cách quan trọng. Tôi đã thấy nhiều cuộc tranh cãi nảy lửa leo thang trên những thứ nhỏ như vùng mã và dấu gạch dưới hàng đầu.

Điều đó đang được nói, tôi thấy không có vấn đề với việc thêm == truevào một tuyên bố có điều kiện. Như một vấn đề thực tế, tôi có thói quen sử dụng == falsetrái ngược với một dấu chấm than hàng đầu khi kiểm tra các điều kiện tiêu cực. Tôi nghĩ nó dễ đọc hơn.

Nếu có một quy ước được thiết lập, tôi nói hãy tuân theo nó trừ khi có lý do để thay đổi. Tuy nhiên, nó không thực sự đáng để gây ra một mùi hôi thối lớn.


1
Tùy thuộc vào ngôn ngữ của bạn, someValue có thể không nhất thiết phải tương đương với true ngay cả khi nó đánh giá là đúng. Chẳng hạn, (9 == True)đánh giá thành false trong Python và tôi sẽ tưởng tượng tương tự trong C ++.
dash-tom-bang

mã vùng và dấu gạch dưới hàng đầu làm cho tôi muốn đấm vào mặt mọi người.
MGOwen

11

Ack. Tôi là người đó. Sự xấu hổ, xấu hổ. Đó là cách tôi học và đó là cách tôi "tự động định dạng" trong đầu. Lần duy nhất tôi sử dụng cú pháp ưa thích của Joel là khi biến bool có tiền tố động từ như "is." Tôi cần động từ, là "là", "có thể", "đã làm" hoặc nếu không tôi cần == để cung cấp động từ "bằng". Tôi có thể không bao giờ bỏ thói quen đó, vì vậy tôi sẽ hiểu nếu bạn không nói 'xin chào' với tôi trên đường phố.


7
Nó không phải là một điều xấu. Mã đọc như văn bản thực sự tốt hơn nhiều so với foo ngầm. Giữ thói quen đó để dễ đọc.
Ronny Brendel

11

nhắc nhở tôi về "mã điên boolean", nó giống như thế này

if(someBool == true)
   otherBool = false;
else
   otherBool = true

Thay vì:

 otherBool = !someBool

Điều đó thật buồn cười, tôi đã phải duy trì một hệ thống có những người xả rác khắp nơi. Nó làm tôi phát điên.
Tjaart

8

Cá nhân, tôi không thích cách nói "không" trong các ngôn ngữ dựa trên C. Dấu chấm than nhỏ đó là quá dễ dàng để bỏ qua.

Do đó tôi viết nó ra đầy đủ:

if (someCondition == false) {

Sau khi đọc nó một lúc, tôi cũng muốn đối xứng với

if (someCondition == true) {

Vì vậy, coi nó là một tạo tác của C sử dụng !thay vì not.


3
C ++ thực sự những notnhà điều hành, và do đó, C (một khi bạn bao gồm tiêu đề chuẩn <iso646.h>). Nếu bạn không muốn (hoặc không thể) sử dụng tiêu đề này (hoặc nếu bạn bị mắc kẹt với Java hoặc C #), tôi khuyên bạn nên đặt khoảng trắng sau dấu chấm than : if (! condition). Điều này làm cho nó dễ thấy hơn.
Konrad Rudolph

1
Tôi làm Java. notkhông phải là một sự lựa chọn.

6

Nó phụ thuộc vào ngôn ngữ, nhưng nó thường là một ý tưởng tồi ...

Trong C, không bao giờ làm điều này. Thật quá dễ dàng để tìm thấy một tình huống trong đó giá trị bạn đang kiểm tra không sai (khác không), nhưng cũng không bằng giá trị đơn được xác định là "đúng".

Trong Ruby, chỉ làm điều này nếu bạn hoàn toàn chắc chắn rằng bạn muốn thất bại với mọi thứ trừ Boolean true.

Trong C ++ và các ngôn ngữ tĩnh khác có kiểu bool, nó dư thừa và có thể dẫn đến lỗi lập trình khi bạn gõ sai =thay vì ==hoặc lỗi quảng cáo như được đề cập trong các nhận xét.


Trên thực tế, trong các ngôn ngữ mà toán tử gán gán trả về một giá trị ... như C ++ ... if (b == true) {không chỉ là dư thừa. Nó cũng là một chút mạo hiểm, bởi vì bạn có thể vô tình được gán truecho b.
Stephen C

4
Nó không chỉ dư thừa trong C ++, nó nguy hiểm. Nếu bạn viết if (b == true)bkhông phải là một bool, các chuyển đổi loại đi sai hướng. A boollà một loại tích phân thường được thăng cấp thành một loại tích phân thích hợp có giá trị 1. Nếu bạn viết, giả sử, int b(2); if (b == true)sau đó truetrở thành một intgiá trị 1 cho mục đích so sánh, thay vì bbị ép buộc thành loại bool, sẽ cho kết quả đúng.
David Thornley

@DavidThornley, bật cảnh báo trong trình biên dịch của bạn. Xử lý các cảnh báo là lỗi là kỹ thuật lập trình phòng thủ tốt hơn là tránh ==.
Abyx

5

Bạn nghĩ đó là xấu? Làm thế nào về:

if(someCondition) {
  return true;
} else {
  return false;
}

2
Cậu bé đã thấy điều này bao nhiêu lần rồi. Điều này làm cho một trường hợp tốt cho một công cụ như ReSharper.
Công việc

Có - nếu bạn thuê clods, thì hãy mua ReSharper.
Kirk Broadhurst

4

tôi thích

if (bVal)

hoặc là

if (!bVal)

cũng vậy, nhưng tôi sợ rằng việc đưa nó lên sẽ khiến mọi người khó chịu, vì vậy lời khuyên của tôi là hãy quên nó đi. Lấy làm tiếc!


4
Đối với tình yêu của tất cả những gì là thánh, miễn là nó không if (!bNotVal) hoặc if (bNotVal)ngay cả ở nơi đầu tiên. Ugh phủ định trong tên làm cho mọi thứ khó đọc hơn.
dash-tom-bang

2
Tôi biết một nhà phát triển sẽ bool isNotConnected; if (isNotConnected == true) ... yuck
johnc

4

bạn nên nói với anh ta rằng anh ta đang làm sai.

nó là

if (true == someBool) {

}

nếu anh ta quên một người = anh ta đang gặp rắc rối lớn trong phong cách viết của mình.


3

Làm thế nào về

if (x == "true")

TẠI SAO ĐÓ LÀ MỘT CHIẾN LƯỢC?!


Tôi đang làm việc với một số mã php kế thừa và đôi khi tôi tìm thấy một cái gì đó như if(preg_match('/title/', implode($_POST))){. PHP, đủ nói, tôi cần tìm một công việc tốt hơn.
Keyo

4
vâng, tôi cũng thấy nếu (x == "1"), nhưng điều đó thường làm với thiết kế db kém.
suy ra

Tôi đã sử dụng các cấu trúc tương tự khi xđến từ đầu vào của người dùng (ví dụ: tệp cấu hình hoặc dịch vụ web). Tuy nhiên, tôi thường cho phép các giá trị trish khác, vì vậy nó kết thúc giống nhưif x.lower().strip() in ["true", "yes", "on", "1"]
eswald

3

Trên thực tế, nếu nó là null, việc kiểm tra x == true sẽ là cần thiết. :)


3

Tôi viết mã như thế!

Đây là lý do tại sao:

"if bla == true" đọc như một câu, trong đó "if bla" không có trong nhiều trường hợp. Nó chỉ nghe sai, khi đọc mã thực tế.

Ngoài ra trình biên dịch cảnh báo về các bài tập trong các khối if, vì vậy thực sự không có nguy hiểm khi sử dụng == true. (nhầm lẫn với =)

Ngoài ra, những người không viết "== true", sử dụng "! ()" Cho "== false"? Tôi thấy nó thực sự xấu xí. Và nếu bạn sử dụng "== false", thì cũng chỉ nhất quán sử dụng "== true", thay vì có hai cách khác nhau để xác minh sự thật.


3
Bạn nói "nếu bla" không đọc như một câu ... điều đó có nghĩa là biến của bạn không được đặt tên đúng ... điều này có gì sai: if (userHasRights) doS Something ()
JoelFan

"trong nhiều trường hợp". Vâng, bạn đúng. Đổi tên là tốt, quá. Với "if (QWidget :: acceptDrops () == true)", bạn không có khả năng đổi tên. có lẽ sẽ rất tốt nếu đặt tên cho nó làAcceptDrops () ... Thật quá rắc rối (và không thể thống nhất khi sử dụng quy tắc bỏ sót đó trong bất kỳ API nào), do đó, nhất quán với "== anything" -ifs khác, Tôi thực sự khuyên bạn không nên bỏ qua nó, vì vậy nó không "trông" khác, do đó có vẻ phù hợp.
Ronny Brendel

3

Hãy nhớ rằng bạn đang làm việc như là một phần của một nhóm, vì vậy bạn cần phải làm việc cùng nhau. "Chơi đẹp với người khác" vẫn là một đặc điểm tính cách quan trọng ngay cả sau khi học tiểu học :)


2

Nói chung sẽ bỏ qua '== true', nhưng hầu như không đáng để thảo luận về nó trừ khi bạn đưa nó vào tiêu chuẩn mã hóa của nhóm.


3
Ngoài ra, nếu nó nằm trong các tiêu chuẩn mã hóa của nhóm, bạn thực sự cần phải đánh giá lại các tiêu chuẩn để loại bỏ những thứ lặt vặt như thế này.
JohnFx

Đã đồng ý! Chỉ trong trường hợp ...
FinnNk

2

Mặc dù tôi đồng ý với tư cách là nhà phát triển chủ yếu của C #, tôi không thể nói điều này luôn đúng như vậy. Chẳng hạn, trong Javascript, === sẽ thực hiện kiểu kết hợp. Vậy giả sử var x = 3 thì:

if(x) --> true

trong khi

if (x === true) --> false

Tôi đoán điều đó khác với == kể cả trong JS tôi sẽ không sử dụng if (x == true) mà chỉ là thứ để suy nghĩ.

Kiểu này chạm vào một điểm khác mặc dù đã xuất hiện trong văn phòng của tôi:

bool b = false;

Trong C #, bool b; sẽ là đủ và sẽ vô hiệu hóa b thành sai . Tuy nhiên, rõ ràng hơn là viết dòng trên và dù sao cũng nên được trình biên dịch tách ra trong quá trình tối ưu hóa.

Vì vậy, tôi đoán quan điểm của tôi là nó không phải lúc nào cũng rõ ràng và không phải là thông lệ tốt và rất nhiều trong số đó tập trung vào sở thích cũng như các tính năng / vấn đề ngôn ngữ.


bool b;chỉ khởi tạo thành false khi blà một trường. Bạn phải khởi tạo các biến cục bộ một cách rõ ràng.
Matthew Flaschen

+1 đồng ý. Vấn đề tương tự của nó với các ngôn ngữ (scripting) khác là tốt. Bạn phải rõ ràng nếu bạn muốn kiểm tra boolean truehoặc chỉ "đúng". Ví dụ, bất kỳ chuỗi không trống nào được xem xét == truenhưng không có === truetrong một số ngôn ngữ.
Martin Wickman

2

À đúng, nhưng nếu biến là nullable thì sao? (bool?)

Một số ngôn ngữ (C #) sẽ yêu cầu và bỏ hoặc so sánh với 'true'.

bool? isAccepted = true;

if((bool)isAccepted)
{...}

if(isAccepted == true)
{...}

2

Người trẻ biết các quy tắc, nhưng người già biết các ngoại lệ;)

Mới nhất C#, nếu bạn đang giao dịch với a null-able bool, thì bạn phải:

bool? x = null;
bool? y = true;
bool? z = false;
if (x == true || y == true || z == true) {
    // That was the only way that is reasonably readable that I know of
    // to accomplish this expression.
}

Nếu tristate không phải là vấn đề, thì thường không nên có lý do để so sánh một cái gì đó với true/ True. Tuy nhiên, trong Pythonvà một số ngôn ngữ khác như C/C++bạn có thể thực hiện một ifbiểu thức không phải là bool. Các ngôn ngữ này có các quy tắc duy nhất để diễn giải các số nguyên, con trỏ, danh sách, v.v ... là đúng hoặc sai. Đôi khi bạn không muốn điều đó. Ví dụ: trong đoạn mã Python này:

x = True
y = 'abcdef'
z1 = x and y
z2 = (x == True) and (y == True)

Ở đây znên True, nhưng z2nên được False. Bây giờ, một Clojurengôn ngữ tiếp cận điều này theo một cách khác - có andchức năng không nhất thiết phải đánh giá theo một bool, nhưng ifcó thể xử lý điều đó.

Bất kể ngôn ngữ, bất cứ khi nào bạn thấy mình so sánh một cái gì đó với Truehoặc False, nó có thể là giá trị nhận xét.


Vấn đề đầu tiên bắt nguồn từ một IMO tiền đề sai bằng cách sử dụng tên biến khủng khiếp. Giả sử x, y, z được đặt tên notExceptButHasX, exceptNotButIsntY, doNotUnlessIsExceptZ? Làm thế nào mà làm cho dễ đọc trong vấn đề của bạn? Nếu x, y, z được đặt tên là "isEnables", "isEffective", "hasProperty", thì câu lệnh của bạn trở nên isEnabled || isEffective || hasPropertydễ đọc hơn nhiều so với so với truehoặc false.
Thomas

1

Mã hóa như vậy cũng đã cọ xát tôi sai cách trước đây. Mặc dù số nhận dạng ví dụ của bạn được đặt tên là "someBool", việc sử dụng kiểu mã hóa đó vô tình vào một biến không được đảm bảo là một boolean có thể có hành vi ngoài ý muốn. Nếu giá trị của "someBool" không chính xác là "đúng" hoặc "sai", kết quả sẽ là sai.

Tôi đã gặp một lỗi rất tinh vi trong năm vừa qua gây ra bởi một phong cách mã hóa như vậy rất khó xác định bởi vì đôi mắt của họ phủ lên những cấu trúc như vậy. Bạn sẽ nghĩ, "Làm thế nào nó có thể sai?" Điều tương tự cũng đúng đối với các biểu thức được hiểu rõ như "(var)" hoặc "(! Var)", rằng bạn đọc hoặc mã chúng mà không cần xác minh hành vi của chúng.

Vì vậy, tôi đã giới thiệu một vài tiêu chuẩn mã hóa để giảm sự tồn tại của các lỗi như vậy trong cơ sở mã và khả năng các lỗi tinh vi như vậy sẽ vô tình xuất hiện trong tương lai.

  1. Tất cả các biểu thức phải được ngoặc đơn theo ý định của họ.
  2. Tất cả các bài kiểm tra boolean phải được thể hiện bằng cách phủ định, như "suchBool! = False".

Bằng cách dọn sạch mã không tuân theo kiểu mới, tôi đã xác định và sửa một vài trường hợp lỗi tinh vi như vậy.


1
Có một sốBool có thể là một cái gì đó khác với TRUE / FALSE là thực hành mã hóa xấu.
Tấn

@AttackingHobo, đó là một trong những cạm bẫy của việc không có các kiểu boolean trong ngôn ngữ và / hoặc không sử dụng một lớp để cung cấp hành vi chính xác mong muốn.
Huperniketes

1

Phải sử dụng điều này mọi lúc trong ActionScript 2 (phải thừa nhận là ngôn ngữ chết), bởi vì:

var something:Boolean = org.black.box.unknown.ThisMightNotExistYet();

// this is slightly ambiguous
if(something)
{
}

// because if you allow undefined you might actually mean
if(false != something)
{
}

// which can mean something different than
if(true == something)
{
}

// and comparing against what you actually MEAN is less script than
if(undefined != value && value)
{
}

Vì vậy, nó hầu như luôn luôn là tốt nhất để được cụ thể.


1

Tôi đồng ý. Đây là một công trình dự phòng, đặc biệt là các ngôn ngữ được đánh máy mạnh.

Để thêm một sự lạm dụng khác của booleans, tôi đã tìm thấy kiểu xây dựng này rất nhiều lần trong Javascript, (đặc biệt tại một số hàm quái vật giống như spaghetti, như trong hơn 100 dòng):

//create the variable, not initializing it
var flag;
//...
//assing a value to the var, by the example 
flag=$("mycheckbox").selected;
//...

//and at the moment of use it:
if(flag!=true) {
   //code to execute when the checkbox is unchecked
}

Dường như, do thiếu một định nghĩa loại nghiêm ngặt trong ngôn ngữ này, một số lập trình viên không muốn phải loay hoay với các false|undefinedgiá trị.


1

Tôi có một đồng nghiệp sẽ có một số mã như thế này:

if(something == true)

Và sau đó, đối với một số loại thử nghiệm / gỡ lỗi, anh ta sẽ không muốn gọi khối này để anh ta đổi nó thành:

if(something == true && false)

Và rồi thỉnh thoảng anh sẽ đổi nó thành:

if(false)

Điều tồi tệ nhất là, loại gỡ lỗi này đôi khi đã làm tôi thất vọng và thực sự rất tệ cho các nhà phát triển khác đọc!


0

Tôi muốn nói tính nhất quán là vua trong một cơ sở mã. Vì vậy, bạn nên sử dụng phong cách, chủ yếu được sử dụng trong tổ chức của bạn. Cố gắng làm cho phong cách ưa thích của bạn là một phần của hướng dẫn mã hóa công ty chính thức. Nếu nó đã có trong hướng dẫn, chỉ cần làm theo nó.

(Điều đó đã được nói, nó cũng sẽ thực sự làm tôi khó chịu - nhưng có lẽ không đủ để tạo ra một vấn đề lớn từ nó).


0

Tôi không thích đặt thêm == true, nhưng đôi khi tôi vô tình đưa nó vào và không để ý đến nó. Người có thể không chú ý và vô tình đặt chúng. Tôi đọc lại mã của mình và đôi khi nhận thấy rằng tôi đã đặt thêm == true để tôi xóa mã đó == true. Đôi khi tôi không nhận thấy điều đó và vui vẻ chào đón ai đó nói với tôi rằng tôi đã đặt nó một cách dư thừa.


0

làm thế nào về:

int j = 1;
for (int i=1; i>=j; i++) ...

Đúng, tôi đã nhìn thấy nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.