คุณต้องการความกระชับหรืออ่านง่ายในโค้ดของคุณหรือไม่? [ปิด]


21

ทางลัดภาษามักใช้เพื่อทำให้รหัสกระชับยิ่งขึ้น

ตัวอย่างเช่นตัวดำเนินการ ternary และ null รวมตัวกันสามารถลดจำนวนของโค้ดได้

ใน C #:

Person newGuy = new Person();
if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
} else {
    newGuy.Boss = boss;
}

มีหน้าที่เทียบเท่ากับ:

Person newGuy = new Person();
newGuy.Boss = boss ?? GetDefaultBoss();

แต่เห็นได้ชัดว่า verbose มากขึ้น

คุณจะวาดเส้นที่ไหนเมื่อมันมาถึงความกระชับและอ่านง่าย?


3
นี่เป็นคำถามแบบอัตนัยใครบางคนที่ทำบางสิ่งบางอย่างจะบอกว่าวิธีการของเขาเหมาะสมใครบางคนที่อ่านมันจะบอกว่ามันไม่มีเหตุผลและอีกคนที่อ่านมันจะบอกว่าฉันเข้าใจแล้ว นี่เป็นเพียงการตั้งค่า
Chris

20
ฉันคิดว่ารุ่นที่สองสามารถอ่านได้มากขึ้น
Vaibhav

2
คุณกำลังสับสนกับความรัดกุมกระชับ ความกระชับช่วยเพิ่มความสามารถในการอ่าน Terseness เบี่ยงเบนไปจากมัน
Ferruccio

1
@ ThorbjørnRavnAndersen: ผู้ชมสำหรับรหัส C # มักจะเป็น "นักพัฒนาที่มีพื้นหลัง C #" จากสิ่งที่ฉันได้เห็นฉันทามติที่นี่ในโปรแกรมเมอร์ดูเหมือนว่าคุณไม่ควรหลีกเลี่ยงการใช้คุณสมบัติภาษาที่มีประโยชน์เพียงเพราะบางคนอาจไม่คุ้นเคยกับพวกเขา (ดูเพิ่มเติมที่: programmers.stackexchange.com/q/101513/33843 )
Heinzi

1
ซ้ำกันหรือเปล่า: programmers.stackexchange.com/q/58630/15464 .. โอ้อันนี้เก่ากว่า :)
Steven Jeuris

คำตอบ:


63

ทั้งสอง

ตัวอย่างแรกของคุณคือ verbose แน่นอนและชัดเจนมากขึ้น ... แต่ก็ยังต้องให้ฉันสแกนห้าบรรทัดแทนที่จะเป็นหนึ่ง เลวก็ deemphasizes วัตถุประสงค์ - newGuy.Bossการกำหนดค่าให้กับ

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

ตอนนี้ความคมชัดนี้:

if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
    newGuy.IsTemp = true;
    newGuy.AddTask("orientation");
} else {
    newGuy.Boss = boss;
    newGuy.IsTemp = false;
}

... ด้วย:

newGuy.Boss = boss ?? GetDefaultBoss();
newGuy.IsTemp = boss == null;
if ( boss == null ) newGuy.AddTask("orientation");

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


3
คำตอบที่ยอดเยี่ยม! - มันไม่เกี่ยวกับการใช้คำฟุ่มเฟื่อยมากเท่าที่มันเกี่ยวกับวัตถุประสงค์
Damovisa

2
@Damovisa: แน่นอน - เป้าหมายของรหัสคือการสื่อสารและไม่มีเหตุผลทั่วไปว่าทำไมสิ่งนี้ไม่ควรทำอย่างรัดกุมที่สุดเท่าที่จะทำได้ (แต่ไม่มาก)
Shog9

1
การเรียนรู้ตัวดำเนินการรวมศูนย์ว่างจะใช้เวลามากกว่าหนึ่งวินาที - แต่ถ้าคุณไม่รู้คุณควรเรียนรู้มัน!
Casebash

2
อ้า "??" คงจะดีใน Java

แม้ว่าตัวอย่างสุดท้ายจะสั้นกว่าในแง่ของโค้ด แต่ก็มีการประเมินboss3 ครั้งซึ่งต่างจากตัวอย่างเพียงครั้งเดียวในตัวอย่างที่ละเอียด นี่เป็นอีกสาเหตุหนึ่งที่รหัสที่สั้นกว่าเพื่อให้สั้นลงเป็นความคิดที่ไม่ดี ฉันคิดว่าความกระชับควรเป็นสองรองจากวัตถุประสงค์หลักไม่ว่าจะเป็นความสามารถในการอ่าน / การบำรุงรักษา (สำหรับโค้ดที่ซับซ้อน) หรือประสิทธิภาพ (สำหรับส่วนที่สำคัญของวงใน ฯลฯ ) กล่าวอีกนัยหนึ่งอย่าปรับให้บริสุทธิ์อย่างกระชับเพื่อความรัดกุม - หากคุณวางแผนที่จะส่งรหัสผ่านการเชื่อมต่อ 1bps;)
user193130

16

ในขณะที่ทั้งคู่เป็นเป้าหมายที่ดีฉันมักจะเข้าข้างกับความสามารถในการอ่านเมื่อถูกบังคับให้เลือก

ฉันขอยืนยันว่าตัวอย่างของคุณปรับปรุงทั้งความสามารถในการอ่านและความกระชับ พิจารณาอย่างไรก็ตาม:

if( a > b )
{
    foo = bar
}
else
{
    if( c.isThing() ){
        foo = somethingElse;
    }
    else{
        foo = someFurtherThing.GetFoo();
    }
}

ตรงข้ามกับ

foo = a > b ? bar ?? whatever.something : c.isThing() ? somethingElse : someFurtherThing.GetFoo();

อย่างหลังกระชับ แต่อ่านยาก อดีตคือ verbose แต่การไหลของตรรกะชัดเจน

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


11
การจัดรูปแบบที่เหมาะสมสามารถทำให้สามารถอ่านตัวอย่างที่สองได้ง่ายขึ้น นี่เป็นการเปรียบเทียบที่ไม่ยุติธรรม เมื่อจัดรูปแบบเช่นนี้ฉันไม่แน่ใจเลยว่ามันแย่ขนาดนั้น
Steven Jeuris

ตัวอย่างรหัสไม่ได้เทียบเท่า: ?? whatever.somethingคนแรกที่จะหายไป
John B. Lambe

11

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

ความกระชับและการอ่านไม่ตรงข้าม เช่นเดียวกับคำตอบนี้บางครั้งสั้นก็อ่านง่ายขึ้น


4
+1 สำหรับการไม่สมมติว่าโปรแกรมเมอร์คนอื่นขาดความรู้ ในตัวอย่างที่กำหนดตัวเลือกที่สองจะอ่านได้น้อยลงถ้าคุณไม่คุ้นเคยกับตัวดำเนินการรวมศูนย์ว่าง ฉันจะไม่เขียนโค้ดตามสมมติฐานที่ว่าเพื่อนร่วมงานของฉันไม่รู้จักไวยากรณ์ภาษา แม้ว่าพวกเขาจะไม่รู้??ว่าถ้าฉันใช้มันแล้วพวกเขาก็เรียนรู้เราทั้งสองได้รับประโยชน์ และมันก็ไม่เหมือนมันยากที่จะพิมพ์ใน "?? โอเปอเรเตอร์" บน msdn.com
ทิมกู๊ดแมน

4

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

โดยทั่วไปถ้ามันยากที่จะเข้าใจโดยไม่จำเป็นอย่าทำ


3

ความสามารถในการอ่านเป็นอันดับแรกที่มันขัดแย้งกับความรัดกุมเนื่องจากโค้ดถูกแก้ไขบ่อยกว่าที่เขียนไว้ในตอนแรก ในทางกลับกัน:

  1. สัญญาณรบกวนทางเสียงและรหัสสำเร็จรูปมักจะปิดบังความตั้งใจและทำให้อ่านง่าย บางครั้งรหัสที่สั้นกว่าก็สามารถอ่านได้มากขึ้นเช่นกัน ตัวอย่างเช่นคิดว่าฟังก์ชั่นแลมบ์ดาหรือผู้ได้รับมอบหมาย / ฟังก์ชั่นชั้นหนึ่งเมื่อเทียบกับชั้นเรียนวิธีเดียวที่ใช้อินเตอร์เฟซวิธีเดียว

  2. ควรประเมินความสามารถในการอ่านโดยพิจารณาจากความง่ายในการอ่านรหัสสำหรับโปรแกรมเมอร์ที่มีประสบการณ์พอสมควรซึ่งรู้จักภาษาและคุณสมบัติที่เป็นเอกลักษณ์ / คุณสมบัติขั้นสูงค่อนข้างดี


2

แง่มุมหนึ่งที่ฉันไม่คิดว่ายังพูดถึง: เป้าหมายของคุณคืออะไร?

หากสิ่งที่คุณใส่ใจคือความปลอดภัยในการทำงานให้มองหาความรัดกุมและความกะทัดรัดเหนือสิ่งอื่นใด ข้ามความคิดเห็นรหัสของคุณเช่นกัน

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

หมายเหตุ: ข้างต้นไม่ได้เกี่ยวกับคุณเป็นการส่วนตัว @Damovisa; สำหรับทุกคนที่เลือกระหว่างสองตำแหน่ง


ที่เสียงเหมือนงานรักษาความปลอดภัยแต่ถ้าคุณต้องการที่จะเป็นโปรแกรมเมอร์มันเป็นความมั่นคงในการทำงานที่ บริษัท ที่ไม่ถูกต้อง ... ;)
Alois Mahdal

2

มีสิ่งหนึ่งที่รุ่น verbose เป็นข้อได้เปรียบ

มันมีเส้นมากขึ้นและนักแก้จุดบกพร่องส่วนใหญ่เป็นแบบเส้น ! มันยากมากที่จะกำหนดจุดพักในการแสดงออก

กล่าวอีกนัยหนึ่งคุณต้องการเห็นตัวแก้ไขแบบใดหากคุณต้องการให้ดีบั๊กเกอร์เริ่มทำงานเมื่อboss == nullใด

(นั่นบอกว่าฉันชอบตัวดำเนินการ ?? -)


0

การอ่านควรมาก่อนระยะยาวคนส่วนใหญ่ใช้เวลาส่วนใหญ่แก้ไขหรือขยายรหัสที่มีอยู่ - การอ่านเป็นส่วนใหญ่ของการบำรุงรักษา

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

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