มีกรณีที่รหัส verbose เพิ่มเติม (ในงบตรรกะมากขึ้น) จะสะอาดกว่ารหัสรัดกุมมากขึ้น?
มีกรณีที่รหัส verbose เพิ่มเติม (ในงบตรรกะมากขึ้น) จะสะอาดกว่ารหัสรัดกุมมากขึ้น?
คำตอบ:
เพื่อที่จะตอบคำถามนี้ขอยกตัวอย่างโลกแห่งความจริงที่เกิดขึ้นกับฉัน ใน C # ห้องสมุดที่ฉันรักษาฉันมีรหัสต่อไปนี้:
TResult IConsFuncMatcher<T, TResult>.Result() =>
TryCons(_enumerator) is var simpleMatchData && !simpleMatchData.head.HasValue
? _emptyValue.supplied
? _emptyValue.value
: throw new NoMatchException("No empty clause supplied");
: _recursiveConsTests.Any()
? CalculateRecursiveResult()
: CalculateSimpleResult(simpleMatchData);
การอภิปรายเรื่องนี้กับเพื่อนร่วมงานผู้ตัดสินเป็นเอกฉันท์ก็คือการแสดงออกที่ไตรภาคซ้อนกันควบคู่ไปกับการใช้ "ฉลาด" ของis var
ผลในการกระชับ แต่ยากที่จะอ่านรหัส
ดังนั้นฉัน refactored มันไปที่:
TResult IConsFuncMatcher<T, TResult>.Result()
{
var simpleMatchData = TryCons(_enumerator);
if (!simpleMatchData.head.HasValue)
{
return _emptyValue.supplied
? _emptyValue.value
: throw new NoMatchException("No empty clause supplied");
}
return _recursiveConsTests.Any()
? CalculateRecursiveResult()
: CalculateSimpleResult(simpleMatchData);
}
return
รุ่นเดิมที่มีอยู่เพียงหนึ่งการแสดงออกของสารประกอบที่มีนัย รุ่นใหม่ในขณะนี้มีการประกาศตัวแปรอย่างชัดเจนเป็นคำสั่งและสองอย่างชัดเจนif
returns
มันมีงบมากขึ้นและบรรทัดของรหัสมากขึ้น แต่ทุกคนที่ฉันปรึกษาพิจารณาว่าอ่านง่ายและมีเหตุผลซึ่งเป็นประเด็นสำคัญของ "โค้ดที่ชัดเจน"
ดังนั้นคำตอบสำหรับคำถามของคุณคือการเน้นว่า "ใช่" verbose มากขึ้นสามารถสะอาดกว่ารหัสรัดกุมและจึงเป็น refactoring ที่ถูกต้อง
!
เงื่อนไขออก else
ฉันยังอยากจะแนะนำให้ใส่ผลตอบแทนที่สองใน แต่ถึงกระนั้นมันก็เป็นการปรับปรุงที่ยิ่งใหญ่
if (!foo.HasValue)
เป็นสำนวนในรหัสของคุณมากยิ่งขึ้นดังนั้น แต่if
ไม่ได้จริงๆทางออกต้น - มันเป็น "การทำเช่นนี้หรือว่าขึ้นอยู่."
1. การขาดความสัมพันธ์ระหว่าง LOC และคุณภาพของรหัส
เป้าหมายของการปรับโครงสร้างใหม่คือการปรับปรุงคุณภาพของรหัส
LOC เป็นตัวชี้วัดพื้นฐานที่บางครั้งมีความสัมพันธ์กับคุณภาพของรหัส: ตัวอย่างเช่นวิธีการที่มี LOC สองสามพันคนน่าจะมีปัญหาด้านคุณภาพ อย่างไรก็ตามควรสังเกตว่า LOC ไม่ใช่ตัวชี้วัดเพียงอย่างเดียวและในหลายกรณีขาดความสัมพันธ์กับคุณภาพ ตัวอย่างเช่นวิธี 4 LOC ไม่จำเป็นต้องสามารถอ่านได้มากกว่าหรือสามารถบำรุงรักษาได้มากกว่าวิธี 6 LOC
2. เทคนิคการสร้างโครงสร้างใหม่ประกอบด้วยการเพิ่ม LOCs
หากคุณใช้รายการของเทคนิคการรีแฟคเตอร์คุณสามารถมองเห็นเทคนิคที่รวมอยู่ในการเพิ่ม LOCs โดยเจตนา ตัวอย่าง:
ทั้งสองเป็นเทคนิคการรีแฟคเตอร์ที่มีประโยชน์มากและผลกระทบต่อ LOC นั้นไม่เกี่ยวข้องอย่างสมบูรณ์เมื่อพิจารณาว่าจะใช้หรือไม่
หลีกเลี่ยงการใช้ LOC
LOC เป็นตัวชี้วัดที่อันตราย ง่ายต่อการวัดและยากที่จะตีความอย่างถูกต้อง
จนกว่าคุณจะคุ้นเคยกับเทคนิคการวัดคุณภาพของรหัสให้พิจารณาหลีกเลี่ยงการวัด LOC ตั้งแต่แรก ส่วนใหญ่คุณจะไม่ได้รับอะไรที่เกี่ยวข้องและอาจมีบางกรณีที่จะทำให้คุณเข้าใจผิดในการลดคุณภาพของรหัสของคุณ
หากคุณต้องการที่จะเห็นผลที่ดีที่สุดเพียงแค่การลดจำนวนไบต์หรือนับ LoC ของรหัสที่มาของคุณไปมีลักษณะที่ส่งไปที่เว็บไซต์กอง Exchange Code กอล์ฟ
หากซอร์สโค้ดของคุณลดน้อยลงในลักษณะนี้คุณจะพบกับความยุ่งเหยิง แม้ว่าคุณจะเป็นคนที่เขียนรหัสดังกล่าวและเข้าใจมันอย่างเต็มที่ในเวลานั้นคุณจะมีประสิทธิภาพแค่ไหนเมื่อคุณกลับมาในอีกหกเดือนข้างหน้า? ไม่มีหลักฐานว่ารหัสขั้นต่ำสุดดังกล่าวสามารถดำเนินการใด ๆ ได้เร็วขึ้น
ควรเขียนโค้ดในลักษณะที่สมาชิกในทีมของคุณสามารถดูได้และเข้าใจสิ่งที่กำลังทำอยู่ในทันที
ใช่การเปลี่ยนโครงสร้างใหม่อาจส่งผลให้มีโค้ดมากกว่าหนึ่งบรรทัด
IMO กรณีที่พบบ่อยที่สุดคือเมื่อคุณใช้รหัสที่ไม่ใช่แบบทั่วไปและคุณทำให้มันเป็นแบบทั่วไป / ยืดหยุ่นมากขึ้น การสร้างรหัสอย่างง่ายดายทำให้บรรทัดของโค้ดเพิ่มขึ้นอย่างมาก (บางครั้งด้วยปัจจัยสองอย่างหรือมากกว่า)
หากคุณคาดว่ารหัสทั่วไปใหม่จะถูกใช้โดยผู้อื่น (แทนที่จะเป็นเพียงส่วนประกอบซอฟต์แวร์ภายใน) เป็นไลบรารีคุณจะต้องเพิ่มรหัส unittest และมาร์กอัพเอกสารในรหัสซึ่งจะเพิ่มบรรทัดของรหัสอีกครั้ง
ตัวอย่างเช่นนี่เป็นสถานการณ์ทั่วไปที่เกิดขึ้นกับนักพัฒนาซอฟต์แวร์ทุกคน:
ตัวอย่างที่เป็นรูปธรรมบางอย่างที่ทำให้ฉันหลุดจากหัวของฉัน: