ข้อไหนคือการบำรุงรักษามากขึ้น - การกำหนดบูลีนผ่านทาง if / else หรือการแสดงออกบูลีน?


11

สิ่งใดที่จะถือว่าได้รับการบำรุงรักษามากขึ้น

if (a == b) c = true; else c = false;

หรือ

 c = (a == b);

ฉันลองดูใน Code Complete แต่ไม่พบคำตอบ

ฉันคิดว่าอันแรกสามารถอ่านได้มากขึ้น (คุณสามารถอ่านออกเสียงออกมาได้ดัง ๆ ) ซึ่งฉันคิดว่าทำให้สามารถบำรุงรักษาได้มากขึ้น อันที่สองมีความเหมาะสมมากกว่าและลดรหัส แต่ฉันไม่แน่ใจว่ามันจะบำรุงรักษาได้สำหรับนักพัฒนา C # (ฉันคาดว่าจะเห็นสำนวนนี้มากขึ้นเช่น Python)


3
ทั้งสองไม่เท่ากัน คุณต้องการ a else c = falseก่อนหรือทำการมอบหมาย||=ในวินาที

17
ฉันคิดว่าความจริงที่ว่าคุณต้องแก้ไขสองแบบแรกให้ตอบคำถามของคุณ!
James

7
ฉันเห็นด้วยกับ @James รูปแบบที่สองในขณะที่ไม่เป็น verbose ตรงไปตรงมามากที่จะเข้าใจและไม่คลุมเครือตามความหมายของมัน ไม่มีลูกเล่นหรือช็อตคัตใด ๆ มันสั้นเพราะแนวคิดนั้นง่าย ความจริงที่ว่าคุณเขียนรหัสข้อผิดพลาดแรกและต้องแก้ไขเพื่อแก้ไขและมันก็ยังไม่สมบูรณ์แบบ (การใช้เครื่องมือจัดฟันที่ไม่สอดคล้องกัน) เป็นข้อพิสูจน์เชิงบวกว่ามันไม่ตรงไปตรงมาอย่างที่คุณคิด
Eric King

5
ว้าว C # devs พิจารณารูปแบบที่ยอมรับได้จริงหรือไม่ สิ่งนี้ ... ลดความเชื่อมั่นในตัวฉันอย่างจริงจัง จากประสบการณ์ของฉันการใช้แบบฟอร์มแรกเป็นการบอกใบ้อย่างมากในความเข้าใจผิดที่สมบูรณ์ของการแสดงออกทางบูลีน
Andres F.

2
เพียงเพื่อให้สิ่งต่าง ๆ น่าสนใจนี่เป็นอีกตัวเลือกหนึ่ง:c = a==b ? true : false;
FrustratedWithFormsDesigner

คำตอบ:


14

ตัวเลือกที่สองจะดีกว่า

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

อย่างไรก็ตามฉันไม่คิดว่าc = (a == b);จะเป็นตัวอย่างของเคล็ดลับที่ฉลาด มันเป็นการนำเสนอแนวคิดที่เรียบง่าย ตรงไปตรงมาเท่าที่คุณจะได้รับ

ที่เหมาะสม "การบำรุงรักษา" การจัดรูปแบบของตัวอย่างแรกของคุณ (โดยไม่มีการจัดฟันที่หายไปและสร้างหนึ่งบรรทัดซึ่งผมทำพิจารณาทางลัดฉลาด) จะให้ผลผลิตรหัสนี้:

if (a == b)
{
    c = true; 
}
else 
{
    c = false;
}

จากประสบการณ์ของฉันการเขียนตรรกะบูลีนอย่างง่ายในลักษณะที่ละเอียดและผิดพลาดเป็นสัญญาณของรหัส "iffy" มันจะทำให้ฉันสงสัยว่าตรรกะที่ซับซ้อนมากขึ้นจะถูกจัดการในรหัสฐานนี้


15

ก่อนอื่นให้ตระหนักว่ารูปแบบทั้งสองของคุณนั้นไม่เทียบเท่ากัน

if (a == b) c = true;

