คำพูดของ Robert C. Martin ถูกนำออกจากบริบท นี่คือคำพูดที่มีบริบทอีกเล็กน้อย:
ไม่มีอะไรที่จะเป็นประโยชน์ได้มากเท่ากับความเห็นที่วางไว้อย่างดี ไม่มีอะไรที่จะทำให้โมดูลยุ่งเหยิงไปกว่าความคิดเห็นที่ไร้เหตุผลได้ ไม่มีอะไรที่จะสร้างความเสียหายได้ในฐานะที่เป็นความคิดเห็นที่โหดเหี้ยมเก่าแก่ที่เผยแพร่การโกหกและข้อมูลที่ผิด
ความเห็นไม่เหมือนรายการของชินด์เลอร์ พวกเขาไม่ใช่ "ดีบริสุทธิ์" แท้จริงแล้วความคิดเห็นคือสิ่งที่ดีที่สุดที่เป็นความชั่วร้ายที่จำเป็น หากภาษาการเขียนโปรแกรมของเรามีความหมายเพียงพอหรือถ้าเรามีความสามารถในการใช้ภาษาเหล่านั้นอย่างละเอียดเพื่อแสดงเจตนาของเราเราจะไม่ต้องการความคิดเห็นอย่างมาก
การใช้ความคิดเห็นที่เหมาะสมคือการชดเชยความล้มเหลวของเราในการแสดงรหัสของเราเอง โปรดทราบว่าฉันใช้คำว่าล้มเหลว ฉันหมายถึงมัน. ความคิดเห็นมักจะล้มเหลว เราต้องมีพวกเขาเพราะเราไม่สามารถหาวิธีแสดงออกได้โดยปราศจากพวกเขา แต่การใช้งานของพวกเขาไม่ใช่สาเหตุของการเฉลิมฉลอง
ดังนั้นเมื่อคุณพบว่าตัวเองอยู่ในตำแหน่งที่คุณต้องการเขียนความคิดเห็นให้คิดทบทวนและดูว่าไม่มีวิธีใดที่จะทำให้ตารางและแสดงออกด้วยตัวคุณเองในโค้ด ทุกครั้งที่คุณแสดงออกด้วยรหัสคุณควรลูบหลังตัวเอง ทุกครั้งที่คุณเขียนความคิดเห็นคุณควรทำหน้าตาบูดบึ้งและรู้สึกถึงความล้มเหลวในการแสดงออกของคุณ
(คัดลอกมาจากที่นี่แต่ข้อความต้นฉบับมาจากClean Code: คู่มือของงานฝีมือซอฟต์แวร์ Agile )
วิธีลดคำพูดนี้ลงใน "ความคิดเห็นมักจะล้มเหลว" เป็นตัวอย่างที่ดีของวิธีที่บางคนจะใช้คำพูดที่เหมาะสมออกจากบริบทและเปลี่ยนเป็นความเชื่อที่โง่เขลา
เอกสาร API (เช่น Javadoc) ควรจะเอกสาร API เพื่อให้ผู้ใช้สามารถใช้งานได้โดยไม่ต้องอ่านรหัสที่มา ดังนั้นในกรณีนี้เอกสารควรอธิบายวิธีการที่ทำ ตอนนี้คุณสามารถยืนยันได้ว่า "การเรียกคืนผลิตภัณฑ์ด้วยรหัส" นั้นซ้ำซ้อนเนื่องจากมีการระบุไว้แล้วโดยชื่อวิธีการ แต่ข้อมูลที่null
อาจถูกส่งคืนนั้นมีความสำคัญต่อเอกสารอย่างแน่นอนเนื่องจากสิ่งนี้ไม่ชัดเจน
หากคุณต้องการหลีกเลี่ยงความจำเป็นของความคิดเห็นคุณต้องลบปัญหาพื้นฐาน (ซึ่งเป็นการใช้null
เป็นค่าส่งคืนที่ถูกต้อง) โดยทำให้ API ชัดเจนยิ่งขึ้น ตัวอย่างเช่นคุณสามารถส่งคืนประเภทบางOption<Product>
ประเภทได้ดังนั้นลายเซ็นประเภทจะสื่อสารอย่างชัดเจนว่าจะส่งคืนอะไรในกรณีที่ไม่พบผลิตภัณฑ์
แต่ในกรณีใด ๆ มันไม่เป็นความจริงที่จะจัดทำเอกสาร API อย่างสมบูรณ์เพียงแค่ใช้ชื่อเมธอดและลายเซ็นชนิด ใช้ doc-comments สำหรับข้อมูลที่ไม่ชัดเจนเพิ่มเติมซึ่งผู้ใช้ควรทราบ รับเอกสาร API จากDateTime.AddMonths()
ใน BCL:
AddMonths วิธีการคำนวณเดือนและปีที่เกิดขึ้นโดยคำนึงถึงปีอธิกสุรทินและจำนวนวันในหนึ่งเดือนจากนั้นปรับส่วนวันของวัตถุ DateTime ผล หากวันที่เกิดขึ้นไม่ใช่วันที่ถูกต้องในเดือนที่เกิดขึ้นจะใช้วันที่สุดท้ายของเดือนนั้น ๆ ตัวอย่างเช่น 31 มีนาคม + 1 เดือน = 30 เมษายน ส่วนเวลาของวันที่ของวัตถุ DateTime ที่เป็นผลลัพธ์ยังคงเหมือนกับอินสแตนซ์นี้
ไม่มีทางที่คุณจะแสดงสิ่งนี้ได้โดยใช้ชื่อเมธอดและลายเซ็น! แน่นอนว่าเอกสารประกอบการเรียนของคุณอาจไม่ต้องการรายละเอียดในระดับนี้เป็นเพียงตัวอย่างเท่านั้น
ความคิดเห็นแบบอินไลน์ก็ไม่เลวเช่นกัน
Badความคิดเห็นที่ไม่ดี ตัวอย่างเช่นความคิดเห็นที่อธิบายสิ่งที่สามารถมองเห็นได้เพียงเล็กน้อยจากโค้ดตัวอย่างคลาสสิก ได้แก่ :
// increment x by one
x++;
ความคิดเห็นที่อธิบายบางสิ่งที่สามารถทำให้ชัดเจนโดยการเปลี่ยนชื่อตัวแปรหรือวิธีการหรือปรับโครงสร้างโค้ดเป็นกลิ่นรหัส:
// data1 is the collection of tasks which failed during execution
var data1 = getData1();
สิ่งเหล่านี้เป็นความคิดเห็นของมาร์ตินที่ต่อต้าน ความคิดเห็นเป็นอาการของความล้มเหลวในการเขียนรหัสที่ชัดเจน - ในกรณีนี้ให้ใช้ชื่ออธิบายตนเองสำหรับตัวแปรและวิธีการ ความคิดเห็นนั้นแน่นอนว่าไม่ใช่ปัญหาปัญหาคือเราต้องการความคิดเห็นเพื่อทำความเข้าใจโค้ด
แต่ควรใช้ความคิดเห็นเพื่ออธิบายทุกอย่างที่ไม่ชัดเจนจากรหัสเช่นสาเหตุที่รหัสถูกเขียนด้วยวิธีที่ไม่ชัดเจน:
// need to reset foo before calling bar due to a bug in the foo component.
foo.reset()
foo.bar();
ความคิดเห็นที่อธิบายสิ่งที่ชิ้นส่วนของรหัสที่ซับซ้อนเกินควรเป็นกลิ่น แต่การแก้ไขไม่ได้เป็นการแสดงความคิดเห็นนอกกฎหมายการแก้ไขคือการแก้ไขรหัส! ในความจริงแล้วโค้ดที่ซับซ้อนเกิดขึ้น (หวังว่าจะเป็นการชั่วคราวจนกว่าจะมี refactor) แต่ไม่มีนักพัฒนาธรรมดาที่เขียนโค้ดที่สมบูรณ์แบบในครั้งแรก เมื่อรหัสที่ซับซ้อนเกิดขึ้นจะดีกว่ามากในการเขียนความคิดเห็นอธิบายสิ่งที่มันไม่ได้มากกว่าการเขียนความคิดเห็น ความคิดเห็นนี้จะทำให้ง่ายขึ้นในการสร้างใหม่ในภายหลัง
บางครั้งรหัสมีความซับซ้อนอย่างหลีกเลี่ยงไม่ได้ อาจเป็นอัลกอริทึมที่ซับซ้อนหรืออาจเป็นรหัสที่ทำให้เกิดความชัดเจนด้วยเหตุผลด้านประสิทธิภาพ จำเป็นต้องแสดงความคิดเห็นอีกครั้ง