ทำให้เป็นเรื่องใหญ่ == จริงหรือ


105

มีเพื่อนร่วมงานของฉันที่เขียนอยู่ตลอดเวลา:

if (someBool == true)

มันทำให้ฉันติดกำแพง! ฉันควรทำเรื่องใหญ่หรือทำหล่น?


12
ฉันชอบอย่างชัดเจนif (some_flag == true)แต่โดยนัยหรือif (is_something) if (has_something)บันทึกชื่อตัวแปร
fredoverflow

69
เตือนเพื่อนร่วมงานของคุณว่าประเภทของยังเป็นแบบบูลดังนั้นโดยตรรกะเดียวกันที่ควรจะเป็นsomeBool == true if ((someBool == true) == true)
Mike Seymour

2
@ GSto: ฉันคิดว่าคุณรู้ แต่ใน PHP คุณสามารถทำเช่นนั้นเพื่อ "โยน" อะไรก็ได้กับบูลและมีประโยชน์จริง ๆ
zneak

2
@zneak $var = (bool) some_expressionหรือคุณอาจจะชัดเจนและการใช้งาน และในกรณีส่วนใหญ่มันไม่สำคัญว่า PHP จะทำการแปลงที่จำเป็นแบบไดนามิก
waiwai933

4
ตรวจสอบค่าคงที่ก่อนเสมอถ้า (จริง == someBool) ในกรณีที่คุณพิมพ์โดยไม่ตั้งใจ = แทนที่จะเป็น == [ใช่ฉันล้อเล่น!]
Steven A. Lowe

คำตอบ:


126

เป็นรหัสซ้ำซ้อนไม่ใช่ชีวิตหรือความตาย แต่ ....

ถ้ามันเกิดขึ้นมากมายมันอาจเป็นปัญหากับการsomeBoolตั้งชื่อ ชื่อที่ดีสามารถไปได้ไกลโดยไม่จำเป็นต้องใช้==true

if(IsSomeCondition)

หรือ

if(hasCondition)

หรือ

if(somethingExists)

ตัวอย่างเช่น.


แหวนนี้เป็นจริงที่สุดสำหรับฉัน ทุกอย่างเกี่ยวกับความชัดเจนและศิลปะของการตั้งชื่อไวยากรณ์ดั้งเดิมนั้นไม่เลว แต่นี่เป็นเส้นทางที่ถูกต้องไปยังโค้ดที่ดีกว่า
TJB

2
เอาชนะฉันไป! หากไม่มีการตั้งชื่อที่เหมาะสมความเท่าเทียมที่กระชับยิ่งขึ้นก็ไม่สมเหตุสมผล
ทรอยฮันท์

4
ฉันต้องใช้someBool == trueรหัสดั้งเดิมหลาย ๆ ครั้งเพื่อความชัดเจน แต่ถ้าฉันเขียนตั้งแต่เริ่มต้นฉันจะตั้งชื่อตัวแปรตามนั้นและใช้if (isSomething)
nimcap

ฉันเห็นด้วยแม้ว่าการตั้งชื่อจะแก้ปัญหานี้โดยสมมติว่าชื่อคือ SomeBool มันอาจมีความหมายอะไรก็ได้และเป็นประเภทใดก็ได้ (จำนวนเต็มเท่ากับปริมาณบูลีนในอาเรย์?) บูลีนต้องการคำกริยาที่มีอยู่บางตัวหรือพวกมันจะอ่านยากด้วยตนเอง
Morgan Herlocker

ฉันเห็นด้วยมันคือทั้งหมดที่เกี่ยวกับการอ่าน หากชื่อตัวแปรนั้นดีคุณไม่ต้องการมัน หากนิพจน์อ่านได้ดีขึ้นฉันควรใช้คำว่า "== true" หากคุณใช้ "== false" แทน (the ugly) "if (! ())"
Ronny Brendel

71

เมื่อฉันเห็นsomeBool == trueฉันไม่สามารถช่วยได้ แต่รู้สึกว่าโปรแกรมเมอร์ไม่ได้ทำให้แนวคิดการประเมินผลเป็นข้อบกพร่องขั้นพื้นฐาน

อย่างไรก็ตามมุมมองของฉันเบ้เพราะฉันใช้เวลาหลายฤดูร้อนในการเขียนโปรแกรมการเรียนการสอนในวิทยาลัยให้กับเด็ก ๆ ที่มักเขียนการแสดงออกเช่นนี้เพราะพวกเขาไม่เข้าใจการออกกำลังกายทางจิตของการประเมินการแสดงออก เมื่อพวกเขาจับกลุ่มแนวคิดความซ้ำซ้อนก็ชัดเจน