cจะถูกตั้งค่าเป็นจริงถ้าaเท่ากับbและถ้าไม่มูลค่าของมันจะยังคงอยู่ไม่ว่ามันจะเป็นอะไรก็ตาม

c = (a == b);

cจะถูกตั้งค่าเป็นจริงถ้าaเท่ากับbและถ้าไม่มันจะถูกตั้งค่าเป็นเท็จ

หากคุณต้องการรูปแบบที่เทียบเท่าในรูปแบบของรูปแบบแรกคุณต้องเขียนดังนี้:

if (a == b) {
  c = true;
} else c = false;

ตอนนี้มันชัดเจนว่าหนึ่งในสองนั้นสามารถอ่านได้มากขึ้นดูแลได้มากขึ้นและมีโอกาสน้อยที่จะแนะนำข้อบกพร่องหากมีการเปลี่ยนแปลงบางอย่าง ติดกับรูปแบบที่สอง


ถูกต้องอย่างแน่นอน - ฉันได้อัปเดตคำถามของฉันแล้ว
Bret Walker

ฉันพิจารณารูปแบบที่สองนานเกินไปและซับซ้อน - ถ้าคุณต้องการผลนั้นให้ใช้การกำหนดบูลีน
Reinstate Monica - M. Schröder

11

ฉันไม่เห็นด้วยว่ารูปแบบแรกของคุณอ่านได้ง่ายกว่า - แน่นอนไม่ใช่ C # ที่มีสองประโยคในบรรทัดเดียวและไม่แนะนำให้มีifคำสั่งโดยไม่ใช้วงเล็บปีกกา

ประการที่สองฉันไม่เห็นว่ารูปแบบที่สองสามารถบำรุงรักษาได้น้อยลง - ไม่มีสิ่งใดที่ต้องดูแล มันเป็นคำสั่งที่เรียบง่ายของความสัมพันธ์ระหว่างaและbและมันอาจไม่ได้รับการแสดงใด ๆ เพิ่มเติมเพียง

อีกเหตุผลที่ชอบฟอร์มที่สองคือคุณสามารถประกาศcและกำหนดมันในคำสั่งเดียวเช่น

bool c = (a == b);

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


ผมอ่านสองงบในบรรทัดเดียวเป็นรหัสเทียม
จิมมี่ฮอฟฟา

1
+1 สำหรับ " Another reason to prefer the second form is that you can declare c and assign it in a single statement"
Andres F.

0

"บำรุงรักษาได้ดีกว่า" อาจเป็นเรื่องส่วนตัวมาก

ฉันมักจะชอบความสามารถในการอ่านและความตั้งใจมากกว่าการลดรหัส ฉันคิดว่าคุณบันทึกอักขระที่พิมพ์ได้ 8 ตัวโดยใช้รูปแบบย่อ

การใช้ภาษาและวัฒนธรรมรอบ ๆ ภาษาเป็นลักษณะของ 'ความสามารถในการอ่าน' ในความคิดของฉัน

มีบางครั้งที่ประสิทธิภาพอาจลดรหัสเพื่อเพิ่มประสิทธิภาพโค้ดไบต์ แต่ควรทำอย่างระมัดระวังหลังจากทำโปรไฟล์


อัตนัย: Duh การลดรหัส: สามารถ (ถ้าไม่ใช่มากเกินไป) สามารถปรับปรุงความชัดเจนและสื่อสารเจตนาได้ดีขึ้น ประสิทธิภาพ: ไม่ต้องกังวลเลย (บางครั้งการปรับให้เหมาะสมมีความสำคัญ แต่นี่ไม่ใช่สิ่งที่ตกอยู่ภายใต้การปรับให้เหมาะสมเพราะในทางปฏิบัตินั้นไม่สำคัญเลย - อาจไม่ได้แม้ว่าคุณจะเขียนเมล็ดหรือไดรเวอร์)