สำหรับโปรแกรมเมอร์มืออาชีพที่มีความสามารถเป็นอย่างอื่นอาจไม่ใช่กรณีนี้ อาจเป็นเพียงนิสัยที่ไม่ดีที่พวกเขาพัฒนาในช่วงแรก ๆ ของการเขียนโปรแกรมและไม่เคยสั่นคลอนเลย แต่มันจะทำให้ฉันตกใจเล็กน้อยถ้ามันเป็นสิ่งแรกที่ฉันเห็นใครบางคนทำในการสัมภาษณ์


ฉันจะไม่พูดอย่างนี้จนติดเป็นนิสัย ฉันได้ยินสิ่งที่น่าทึ่งอย่างแท้จริงจากปากโปรแกรมเมอร์มืออาชีพ ตามปกติแล้วหลังจากนั้นไม่นานโดยหนึ่งใน grokkers ว่า "วิธีการนี้ไม่เคยทำงานอย่างไร"
dash-tom-bang

12
เห็นด้วยอย่างสุดใจเกี่ยวกับการประเมินผล ในโอกาสที่ฉันสงสัยว่า "มันหยุดอยู่ที่ไหน?" ถ้า (((((x (= จริง) == จริง) == จริง)! = false) // และอื่น ๆ ...
yawmark

1
บางครั้งผมก็จะเขียนif (c == true) return true; else return false;แต่ 99% ของเวลา (1% จะมีตั้งแต่ฉันไม่สามารถตรวจสอบได้ว่าผมไม่พลาดบาง) return cฉันทันทีจะสังเกตเห็นและแทนที่สิ่งทั้งหมดที่มี ฉันคาดหวังว่าโปรแกรมเมอร์ผู้มีความสามารถส่วนใหญ่ควรทำสิ่งที่คล้ายกันหากพวกเขาพัฒนานิสัยในช่วงต้นอาชีพของพวกเขา สิ่งที่ฉันไม่คาดหวังคือคำตอบ wtf
Lie Ryan

1
โอ้เจ้าศิลปะแห่งการคิด ฉันแท้จริงมาข้ามใน codebase ของเราสัปดาห์ที่ผ่านมา if (!someCondition) { someCondition = false; }ฉันเห็นบางส่วนที่ซ้ำซ้อน (เอ่อหลายคน) รวมถึงสิ่งที่เป็นไปไม่ได้ในรหัสของเรา แต่อันนี้เรียบง่าย แต่ก็น่ารำคาญที่คิดว่ามีคนเขียนมันขึ้นมาจริงๆ ซ้ำหลาย ๆ ครั้ง
Anthony Pegram

1
เพิ่งทราบว่าฉันได้เห็นบางกรณีif(x) x=true;ที่ไม่ซ้ำซ้อน แต่แทนที่จะเท่ากับx=!!x;(normalizing x ถึง 0/1)
jkerian

58

นั่นทำให้ฉันบ้าเหมือนกัน แต่ฉันจะพูดถึงความซ้ำซ้อนกับพวกเขาด้วยวิธีที่สร้างสรรค์และจากนั้นก็วางมันแม้ว่าพวกเขาจะไม่เห็นด้วยก็ตาม

หรือคุณอาจลองใช้วิธีนี้:
คุณ:คุณสามารถเริ่มใช้ระเบียบรหัสต่อไปนี้สำหรับการประเมิน Booleans ได้หรือไม่?

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

พวกเขา:ทำไมเราจะทำอย่างนั้น? ในช่วงครึ่งหลังของคำแถลงนั้นซ้ำซ้อนมันจะประเมินเป็นจริงเสมอ

คุณ:โดยจอร์จคุณพูดถูก โง่ฉัน ลองไปกับรุ่นที่ไม่มีความซ้ำซ้อนทั้งหมดแล้ว เกี่ยวกับ?

if (someBool) {}

6
ใช่เห็นด้วย มันโง่ แต่คุณต้องเลือกการต่อสู้ของคุณและรหัสนี้ทำในสิ่งที่เพื่อนร่วมงานของคุณต้องการ พูดถึงมันในสิ่งที่ไม่ใช่ "สิ่งที่ผิดกับคุณ! ชนิดของวิธีแล้วปล่อย แม้ว่าพวกเขาจะเริ่มดึงอึเช่น "if (someBool! = true)" หรือ "if (! someBool == จริง)" หรือความเชื่ออื่น ๆ นั่นอาจเป็นการต่อสู้ที่คุ้มค่าที่จะเลือก ...
BlairHippo

3
(someBool == false) เป็นอย่างไรที่เลวร้ายยิ่งกว่า (someBool == จริง)?
FinnNk

5
true=trueไม่ได้รวบรวมคุณไม่สามารถกำหนดให้true;-)
fredoverflow

1
ฉันเคยชินกับif(somebool == false)หรือ!=แต่มักจะต่อต้านเท็จและไม่จริง ฉันพบว่ามันซ้ำซ้อน แต่เนื่องจากมาตรฐานการเข้ารหัสยืนยันว่าif()ฟังก์ชั่นเรียกช่องว่างระหว่าง parens ช่วยให้ฉันอ่าน ด้วยตัวเอง Bool เป็น Bool แต่if (somePointer)ไม่บิน ฉันชอบif (somePointer != NULL)เนื่องจากตัวชี้ไม่ใช่บูล
dash-tom-bang

5
มันเกี่ยวกับความสามารถในการอ่านไม่ใช่ไร้เหตุผลหรือ (ไมโคร)
Ronny Brendel

45

ฉันคิดว่าถ้าสิ่งเล็ก ๆ น้อย ๆ เป็นปัญหาใหญ่ที่สุดของคุณกับเพื่อนร่วมงานของคุณคุณควรพิจารณาตัวเองว่าโชคดีมาก


5
เอาดีมันเป็นการดีที่จะมุ่งมั่นเพื่อความสมบูรณ์แบบ แต่แน่นอนว่ามีปลาตัวโตกว่าให้ทอด
TJB

3
ฉันคิดว่าคุณพูดแบบนี้เกี่ยวกับปัญหาทุกอย่างที่ควรพูดคุยกัน
Dave Van den Eynde

2
มันอาจบ่งบอกถึงปัญหาที่ใหญ่กว่ามาก รอยเปื้อนสีน้ำตาลขนาดเล็กบนเพดานในโรงรถของคุณอาจไม่เหมือนเรื่องใหญ่ แต่อาจหมายถึงว่าคุณมีน้ำรั่ว
Josh

42

คุณควรหยุดนิสัยที่ไม่ดีนี้อย่างแน่นอน เบา ๆ ...

มันง่ายที่จะลืมที่จะเขียนเครื่องหมายเท่ากับสองเท่าเปลี่ยนรหัสเป็น:

if (someBool = true)

ใน C # เช่นนี้จะสร้างคำเตือนเท่านั้นไม่ใช่ข้อผิดพลาด ดังนั้นหากคุณปฏิบัติต่อคำเตือนว่าเป็นข้อผิดพลาดรหัสจะทำงานให้ตั้งค่าตัวแปรเป็นจริงและป้อนเงื่อนไข


6
นี่ไม่ใช่อาร์กิวเมนต์ที่เกี่ยวข้อง หากคุณกำลังทำงานในภาษาเช่นนั้นคุณก็สามารถย้ายความจริงไปด้านอื่น ๆ คำถามเกี่ยวกับการรวมความจริงหรือไม่
บแคม

8
@Cam: จุดที่ขาดหายไปคือคุณ ตรรกะย้อนหลังฉันไม่ได้แนะนำ
Guffa

15
@Cam - เขาจะให้ตัวอย่างโลกแห่งความจริงเมื่อนี้อาจเป็นปัญหา ฉันจะบอกว่ามันมีความเกี่ยวข้องมาก
ChaosPandion

1
@Guffa Cam นั้นถูกต้องมาก นี่ไม่ใช่เหตุผลที่จะหยุดใช้ == (anyType) ในถ้าบล็อก
Ronny Brendel

2
@ Ronny: ไม่มันไม่สามารถเกิดขึ้นได้กับทุกประเภท (ยกเว้นว่าภาษาจะอนุญาตให้มีเงื่อนไขใด ๆ ) คำสั่งif (answer = 42) {}ไม่ได้รวบรวมเพราะการแสดงออกไม่ใช่บูล
Guffa

21

ฉันเห็นด้วยกับคุณ แต่ฉันจะเล่นผู้สนับสนุนของปีศาจที่นี่:


ขึ้นอยู่กับภาษาและชื่อของตัวแปร x == จริงเหมาะสม:

พิจารณาสถานการณ์ต่อไปนี้ในภาษาที่มีการพิมพ์แบบคงที่และการบีบบังคับประเภทสำหรับประเภทอินทิกรัล:

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

บางคนที่อ่านส่วนนี้ของรหัสอาจไม่เข้าใจทันทีว่าการกระทำที่อนุญาตเป็นตัวแปรบูลีน - อาจเป็นจำนวนเต็มแทนจำนวนการกระทำที่อนุญาต ดังนั้นโดยการเพิ่ม == จริงมันจะกลายเป็นที่ชัดเจนว่า x เป็นบูลีนและไม่ใช่จำนวนเต็มที่ถูกรวมเข้ากับบูลีน:

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

13
การอ่านได้ == GoodThing
Muad'Dib

5
ถ้า ((อ่านง่าย == GoodThing) == จริง) ...
JoelFan

1
bool isGoodThing = การอ่านได้หรือไม่จริง: (codingStandards? true: (internalizationOfConcept? true: false));
johnc

17
actionsAreAllowedดังนั้นการเปลี่ยนชื่อตัวแปร
แกรมเพอร์โรว์

9
โดยการเขียนif (x) { ...คุณยืนยันแล้วว่าxเป็นบูลีนหรือแปลงเป็นบูลีนได้ สิ่งที่คุณเรียกว่าไม่เกี่ยวข้อง
Daniel Earwicker

15

bools nullable เป็นอย่างไร

bool? MyFlag = null;

if (MyFlag == true)
    ;  

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

if (MyFlag.Value)
johnc

1
ไม่ใช่ทุกภาษาที่มีบูลที่สามารถทำให้เป็นโมฆะได้และหลาย ๆ ภาษาที่ยอมรับโครงสร้างที่สองของคุณ
zneak

1
@johnc: "if (MyFlag.Value)" อาจไม่ได้ทำสิ่งที่คุณต้องการเพราะมันสามารถโยนข้อยกเว้นถ้า MyFlag เป็นโมฆะ (ซึ่งคุณสามารถทดสอบได้โดยการตรวจสอบ MyFlag.HasValue)
Ludovic Chabant

4
นี่คือสัตว์เลี้ยงของฉันที่มีคนโง่ไร้ค่า :)
Jarrod Dixon

3
บูล? isValid = null; ถ้า (isValid ?? false);
skolima

11

โดยทั่วไปแล้วคุณไม่ต้องการที่จะทำเรื่องใหญ่จากการเขียนโปรแกรมการประชุมเว้นแต่ว่าการประชุมดังกล่าวเป็นอุปสรรคต่อโครงการอย่างมีนัยสำคัญ ฉันได้เห็นการถกเถียงกันอย่างดุเดือดที่ทวีความรุนแรงมากขึ้นเรื่อย ๆ เมื่อเทียบกับสิ่งต่าง ๆ ที่มีขนาดเล็กเท่ากับภูมิภาครหัสและขีดเส้นใต้ชั้นนำ

ที่ถูกกล่าวว่าฉันไม่เห็นปัญหากับการเพิ่ม== trueคำสั่งตามเงื่อนไข ตามความเป็นจริงฉันอยู่ในนิสัยของการใช้== falseซึ่งตรงข้ามกับเครื่องหมายอัศเจรีย์ชั้นนำเมื่อทดสอบเงื่อนไขเชิงลบ ฉันคิดว่ามันอ่านได้มากขึ้น

หากมีการประชุมที่กำหนดไว้ฉันพูดตามถ้าไม่มีเหตุผลที่จะเปลี่ยนแปลง อย่างไรก็ตามมันก็ไม่คุ้มที่จะสร้างปัญหาใหญ่


1
ค่าบางอย่างอาจไม่เทียบเท่ากับของจริงแม้ว่าจะประเมินเป็นจริงก็ตามทั้งนี้ขึ้นอยู่กับภาษาของคุณ ตัวอย่างเช่น(9 == True)ประเมินเป็นเท็จใน Python และฉันจะจินตนาการคล้ายกันใน C ++
dash-tom-bang

รหัสพื้นที่และขีดเส้นใต้ชั้นนำทำให้ฉันต้องการต่อยคนในหน้า
MGOwen

11

Ack ฉันเป็นผู้ชายคนนั้น ความอัปยศความอัปยศ มันเป็นวิธีที่ฉันเรียนรู้และเป็นวิธีที่ฉัน "จัดรูปแบบอัตโนมัติ" ในหัวของฉัน ครั้งเดียวที่ฉันใช้ไวยากรณ์ที่ชอบของ Joel คือเมื่อตัวแปร bool มีคำนำหน้ากริยาเหมือน "is." ฉันต้องการคำกริยาไม่ว่าจะเป็น "is" "can," "did" หรืออื่น ๆ ที่ฉันต้องการ == เพื่อให้คำกริยา "เท่ากับ" ฉันอาจไม่เคยหยุดนิสัยแบบนั้นดังนั้นฉันจะเข้าใจถ้าคุณไม่พูดว่า 'สวัสดี' กับฉันบนถนน


7
มันไม่ใช่เรื่องเลวร้าย รหัสที่อ่านเหมือนข้อความจริงจะดีกว่าโค้ดโดยนัย เก็บนิสัยนั้นไว้เพื่อประโยชน์ในการอ่าน
Ronny Brendel

11

เตือนฉันเกี่ยวกับ "รหัสบ้าแบบบูลีน" มันเป็นแบบนี้

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

แทน:

 otherBool = !someBool

นั่นเป็นเรื่องตลกที่ฉันต้องรักษาระบบที่ทิ้งขยะให้หมด มันทำให้ฉันเสียสติ
Tjaart

8

โดยส่วนตัวแล้วฉันไม่ชอบวิธีที่จะพูดว่า "ไม่" ในภาษาที่ใช้ภาษา C เครื่องหมายตกใจเล็ก ๆ น้อย ๆ นั้นมองข้ามได้ง่ายเกินไป

ดังนั้นฉันเขียนมันเต็ม:

if (someCondition == false) {

หลังจากอ่านมาระยะหนึ่งผมก็ต้องการความสมมาตรเช่นกัน

if (someCondition == true) {

ดังนั้นคิดว่ามันเป็นสิ่งประดิษฐ์ของ C ใช้แทน!not


3
C ++ มีตัวnotดำเนินการจริง ๆและ C ก็เช่นกัน (เมื่อคุณรวมส่วนหัวมาตรฐาน<iso646.h>) หากคุณไม่ต้องการที่จะ (หรือไม่สามารถ) ใช้ส่วนหัวนี้ (หรือถ้าคุณกำลังติดอยู่กับ Java หรือ C #) if (! condition)ผมขอแนะนำให้วางพื้นที่หลังเครื่องหมายอัศเจรีย์: นี่ทำให้มันค่อนข้างชัดเจนมากขึ้น
Konrad Rudolph

1
ฉันทำจาวา notไม่ใช่ตัวเลือก

6

มันขึ้นอยู่กับภาษา แต่โดยทั่วไปแล้วมันเป็นความคิดที่ไม่ดี ...

ใน C ไม่เคยทำเช่นนี้ มันง่ายเกินไปที่จะค้นหาสถานการณ์ที่ค่าที่คุณกำลังทดสอบไม่ใช่เท็จ (ไม่ใช่ศูนย์) แต่ก็ไม่เท่ากับค่าเดียวที่กำหนดเป็น "จริง"

ใน Ruby ให้ทำสิ่งนี้เฉพาะเมื่อคุณมั่นใจอย่างแน่นอนว่าคุณต้องการล้มเหลวในทุกสิ่งยกเว้นบูลีนจริง

ใน C ++ และภาษาสแตติกอื่น ๆ ที่มีประเภทบูลมันซ้ำซ้อนและสามารถนำไปสู่ข้อผิดพลาดในการเขียนโปรแกรมเมื่อคุณพิมพ์ผิด=แทนที่จะเป็น==หรือข้อผิดพลาดการส่งเสริมการขายตามที่ระบุไว้ในความคิดเห็น


ที่จริงแล้วในภาษาที่ตัวดำเนินการกำหนดส่งคืนค่า ... เช่น C ++ ... if (b == true) {ไม่เพียง แต่ซ้ำซ้อน นอกจากนี้ยังเป็นบิตมีความเสี่ยงเพราะคุณอาจได้รับมอบหมายโดยไม่ได้ตั้งใจที่จะtrue b
Stephen C

4
มันไม่เพียง แต่ซ้ำซ้อนใน C ++ มันอันตราย หากคุณเขียนif (b == true)และbไม่ใช่บูลการแปลงประเภทเป็นวิธีที่ผิด boolเป็นประเภทหนึ่งที่ได้รับการเลื่อนปกติชนิดหนึ่งที่เหมาะสมกับค่า 1. ถ้าคุณเขียนพูดint b(2); if (b == true)แล้วtrueจะกลายเป็นintมีมูลค่า 1 สำหรับวัตถุประสงค์ของการเปรียบเทียบมากกว่าbถูกบังคับให้ประเภทboolซึ่งจะให้ผลที่เหมาะสม
David Thornley

@ DavidThornley เปิดคำเตือนในคอมไพเลอร์ของคุณ ==การรักษาคำเตือนเป็นข้อผิดพลาดเป็นเทคนิคการเขียนโปรแกรมที่ดีกว่าการป้องกันมากกว่าการหลีกเลี่ยง
Abyx

5

คุณคิดว่าไม่ดีเหรอ? เกี่ยวกับ:

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

2
เด็กชายกี่ครั้งที่ฉันเห็นสิ่งนี้ ทำให้เป็นกรณีที่ดีสำหรับเครื่องมือเช่น ReSharper
งาน

ใช่ - ถ้าคุณจ้างก้อนดินให้ซื้อ ReSharper
Kirk Broadhurst

4

ฉันชอบ

if (bVal)

หรือ

if (!bVal)

เหมือนกัน แต่ฉันเกรงว่าการนำขึ้นมาจะฉี่คนออกดังนั้นคำแนะนำของฉันคือลืมมัน ขออภัย!


4
สำหรับความรักของทุกสิ่งที่ศักดิ์สิทธิ์ตราบเท่าที่มันไม่ได้ if (!bNotVal)หรือif (bNotVal)แม้กระทั่งในสถานที่แรก เนกาทีฟในชื่อทำให้ทุกอย่างอ่านยากขึ้น
dash-tom-bang

2
ฉันรู้ว่านักพัฒนาที่จะบูลนั้นไม่ได้เชื่อมต่อ if (isNotConnected == จริง) ... yuck
johnc

4

คุณควรบอกเขาว่าเขาทำผิด

ของมัน

if (true == someBool) {

}

ถ้าเขาลืมไปหนึ่งข้อ = เขามีปัญหาใหญ่ในสไตล์การเขียน


3

เกี่ยวกับ

if (x == "true")

ทำไมถึงเป็นเงื่อนไข?!


ผมทำงานเกี่ยวกับมรดกของ code php if(preg_match('/title/', implode($_POST))){บางขวาและบางครั้งผมพบสิ่งที่ต้องการ PHP, พอกล่าว, ฉันต้องการหางานที่ดีกว่า
Keyo

4
ใช่ฉันยังดูว่า (x == "1") แต่นั่นมักจะทำเพื่อการออกแบบฐานข้อมูลที่ไม่ดี
atfergs

ฉันใช้โครงสร้างที่คล้ายกันเมื่อxมาจากการป้อนข้อมูลของผู้ใช้ (ตัวอย่างเช่นไฟล์กำหนดค่าหรือบริการบนเว็บ) อย่างไรก็ตามฉันมักจะอนุญาตค่า truish อื่น ๆ ดังนั้นจึงสิ้นสุดเช่นif x.lower().strip() in ["true", "yes", "on", "1"]
eswald


3

ฉันเขียนโค้ดแบบนั้น!

นี่คือเหตุผล:

"if bla == true" อ่านเหมือนประโยคโดยที่ "if bla" ไม่ได้มีหลายกรณี มันฟังดูผิดเมื่ออ่านโค้ดจริง

คอมไพเลอร์ยังเตือนเกี่ยวกับการกำหนดถ้าบล็อกดังนั้นจึงไม่มีอันตรายใด ๆ ในการใช้ == จริง (ทำให้สับสนด้วย =)

พวกที่ไม่เขียน "== จริง" ใช้ที่ "! ()" สำหรับ "== false" ด้วยหรือไม่ ฉันคิดว่ามันน่าเกลียดจริงๆ และถ้าคุณใช้ "== false" มันก็สอดคล้องกันมากที่จะใช้ "== จริง" แทนการมีวิธีการตรวจสอบความจริงที่แตกต่างกันสองวิธี


3
คุณพูดว่า "if bla" ไม่อ่านเหมือนประโยค ... นั่นหมายความว่าตัวแปรของคุณไม่ได้ตั้งชื่ออย่างถูกต้อง ... เกิดอะไรขึ้นกับสิ่งนี้: if (userHasRights) doSomething ()
JoelFan

"ในหลายกรณี". ใช่คุณถูก. การเปลี่ยนชื่อทำได้ดีเช่นกัน ด้วย "if (QWidget :: acceptDrops () == true)" คุณไม่มีความเป็นไปได้ที่จะเปลี่ยนชื่อ บางทีมันอาจจะเป็นการดีถ้าจะตั้งชื่อมันว่าAcceptDrops () ... มันยุ่งยากมากเกินไป (และเป็นไปไม่ได้ที่จะสอดคล้องกับการใช้กฎการละเลยใน API ใด ๆ ) ดังนั้นให้สอดคล้องกับ "== อะไรก็ตาม" -ifs ฉันขอแนะนำอย่างยิ่งว่าอย่าละเว้นดังนั้นจึงไม่ "ดู" แตกต่างดังนั้นจึงมีลักษณะสอดคล้องกัน
Ronny Brendel

3

จำไว้ว่าคุณกำลังทำงานเป็นส่วนหนึ่งของทีมดังนั้นคุณต้องทำงานร่วมกัน "เล่นได้ดีกับคนอื่น ๆ " ยังคงเป็นลักษณะบุคลิกภาพที่สำคัญแม้หลังจากโรงเรียนประถม :)


2

โดยทั่วไปแล้วจะไม่ใส่ '== จริง' แต่แทบจะไม่คุ้มค่าแม้แต่นาทีที่จะพูดคุยจนกว่าคุณจะรวมไว้ในมาตรฐานการเข้ารหัสของทีม


3
นอกจากนี้หากอยู่ในมาตรฐานการเข้ารหัสของทีมคุณจำเป็นต้องประเมินมาตรฐานใหม่เพื่อกำจัดเรื่องไม่สำคัญเช่นนี้
JohnFx

ตกลงกัน! ในกรณีที่ ...
FinnNk

2

ในขณะที่ฉันเห็นด้วยในฐานะนักพัฒนา C # ส่วนใหญ่ฉันไม่สามารถพูดได้ว่าเป็นเช่นนี้เสมอไป ตัวอย่างเช่นใน Javascript เครื่องหมาย === จะดำเนินการเชื่อมโยงประเภท ดังนั้นสมมติว่าvar x = 3แล้ว:

if(x) --> true

ในขณะที่

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

ฉันเดาว่ามันแตกต่างจาก == ตั้งแต่ใน JS ฉันจะไม่ใช้ถ้า (x == จริง)แต่เป็นอะไรที่คิด

การสัมผัสเช่นนี้ในอีกจุดหนึ่งซึ่งเกิดขึ้นในสำนักงานของฉัน:

bool b = false;

ใน C #, bool b; จะเพียงพอและจะ initalize การเท็จ อย่างไรก็ตามมีความชัดเจนมากขึ้นในการเขียนบรรทัดด้านบนและควรเรียบเรียงโดยคอมไพเลอร์ในระหว่างการปรับให้เหมาะสม

ดังนั้นฉันจึงคิดว่าประเด็นของฉันคือมันไม่ชัดเจนเสมอไปว่าอะไรคืออะไรและไม่ใช่การฝึกฝนที่ดีและมีหลายสิ่งที่ทำให้ฉันพึงพอใจเช่นเดียวกับคุณสมบัติ / ภาษา


bool b;เริ่มต้นเป็นเท็จเฉพาะเมื่อbเป็นเขตข้อมูล คุณต้องเริ่มต้นตัวแปรท้องถิ่นอย่างชัดเจน
Matthew Flaschen

+1 เห็นด้วย มันเป็นปัญหาเดียวกันกับภาษา (สคริปต์) อื่น ๆ เช่นกัน คุณต้องชัดเจนถ้าคุณต้องการทดสอบบูลีนtrueหรือเพียงแค่ "จริง" ตัวอย่างเช่นสตริงใด ๆ ที่ไม่ว่างจะถูกพิจารณา== trueแต่ไม่ใช่=== trueในบางภาษา
Martin Wickman

2

อ่าใช่ แต่ถ้าตัวแปรเป็นโมฆะ? (บูล?)

บางภาษา (C #) จะต้องใช้และคัดลอกหรือเปรียบเทียบกับ 'จริง'

bool? isAccepted = true;

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

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

2

หนุ่มรู้กฎ แต่เก่ารู้ข้อยกเว้น;)

ในล่าสุดC#หากคุณกำลังจัดการกับ a null-able boolแล้วคุณจะต้อง:

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.
}

หาก tristate ไม่ได้เป็นปัญหาแล้วมักจะมีไม่ควรมีเหตุผลที่จะเปรียบเทียบบางสิ่งบางอย่างไป/true Trueอย่างไรก็ตามในPythonและอีกหลายภาษาเช่นC/C++คุณสามารถดำเนินการifในการแสดงออกที่ไม่ใช่บูล ภาษาเหล่านี้มีกฎเฉพาะสำหรับการตีความจำนวนเต็มพอยน์เตอร์รายการ ฯลฯ ว่าเป็นจริงหรือเท็จ บางครั้งคุณไม่ต้องการที่ ตัวอย่างเช่นใน Python ตัวอย่างนี้:

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

นี่zควรจะเป็นTrueแต่ควรจะเป็นz2 Falseทีนี้Clojureภาษาเข้าใกล้สิ่งนี้ในอีกทางหนึ่ง - andฟังก์ชั่นไม่จำเป็นต้องประเมินถึง a boolแต่ifสามารถจัดการได้

ไม่ว่าจะใช้ภาษาใดเมื่อใดก็ตามที่คุณพบว่าตัวเองเปรียบเทียบอะไรกับมันTrueหรือFalseมันอาจจะคุ้มค่าที่จะแสดงความคิดเห็น


ปัญหาแรกเกิดจาก IMO ที่เป็นเท็จโดยใช้ชื่อตัวแปรที่น่ากลัว x สมมติ, Y, Z ชื่อnotExceptButHasX, exceptNotButIsntY, doNotUnlessIsExceptZ? สิ่งนี้ทำให้อ่านได้ง่ายในปัญหาของคุณ? ถ้า x, y, z ถูกตั้งชื่อบางอย่างเช่น "isEnabled", "isEffective", "hasProperty" จากนั้นคุณจะกลายเป็นคำสั่งisEnabled || isEffective || hasPropertyซึ่งอยู่ไกลมากขึ้นอ่านกว่าเมื่อเทียบกับหรือtrue false
โทมัส

1

การเข้ารหัสเช่นนั้นจะทำให้ฉันผิดไปก่อน แม้ว่าตัวระบุตัวอย่างของคุณชื่อ "someBool" การใช้รูปแบบการเข้ารหัสนั้นโดยไม่ตั้งใจในตัวแปรที่ไม่รับประกันว่าจะเป็นบูลีนอาจมีพฤติกรรมที่ไม่ได้ตั้งใจ หากค่าของ "someBool" ไม่ตรงกับ "true" หรือ "false" ผลลัพธ์จะเป็นเท็จ

ฉันพบข้อผิดพลาดที่ลึกซึ้งมากในปีที่ผ่านมาซึ่งเกิดจากรูปแบบการเข้ารหัสซึ่งยากที่จะระบุได้ คุณคิดว่า "มันจะผิดอย่างไร" สิ่งเดียวกันถือเป็นจริงสำหรับนิพจน์ที่เข้าใจดีเช่น "(var)" หรือ "(! var)" ที่คุณอ่านหรือเขียนโค้ดโดยไม่ตรวจสอบพฤติกรรมของพวกเขา

ดังนั้นฉันจึงแนะนำมาตรฐานการเขียนโค้ดสองสามข้อเพื่อลดการมีอยู่ของข้อบกพร่องดังกล่าวใน codebase และโอกาสที่ข้อผิดพลาดที่บอบบางเหล่านี้จะคืบคลานไปโดยบังเอิญในบางครั้งในอนาคต

  1. การแสดงออกทั้งหมดจะต้องถูกวงเล็บตามความตั้งใจของพวกเขา
  2. การทดสอบบูลีนทั้งหมดจะต้องแสดงในเชิงลบเช่น "suchBool! = false"

การล้างโค้ดไม่สอดคล้องกับรูปแบบใหม่ฉันได้ระบุและแก้ไขอินสแตนซ์ของข้อบกพร่องที่ละเอียดอ่อนอีกสองสามรายการ


1
การมี Bool บางตัวสามารถเป็นอย่างอื่นที่ไม่ใช่ TRUE / FALSE นั้นเป็นวิธีการเข้ารหัสที่ไม่ดี
AttackHobo

@AttackingHobo เป็นหนึ่งในข้อผิดพลาดที่ไม่มีประเภทบูลีนในภาษาและ / หรือไม่ได้ใช้คลาสเพื่อแสดงพฤติกรรมที่ต้องการ
Huperniketes

1

ต้องใช้สิ่งนี้ตลอดเวลาใน ActionScript 2 (ตอนนี้ยอมรับว่าเป็นภาษาที่ตายแล้ว) เพราะ:

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)
{
}

ดังนั้นจึงเป็นการดีที่สุดที่จะเจาะจง


1

ฉันเห็นด้วย. มันเป็นโครงสร้างที่ซ้ำซ้อนโดยเฉพาะอย่างยิ่งในภาษาที่พิมพ์ได้ดี

เพื่อเพิ่มการใช้งานบูลีนในทางที่ผิดฉันได้พบการสร้างแบบนี้มาหลายครั้งใน Javascript (โดยเฉพาะอย่างยิ่งในฟังก์ชั่นมอนสเตอร์ที่มีลักษณะเหมือนปาเก็ตตี้อย่างเช่นใน 100+ บรรทัด):

//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
}

ดูเหมือนว่าเนื่องจากการขาดคำจำกัดความประเภทที่เข้มงวดในภาษานี้โปรแกรมเมอร์บางคนไม่ต้องการยุ่งกับfalse|undefinedค่า


1

ฉันมีเพื่อนร่วมงานที่จะมีรหัสเช่นนี้:

if(something == true)

จากนั้นสำหรับการทดสอบ / การดีบักบางประเภทเขาจะไม่เรียกบล็อกนี้ดังนั้นเขาจะเปลี่ยนเป็น:

if(something == true && false)

แล้วบางครั้งเขาก็เปลี่ยนเป็น:

if(false)

สิ่งที่แย่ที่สุดคือการดีบั๊กประเภทนี้ทำให้ฉันรู้สึกแย่ในบางโอกาส


0

ฉันจะบอกว่ามั่นคงเป็นกษัตริย์ในรหัสฐาน ดังนั้นคุณควรใช้สไตล์ที่ส่วนใหญ่ใช้ในองค์กรของคุณ พยายามทำให้สไตล์ที่คุณต้องการเป็นส่วนหนึ่งของแนวทางการเข้ารหัสของ บริษัท อย่างเป็นทางการ หากมีอยู่แล้วในหลักเกณฑ์เพียงทำตาม

(ที่ถูกกล่าวว่ามันจะรบกวนฉันจริง ๆ - แต่อาจไม่เพียงพอที่จะทำเรื่องใหญ่จากมัน)


0

ฉันไม่ต้องการวาง == จริง แต่บางครั้งฉันก็ใส่มันเข้าไปโดยไม่ตั้งใจ บุคคลนั้นอาจไม่ได้สังเกตและนำไปวางโดยไม่ตั้งใจ ฉันอ่านซ้ำรหัสของฉันและบางครั้งสังเกตว่าฉันวาง == จริงไว้ดังนั้นฉันจึงลบ == จริง บางครั้งฉันไม่สังเกตเห็นมันและยินดีต้อนรับใครบางคนอย่างมีความสุขบอกฉันว่าฉันวางมันซ้ำซ้อน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.