4
แบบฟอร์มแรกมีข้อผิดพลาดอย่างน้อย 1 ข้อซึ่งจำเป็นต้องได้รับการแก้ไขซ่อนอยู่ในคำฟุ่มเฟื่อย แบบฟอร์มที่สองนั้นง่ายและตรงประเด็นและไม่มีข้อผิดพลาด ฉันพักกรณีของฉัน ไม่ว่าในกรณีใด ๆ จุดประสงค์หลักก็คืออย่าพิมพ์ตัวละครน้อยลง! และคำถามนี้ไม่ได้เกี่ยวกับประสิทธิภาพเลยซึ่งไม่เกี่ยวข้องในกรณีนี้
Andres F.

@delnan ตรงประเด็นของฉันดุจ การลดรหัสของบางคนคือความชัดเจนของคนอื่น ฉันไม่ได้อ้างถึงการปรับให้เหมาะสมเป็นข้อกังวลหลัก ... ฉันใช้มันเป็นตัวอย่าง เหตุผลของคุณสำหรับการเพิ่มกลอุบายที่ฉลาดหรือการออกนอกบรรทัดฐานควรมีความสมดุลโดยสิ่งที่คุณ / วัฒนธรรม / องค์กรจะพิจารณาว่าสามารถอ่านได้
Johnnie

1
การเขียนนิพจน์บูลีนที่สะอาดไม่ใช่เคล็ดลับที่ฉลาด!
Andres F.

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

0

ที่สอง. มันมีการทำซ้ำน้อยกว่า (DRY) และง่ายต่อการเข้าใจสิ่งที่เกิดขึ้นซึ่งcถือเป็นมูลค่าของหรือไม่aและจะbเท่ากัน

IMHO จะดีกว่านี้

c = a == b

เช่นเดียวกับฉันจะเขียน

  • 1 + 2 + 3 แทน ((1 + 2) + 3)
  • 5 + 3 * 7 แทน (5 + (3 * 7))

รหัสที่ไม่จำเป็นอย่างชัดเจนและไม่สำคัญคือคุณธรรม มันรก


-4

ผู้ลงคะแนนโปรดอธิบายสิ่งที่ผิดกับคำตอบที่แก้ไขของฉัน

ใช่c = (a == b);อาจจะยากที่จะอ่าน (แย่ลงยัง StyleCop บ่นเกี่ยวกับวงเล็บที่ไม่จำเป็น) a == bแต่ฉันยังคงชอบความเรียบง่ายของ ดังนั้นนี่คือสิ่งที่ฉันต้องการใช้เมื่อทั้งสองaและbเหมือนกัน:

private static bool NoPeriod
{
    get
    {
        return this.MyWaveLength == this.HerWaveLength;
    }
}

จากนั้นคุณสามารถทำได้: this.c = this.NoPeriodแทน:

this.c = this.MyWavelength == this.HerWaveLength;

1
ดังนั้นคุณหมายถึงreturn this.MyWaveLength = this.HerWaveLength;หรือreturn this.MyWaveLength == this.HerWaveLength;แทน?
Jesse C. Slicer

5
อะไร!? c = (a == b);ไม่ผิดพลาดง่าย แบบฟอร์มแรกในคำถามเดิมเป็นวิธีที่ผิดพลาดได้ง่ายขึ้นตามที่ OP แสดงให้เห็นว่าตัวเองต้องแก้ไขคำถามเพื่อแก้ไขข้อบกพร่อง!
Andres F.

ฉันเดาว่าโซลูชันที่คุณแนะนำมีข้อผิดพลาด = vs. ==
Ondra

@Ondra Morskýขอบคุณ ... คอมไพเลอร์จะจับสิ่งนี้ให้ฉัน
งาน

6
ฉันไม่คุ้นเคยกับ StyleCop แต่ถ้ามันบอกคุณว่าวงเล็บที่ไม่จำเป็นนั้นแย่คุณควรปิดมัน เครื่องหมายวงเล็บที่ไม่จำเป็นนั้นไม่จำเป็นสำหรับคอมไพเลอร์ แต่สามารถดีมากสำหรับดวงตามนุษย์ หากคุณเขียน c = a == b; คอมไพเลอร์สามารถคิดออกได้ดี แต่มันยากสำหรับมนุษย์
Michael Shaw
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.