“ ความคิดเห็นเป็นกลิ่นรหัส” [ปิด]


100

ผู้ร่วมงานของผมเชื่อว่าการใด ๆ ที่ใช้ในการแสดงความคิดเห็นรหัส (เช่นไม่ใช่วิธีการรูปแบบ Javadoc หรือระดับความคิดเห็น) เป็นกลิ่นรหัส คุณคิดอย่างไร?


44
ฉันจะตอบคำถามใด ๆ ที่บอกว่า "ไม่"
นิโคล

2
@Renesis นั่นคือกลิ่นของพระเจ้า
ixtmixilix

107
เพื่อนร่วมงานของคุณทำลักษณะทั่วไปกวาดซึ่งโดยอัตโนมัติหมายความว่าเขาเป็นสิ่งที่ผิด :)
Alex Feinman

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

5
@ อเล็กซ์นั่นไม่ใช่ภาพรวมที่ครอบคลุมซึ่งเป็นสิ่งที่ผิด (ส่งผลให้เขาไม่ผิดเลย)

คำตอบ:


167

เฉพาะในกรณีที่ความคิดเห็นอธิบายสิ่งที่รหัสกำลังทำอยู่

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

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

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

อย่างไรก็ตามสิ่งที่สำคัญที่สุดคือการเปลี่ยนความคิดเห็นของคุณเมื่อคุณเปลี่ยนรหัสของคุณ หากคุณเปลี่ยนอัลกอริทึมตรวจสอบให้แน่ใจว่าได้อัปเดตความคิดเห็นด้วยเหตุผลที่คุณไปกับอัลกอริธึม X บน Y ความคิดเห็นที่เก่าเกินไปเป็นกลิ่นรหัสที่ใหญ่กว่า


8
ฉันเห็นด้วยกับคำตอบนี้แสดงความคิดเห็น แต่ฉันก็เห็นว่ามันเป็นข้ออ้างสำหรับการขาดเอกสารซึ่งเป็นความผิด รหัสการอ่านเป็นความเจ็บปวดในตูดบางครั้ง คุณไม่ควรต้องไปดูที่รหัสสำหรับวิธีการที่จะคิดออกว่าวิธีการที่ไม่ คุณควรจะสามารถหาได้จากชื่อและรับรายละเอียดเพิ่มเติมจากเอกสาร เมื่ออ่านรหัสคุณมักจะต้องเปลี่ยนจากคลาสเป็นคลาสและเปลี่ยนเป็นไฟล์ โดยเฉพาะอย่างยิ่งปัญหาในภาษาแบบไดนามิกที่การเขียน IDE ที่สามารถจัดการทั้งหมดนี้เป็นเรื่องไม่สำคัญ
davidtbernal

1
อย่างไรก็ตามบางครั้งคุณต้องแสดงความคิดเห็นด้วยว่ามันซับซ้อนหรือไม่ (โดยเฉพาะอย่างยิ่งถ้ามันได้รับการปรับปรุงให้ดีที่สุดหรือการปฏิบัติการที่ไม่สำคัญอื่น ๆ ) ถ้าฉันมีการใช้จ่ายมากขึ้นกว่า 5 นาทีอ่านบล็อกหนึ่งของรหัสที่จะเข้าใจในสิ่งที่มันทำ, สามารถทำลายสวย ...
Khelben

3
"เฉพาะในกรณีที่ความคิดเห็นอธิบายสิ่งที่รหัสกำลังทำอยู่" หรือหากความคิดเห็นอธิบายสิ่งที่รหัสที่ใช้ทำ; รหัสมีการเปลี่ยนแปลง แต่ความคิดเห็นยังไม่ได้
Bruce Alderman

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

2
@ back2dos ถ้าคุณอาเจียนบ่อย ๆ เมื่ออ่านรหัสคนอื่น ๆ ฉันดีใจที่เราไม่ได้แชร์สำนักงาน ...

110

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

เพื่อนร่วมงานของคุณมีประสบการณ์ไม่เพียงพอ


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

8
@Liggy: ฉันต้องการ มันเป็นอัลกอริธึมการวิจัยไม่ใช่แอปพลิเคชันทางธุรกิจ
พอลนาธาน

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

29
คณิตศาสตร์คณิตศาสตร์คณิตศาสตร์ ไม่ใช่รหัสทั้งหมดที่ใช้กาว IoC เล็ก ๆ น้อย ๆ และ 'ราคา * ปริมาณ' คณิตศาสตร์เชิงซ้อนไม่สามารถอธิบายด้วยตนเองได้อย่างน่าอัศจรรย์
bmargulies

4
@Liggy รหัสที่ใช้โครงสร้างข้อมูลที่ซับซ้อนอาจไม่สามารถเข้าใจได้อย่างสมบูรณ์โดยไม่มีเอกสารประกอบมากมาย

75

ความคิดเห็นควรอธิบายว่าทำไมไม่ใช่อย่างนั้น

Howความคิดเห็นประเภทมักจะดีกว่าจัดการกับการใช้ refactoring โดยส่วนตัวแล้วฉันมักจะหลีกเลี่ยงความคิดเห็นเพื่อสนับสนุนการปรับโครงสร้างใหม่

ก่อน:

# convert to cents
a = x * 100

# avg cents per customer 
avg = a / n

# add to list
avgs < avg
t += 1

หลังจาก:

total_cents = total * 100
average_per_customer = total_cents / customer_count

track_average(average_per_customer)

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

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

3
@ Stuart ชื่อฟังก์ชั่นควรบอกว่ามันทำอะไร
Alb

3
@ GS ฉันไม่เห็นด้วยอีกแล้ว หากรหัสนั้นซับซ้อนควรแบ่งออกเป็นวิธีการ / ฟังก์ชั่นขนาดเล็กที่มีชื่อที่เหมาะสมซึ่งอธิบายถึงการกระทำ
CaffGeek

1
คุณคิดว่าคุณสามารถควบคุมรหัสฐานได้อย่างสมบูรณ์
LennyProgrammers

32

ฉันขอประกาศเพื่อนร่วมงานของคุณว่าเป็นคนนอกรีต! รองเท้าบู๊ ธ ของคนนอกรีตของฉันอยู่ที่ไหน

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

ความเห็นจริงจากรหัสที่ฉันใช้:


    // If this happens, somebody's been screwing around with the database definitions and
    // has removed the restriction that a given alarm may have only one entry in the 
    // notifications table.  Bad maintenance programmer!  Bad!  No biscuit!



    // If an alert is active on our side but inactive on theirs, that might mean
    // they closed the alert.  (Or that we just haven't told them about it yet.)  The
    // logic comes later; for now, we'll just compile it in a list.



    // If we know for a fact that an alarm isn't getting through, we're going to whine pretty
    // aggressively about it until it gets fixed.


7
+1 สำหรับความคิดเห็นที่ดี ไม่มีรหัสใดที่สามารถพูดได้ว่า "หากเกิดเหตุการณ์นี้มีใครบางคนกำลังสับสนกับคำจำกัดความของฐานข้อมูล"
DistantEcho

9
@Niphra เอาล่ะเราสามารถโยนSomebodyScrewedAroundWithDatabaseException...

@ Thorbjørn +1, หากรหัสรู้ว่ามีอะไรผิดจะต้องรายงานให้ดี ลูกค้าที่สนับสนุนเทคโนโลยีสามารถโหลด DB ซ้ำได้และหลีกเลี่ยงการโทรหาบริการ
ทิม Williscroft

@Tim เนื่องจากลูกค้าอาจเห็นสิ่งนี้การตั้งชื่อที่เป็นกลางกว่าอาจเหมาะสม

3
แน่นอนว่าจำไว้ว่า: อย่าใช้ชื่อที่โง่ ลูกค้าจะเห็นพวกเขาเสมอ
ทิม Williscroft

29

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

สิ่งที่คุณควรหลีกเลี่ยงอย่างยิ่งคือ "รหัสความคิดเห็นซ้ำซ้อน" (ความคิดเห็นที่ไม่ได้เพิ่มโค้ดใด ๆ ลงในโค้ด):

i++; // Increment i by 1

จากนั้นหากมีการออกแบบและจัดทำโค้ด (และดูแลรักษา / จัดตำแหน่ง) ที่ดีการแสดงความคิดเห็นนั้นมีประโยชน์น้อยกว่า

แต่ในบางสถานการณ์ความคิดเห็นสามารถช่วยอ่านโค้ดได้ดี:

while( foo )
{
     if( dummy )
     {
     }
     else // !dummy
     {
     }
} // end while( foo )

อย่าลืมว่าคุณต้องรักษาและซิงค์อย่างต่อเนื่องเช่นกันความคิดเห็น ... ความคิดเห็นที่ล้าสมัยหรือผิดอาจเป็นความเจ็บปวดที่น่ากลัว! และตามกฎทั่วไปการแสดงความคิดเห็นมากเกินไปอาจเป็นอาการของการเขียนโปรแกรมที่ไม่ดี


2
หลักการตั้งชื่อที่ดีและรหัสที่มีโครงสร้างที่ดีจะช่วยให้คุณลดความต้องการได้ อย่าลืมว่าความคิดเห็นแต่ละบรรทัดที่คุณเพิ่มเป็นบรรทัดใหม่ในการรักษา !!
Gabriel Mongeon

81
ฉันเกลียดเมื่อมีคนใช้ตัวอย่างที่สองในคำถามของคุณ } //end whileแค่หมายถึงจุดเริ่มต้นของวงขณะที่อยู่ไกลคุณไม่สามารถมองเห็นได้และไม่มีคำใบ้ว่ารหัสที่คุณกำลังดูอยู่ในรูปแบบวนซ้ำ ควรทำการรีฟอร์เรชั่นหนัก ๆ เพื่อแสดงความคิดเห็นอย่างจริงจังว่าโค้ดนั้นมีโครงสร้างอย่างไร
Carson Myers

4
@Carson: ในขณะที่การบล็อกสั้น ๆ เป็นกฎที่รู้จักกันดีก็ไม่ได้หมายความว่าเราสามารถใช้มันได้เสมอ
Wizard79

4
@Carson: หนึ่งในโครงการที่ฉันทำงานอยู่นั้นมีการตรวจสอบโค้ดไม่เพียงพอซึ่งนำไปสู่การรวบรวม JSP ด้วยความซับซ้อนตามวัฏจักรของ "OMFG JUST KILL YOURSELF" การทำให้สิ่งที่เปื้อนเลือดนั้นเป็นวันทำงานที่ต้องใช้เวลาที่อื่น } // end whileความคิดเห็นเหล่านั้นสามารถช่วยชีวิต
BlairHippo

11
@BlairHippo: "[A] กลิ่นรหัสเป็นอาการใด ๆ ในซอร์สโค้ดของโปรแกรมที่อาจบ่งบอกถึงปัญหาที่ลึกลงไป" แน่นอนว่าความคิดเห็นคือการช่วยชีวิต แต่ OMGWTF-loop เป็น "ปัญหาที่ลึกกว่า" ดังกล่าวข้างต้นและความจำเป็นของการช่วยชีวิตเป็นตัวบ่งชี้ที่ชัดเจน;)
back2dos

26

การกำหนดวิธีการหรือกระบวนการอย่างชัดเจนในฐานะ "รหัสกลิ่น" คือ "กลิ่น zealotry" คำนี้กำลังกลายเป็น "การพิจารณาที่เป็นอันตราย" ใหม่

โปรดจำไว้ว่าสิ่งเหล่านี้ควรเป็นแนวทาง

คำตอบอื่น ๆ อีกมากมายให้คำแนะนำที่ดีว่าควรให้ความคิดเห็นเมื่อใด

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

สร้างใหม่ทุกอย่างจนกว่าเด็กอนุบาลจะเข้าใจว่ามันไม่ได้เป็นการใช้เวลาอย่างมีประสิทธิภาพและอาจจะไม่ทำงานเช่นเดียวกับเวอร์ชั่นที่กระชับกว่า

ความคิดเห็นไม่ส่งผลกระทบต่อเวลาทำงานดังนั้นปัญหาเชิงลบเดียวที่ต้องพิจารณาคือการบำรุงรักษา


8
ฉันคิดว่า "รูปแบบการต่อต้าน" เป็นแบบใหม่ "ถือว่าเป็นอันตราย" กลิ่นรหัสเป็นเพียงสิ่งที่ต้องมีการตรวจสอบอย่างละเอียดเพื่อทำความสะอาด
Jeffrey Hantin

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

4
+1 สำหรับ "การปรับโครงสร้างทุกอย่างใหม่จนกว่าเด็กอนุบาลจะเข้าใจว่ามันไม่ได้เป็นการใช้เวลาอย่างมีประสิทธิภาพและอาจจะไม่ทำงานเช่นเดียวกับเวอร์ชั่นที่กระชับกว่า"
Earlz

23

ในบางกรณีไม่มีการตั้งชื่อที่ดีการเปลี่ยนโครงสร้างใหม่เป็นต้นสามารถแทนที่ความคิดเห็นได้ เพียงแค่ดูตัวอย่างในโลกแห่งความเป็นจริง (ภาษาคือ Groovy):

  response.contentType="text/html"
  render '{"success":true}'

ดูแปลกใช่ไหม? น่าจะเป็นข้อผิดพลาดในการคัดลอกวาง? ร้องหาข้อผิดพลาดหรือไม่?

ตอนนี้เหมือนกันกับความคิดเห็น:

  // DO NOT TOUCH THE FOLLOWING TWO LINES; the ExtJS UploadForm requires it exactly like that!!!
  response.contentType="text/html"  // must be text/html so the browser renders the response within the invisible iframe, where ExtJS can access it
  render '{"success":true}'         // ExtJS expects that, otherwise it will call the failure handler instead of the succss handler

ฟังก์ชั่น prime_extjs_uploadform () {response.contentType = 'text / html'; แสดงผล '{"สำเร็จ": จริง}'; } prime_extjs_uploadform ();
DrPizza

23

ปัญหาหลักที่นี่คือความหมายของคำว่า "รหัสกลิ่น"

หลายคน (รวมถึงคุณด้วยฉันคิดว่า) เข้าใจถึงกลิ่นของรหัสเพื่อเป็นสิ่งที่ใกล้เคียงกับข้อผิดพลาดหรืออย่างน้อยสิ่งที่ต้องได้รับการแก้ไข บางทีคุณคิดว่ามันเป็นคำพ้องกับ "anti-pattern"

นี่ไม่ใช่ความหมายของคำว่า!

การเปรียบเทียบกลิ่นรหัสนั้นมาจากWards Wikiและพวกมันเน้น:

โปรดทราบว่า CodeSmell เป็นคำใบ้ว่ามีบางอย่างผิดปกติไม่ใช่เรื่องที่แน่นอน สำนวนที่ดีอย่างสมบูรณ์อาจได้รับการพิจารณาว่าเป็น CodeSmell เพราะมักใช้ในทางที่ผิด การเรียกสิ่งที่ CodeSmell ไม่ใช่การโจมตี มันเป็นเพียงสัญลักษณ์ที่จะรับประกันได้ว่า

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

นั่นคือความหมายสำหรับความคิดเห็นที่จะมีกลิ่นรหัส

แก้ไข: ฉันเพิ่ง stumpled บทความเหล่านี้สองซึ่งอธิบายได้ดีกว่าฉัน:


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

การยืนยันกรณีทั่วไปยังคงผิด คุณไม่พูดว่า "ฉันเห็นรหัสที่แสดงความคิดเห็นนั่นเป็นสัญญาณที่ไม่ดี"
Stuart P. Bentley

1
@ Stuart: คุณกำลังดูโค้ดสองอันซึ่งทั้งสองมีระดับความคิดเห็นที่เหมาะสม (ปัญหานี้ไม่ได้เกี่ยวกับจำนวนความคิดเห็นที่เหมาะสมมันเป็นเรื่องเกี่ยวกับวิธีที่คุณตัดสินโค้ดตามจำนวนความคิดเห็น) หนึ่งไม่มีความคิดเห็นอื่น ๆ มีตัน สิ่งใดที่คุณมองอย่างใกล้ชิด? - ความคิดเห็นเป็นสัญญาณว่ารหัสนั้นซับซ้อนและบอบบางและมีแนวโน้มที่จะมีปัญหามากกว่า
David Schwartz

นี่คือคำตอบที่ถูกต้อง
vidstige

21

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


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

ไม่คุณควรจินตนาการนักจิตแพทย์ที่รู้ว่าคุณอยู่ที่ไหน: พวกเขายินดีที่จะรักษารหัสของคุณหรือไม่?
Richard

4
ฉันกลายเป็นนักโรคจิตเป็นประจำเมื่อฉันเห็นโค้ดที่อ่านไม่ได้
LennyProgrammers

3
5 ปี? มากขึ้นเช่น 5 นาที ;)
Alex Feinman

11

ความคิดที่ดีที่จะมีความคิดเห็นที่ถูกต้องคือการเริ่มต้นด้วยการเขียนความคิดเห็น

// This function will do something with the parameters, 
// the parameters should be good according to some rules.
myFunction(parameters)
{
    // It will do some things to get started.

    // It will do more with the stuff.

    // It will end doing things with the stuff.
}

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

// This function will do something with the parameters, 
// the parameters should be good according to some rules.
myfunction(parameters)
{
  var someThing = initializedWithSomething;

  doSomethingWith(someThing);

  doMoreWith(someThing);

  endDoingThingsWith(someThing);

  return someThing;
}

// This function will do some things to get started,
// the parameters should be good according to some rules.
doSomethingWith(parameters)
{
  parameters.manipulateInSomeWay();
  ... etc ...
}

... etc ...

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

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

หากมีการใช้พารามิเตอร์มากเกินไปก็ควรเป็นสมาชิกส่วนตัวในชั้นเรียนของคุณ


1
นี่คือสิ่งที่ฉันทำ หากคุณคิดว่าคุณต้องการความคิดเห็นฉันขอแนะนำให้ลองใช้สิ่งนี้แทน
bzlm

10

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


10
// Dear me in the future. Please, resolve this problem.

หรือ

// You think this code was written by somebody else. 
// No, it wasn't. You ([some name]) did it.

อา, จริงใจขอร้องตัวเองในอนาคต
Anthony Pegram

8

ความคิดเห็นเกี่ยวกับโค้ดไม่ใช่ "กลิ่นรหัส" อย่างแน่นอน โดยทั่วไปแล้วความเชื่อนี้มาจากความจริงที่ว่าความคิดเห็นอาจกลายเป็นสิ่งล้าสมัยและล้าสมัย อย่างไรก็ตามการมีความคิดเห็นที่ดีซึ่งอธิบายว่าทำไมรหัสกำลังทำบางสิ่งบางอย่างในวิธีที่สามารถ (และมักจะ) สำคัญสำหรับการบำรุงรักษา

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

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

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

Sams สอนตัวเอง Visual C # 2010 ใน 24 ชั่วโมงหน้า 348-349


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

@ Lenny222: ใช่ความคิดเห็นสามารถค้าง ... ซึ่งมักจะบ่งบอกถึงโปรแกรมเมอร์ขี้เกียจ หากความคิดเห็นอธิบายถึงสาเหตุที่ทำให้เกิดการสืบทอดทำไมรหัสใช้อัลกอริทึมเฉพาะสำหรับการคำนวณหรืออธิบายวิธีการทำงานของรหัสแล้วไม่มีเหตุผลสำหรับความคิดเห็นที่จะกลายเป็นเก่ากว่าคนอื่นเปลี่ยนการใช้งานและไม่ปรับปรุงความคิดเห็นตาม - ซึ่งเทียบเท่ากับการขี้เกียจ
Scott Dorman

2
ฉันเห็นด้วย. ประเด็นของฉันคือมีความเสี่ยงที่จะกลายเป็นเหม็นอับใช่ แต่เมื่อฉันมีฟังก์ชั่น doBar () และหลังจาก 3 ปีมันไม่ได้ "ทำแถบ" แต่มัน "ทำแถบและ foo ยกเว้นวันพุธ" ดังนั้นความหมายของฟังก์ชั่นก็อาจจะเก่าเกินไป และชื่อตัวแปร แต่ฉันหวังว่าจะไม่มีใครรับสิ่งนี้ด้วยเหตุผลที่จะไม่ให้ชื่อฟังก์ชันและตัวแปรที่มีความหมาย
LennyProgrammers

6

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


6

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


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

4

การกล่าวถึงอันทรงเกียรติคือรูปแบบการต่อต้าน:

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


4

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

ความคิดเห็นควรอธิบายถึงเจตนาของรหัสเพื่อที่ว่าหากมีข้อผิดพลาดบางคนที่อ่านความคิดเห็น + รหัสจะมีโอกาสค้นพบมัน

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


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

"ถ้าคุณอ่านโค้ดและคิดว่ามันเป็น X เมื่อในความเป็นจริงแล้วมันจะเป็น Y" นั่นไม่ใช่สิ่งที่ฉันพูด ผมกำลังพูดถึงการทำความเข้าใจสิ่งรหัสไม่ทำ แต่ไม่ได้สิ่งที่มันควรจะทำอย่างไร สมมติว่าคุณสงสัยว่ามีข้อผิดพลาดแบบออฟไลน์ คุณจะรู้ได้อย่างไรว่าข้อผิดพลาดแบบออฟไลน์ไม่อยู่ในรหัสการใช้งานแทนหรือรหัสนี้? ความคิดเห็นอธิบายถึงเจตนาของรหัสซึ่งช่วยอย่างมากในการติดตามข้อบกพร่อง
Danny Tuppeny

ในทางกลับกันความคิดเห็นอาจบอกคุณได้เพียงว่ารหัสควรทำอย่างไรเมื่อถึงเวลาที่ความคิดเห็นถูกเขียนขึ้น รหัสอาจบอกคุณว่าควรจะทำอะไรในตอนนี้ ความคิดเห็นไม่ได้รวบรวม คุณไม่สามารถทดสอบความคิดเห็น พวกเขาอาจหรืออาจไม่ถูกต้อง
Anthony Pegram

3

ความคิดเห็นที่ใส่ในเพราะมีคนคิดว่ามันโอเคที่จะมี 700 บรรทัดในวิธีการหนึ่งเป็นกลิ่น

ความคิดเห็นที่มีเพราะคุณรู้ว่าถ้าคุณไม่ได้ใส่ความคิดเห็นใครบางคนจะทำผิดพลาดเหมือนเดิมอีกครั้งเป็นกลิ่น

ความคิดเห็นที่ใส่ไว้เนื่องจากเครื่องมือวิเคราะห์รหัสบางอย่างต้องการมันก็เป็นกลิ่น

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


3

ฉันจะตอบด้วยคำถามของฉันเอง คุณพบข้อผิดพลาดในโค้ดที่ไม่ใส่เครื่องหมายด้านล่างหรือไม่

tl; dr: บุคคลต่อไปในการรักษารหัสของคุณอาจไม่เหมือนพระเจ้าอย่างที่คุณเป็น

 [org 0x7c00]

 main:
  mov ah, 0x0e
  mov bx, string
  call strreverse
  call print

 stop:
  jmp $

 strreverse:
  pusha
  mov dx, bx
  mov cx, 0

 strreverse_push:
  mov al, [bx]
  cmp al, 0
  je strreverse_pop
  push ax
  add bx, 1
  add cx, 1
  jmp strreverse_push

 strreverse_pop:
  mov bx, dx

 strreverse_pop_loop:
  cmp cx, 0
  je strreverse_end
  pop ax
  mov [bx], al
  sub cx, 1
  add bx, 1
  jmp strreverse_pop_loop

 strreverse_end:
  popa
  ret

 print:
  pusha

 print_loop:
  mov al, [bx]
  cmp al, 1
  je print_end
  int 0x10
  add bx, 1
  jmp print_loop

 print_end:
  popa
  ret
 string:
  db 'Boot up', 0

 times 510 -( $ - $$ ) db 0
 dw 0xaa55

แต่ในวันนี้และอายุคุณไม่ได้ใช้ค่าระดับสูงหรือไม่?
เอียน

2
@Ian: โปรแกรมเป็น bootloader ของ IBM-PC คุณไม่สามารถเขียนมันในสิ่งอื่นใดนอกจากชุดประกอบเนื่องจากคุณต้องการการควบคุมทั้งหมดที่โปรแกรมอยู่ใน RAM ที่มีข้อความสั้นสุดท้ายปรากฏขึ้นและบางส่วนของอินเตอร์รัปต์ฮาร์ดแวร์ รับสำเนา NASM อย่างจริงจัง รวบรวมเขียนมันไปยังเซกเตอร์สำหรับบู๊ตของฟลอปปี้หรืออุปกรณ์ USB และทำการบู๊ต แม้ว่าคุณอาจจะพบว่ามันใช้งานไม่ได้ตามที่คาดไว้เพราะข้อผิดพลาด ตอนนี้พบข้อผิดพลาด ... ไม่ว่าฉันจะแน่ใจว่าในอีก 20 ปีต่อจากนี้ผู้คนจะถามสิ่งเดียวกันกับ Java ที่ไม่ใส่ร้าย
มด

แน่นอนรหัสสามารถเขียนใน C หรือ C ++ และไบนารีประกอบจากรหัสวัตถุ C และเครื่องมือภายนอกบางอย่าง
kevin cline

แต่น่าเสียดายที่ไม่ได้. ดูที่หน้านี้ใน CodeProject: codeproject.com/KB/tips/boot-loader.aspx - "ภาษาระดับสูงไม่มีคำแนะนำที่จำเป็น" ไม่เพียงแค่นั้น แต่คุณมีเพียง 512 ไบต์ที่จะเล่นใน bootloader บางครั้งคุณต้องไปที่ฮาร์ดแวร์โดยตรง
Ant

1
เมื่อทำการเข้ารหัสแอสเซมบลีฉันจะทำสิ่งที่คนอื่นทำ - แสดงความคิดเห็นทุกบรรทัดเดียวกับสิ่งที่มันทำ บรรทัดที่มีปัญหาจะมีความคิดเห็น "ตรวจสอบว่าตัวอักษรเป็น 0" เนื่องจากรหัสจะใช้สตริงที่ลงท้ายด้วย 0 ของ C-style เมื่อความคิดเห็นนั้นเข้ามามันก็ง่ายที่จะเห็นว่าโค้ดกำลังทำ cmp ด้วย 1 ซึ่งหมายความว่ามันจะติดอยู่ในลูปที่ไม่มีที่สิ้นสุดหรือพิมพ์ขยะจนกว่าจะเจอ 1 ในแรมแบบสุ่ม ฉันอาจได้เพิ่มความคิดเห็นเกี่ยวกับความจริงที่ว่าสตริงนั้นสิ้นสุดลงด้วย 0 ซึ่งไม่ปรากฏชัดเจนจากรหัส มีสิ่งเช่นการทดสอบหน่วยอัตโนมัติสำหรับการเข้ารหัสประกอบ?
Ant

2

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

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

นอกจากนี้ความคิดเห็นมีประโยชน์มากในการเพิ่ม "caveats" เช่น "ระวัง! หากรูปแบบของอินพุตไม่ใช่ ASCII รหัสนี้จะต้องเปลี่ยน!"


คุณสามารถอธิบายสิ่งที่คุณหมายถึงโดย "ความคิดเห็นที่ดำเนินการต่อบล็อกของรหัส"?
ทำเครื่องหมาย C

2

การอ่านสิ่งนี้ฉันนึกถึงบางสิ่งที่ฉันได้อ่านเป็นครั้งแรก (จากรายชื่อที่นานกว่านั้นเก็บรักษาไว้โดยการถ่ายสำเนา) หลายทศวรรษมาแล้ว:

โปรแกรมเมอร์จริงไม่ได้เขียนความคิดเห็น - ถ้ามันยากที่จะเขียนมันควรอ่านยาก

กลิ่นเหม็นที่ค่อนข้างเก่ากว่า


2

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

แต่สิ่งที่จะพูดเกี่ยวกับกระบวนการที่ไม่สำคัญเช่นนี้? ดังนั้นคุณจะจบลงด้วยการเขียนคลาสสิก

i++; // add one to the "i" counter.

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

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

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


+1 สำหรับการชี้ให้เห็นว่านิสัยความคิดเห็นที่ไม่ดีเริ่มต้นด้วยคลาสการเขียนโปรแกรมก่อนหน้า -1 สำหรับการสรุปว่าความคิดเห็นเป็นเพียงตัวเลือกสุดท้าย
AShelly

1

ความเห็นของหลักสูตรมีกลิ่นรหัส ...

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

"ทำเช่นนี้!" ผู้จัดการโครงการของคุณพูดว่า

คุณตอบว่า "ไม่สามารถทำได้"

พวกเขาพูดว่า "จากนั้นเราจะหาคนอื่นทำ"

คุณพูดว่า "โอเคเอาละอาจจะทำได้"

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

1) ผู้ที่ทำงานของตนเองได้ง่ายขึ้นโดยจัดทำเป็นเอกสารอ้างอิงในอนาคตแสดงความคิดเห็นว่ากิจวัตรที่ล้มเหลวนั้นไม่ได้ผล (กลิ่นไม่ได้ลบทิ้งหลังจากค้นหางานที่ทำได้) หรือทำลายรหัสด้วยคำวิจารณ์ การจัดรูปแบบเพื่อหวังว่าจะทำให้การอ่านหรือทำความเข้าใจง่ายขึ้น อย่างจริงจังฉันไม่สามารถตำหนิพวกเขา แต่ในท้ายที่สุดพวกเขาตะครุบแล้วคุณมีสิ่งนี้: // dammit this code sucks! swear! curse! i hate it! i am going to write something here to vent my anger!!!!

2) ผู้ที่ไม่ได้มีทั้งทำท่าจะเป็นซูเปอร์ฮีโร่หรืออาศัยอยู่ในถ้ำ พวกเขาไม่ใส่ใจต่อผู้อื่นด้วยตนเองโดยประมาทและสามารถใส่ใจน้อย ๆ เกี่ยวกับรหัสหรือความหมายที่อาจมีในภายหลัง

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


1
ในการตอบสนองต่อ 1 กลิ่นที่แท้จริงในรูทีนที่ถูกคอมเม้นท์นั้นไม่ได้ลบทิ้งทันทีเมื่อคุณตัดสินใจว่ามันอาจจะจบลงและต้องการลองอะไรที่แตกต่าง --- นี่เป็นเพราะพวกมันควรจะมีอยู่ในการควบคุมเวอร์ชัน .
Sharpie

1

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

  1. คุณต้องทำอะไรเป็นกรณี ๆ ไปและไม่มีเหตุผลที่ดีสำหรับมัน
  2. รหัสอาจมีการเปลี่ยนแปลงในหนึ่งหรือสองปีเมื่อมีการเปลี่ยนแปลงกฎหมายและคุณต้องการค้นหาอีกครั้งอย่างรวดเร็ว
  3. มีคนแก้ไขรหัสในอดีตเพราะพวกเขาไม่เข้าใจว่ารหัสกำลังทำอะไรอยู่

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


1

มีความแตกต่างพื้นฐานอย่างมากระหว่างความคิดเห็นและรหัส: ความคิดเห็นเป็นวิธีที่ผู้คนสามารถสื่อสารความคิดกับผู้อื่นได้ในขณะที่รหัสนั้นมีความหมายสำหรับคอมพิวเตอร์เป็นหลัก มีหลายแง่มุมใน "รหัส" ที่ใช้สำหรับมนุษย์เช่นการตั้งชื่อและการเยื้อง แต่ความคิดเห็นถูกเขียนขึ้นอย่างเคร่งครัดสำหรับมนุษย์โดยมนุษย์

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

แม้ในวัฒนธรรมเล็ก ๆ ที่ฉันอาศัยอยู่มันก็แค่ยากที่จะสื่อสารความคิดกับคนอื่น ๆ การสื่อสารของมนุษย์มักจะล้มเหลวยกเว้นโดยบังเอิญ


0

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

อีกเหตุผลเดียวที่ฉันโรยความคิดเห็นลงในรหัสคือการเรียกสิ่งที่ดูเหมือนจะไม่สมเหตุสมผล

ความคิดเห็นเหล่านั้นมักจะอยู่ในรูปแบบของสิ่งที่ชอบ:

//xxx what the heck is this doing??

หรือ

// removed in version 2.0, but back for 2.1, now I'm taking out again

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

จริงแท้แน่นอน. มีสาเหตุที่รหัสที่ดีอาจไม่ชัดเจน ส่วนใหญ่เวลาที่รหัสที่น่างงงวยน่างงงวยเพราะมันเขียนในลักษณะที่สับสน
เคน

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

0

การให้ความคิดเห็นเกี่ยวกับโค้ดหากเป็นไปได้หน่วยของข้อโต้แย้งฟังก์ชันและการส่งคืนฟิลด์โครงสร้างแม้แต่ตัวแปรในเครื่องก็มีประโยชน์มาก จำยานอวกาศ Mars!


ดีกว่ามากในการสร้างหน่วยเป็นชื่อตัวแปรดังนั้นโปรแกรมเมอร์ผู้น่าสงสารไม่จำเป็นต้องจำ แทนที่จะเป็น 'double length // in meters' ให้พูดว่า 'double length_m' สิ่งที่สำคัญที่สุดคือการใช้ภาษาที่มีประสิทธิภาพยิ่งขึ้นดังนั้นคุณสามารถพูดความยาว l; บังคับ f; แรงบิด t = l * f; พิมพ์ (t.in (Torque.newtonMeter));
kevin cline

0

นี่คือกฎของหัวแม่มือของฉัน:

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


0

ไม่ความคิดเห็นไม่ใช่กลิ่นรหัส แต่เป็นเครื่องมือที่สามารถถูกทำร้ายได้

ตัวอย่างของความคิดเห็นที่ดี :

// ฉันคิดว่านี่เป็นหน่วยเซนติเมตร จำเป็นต้องมีการสอบสวนเพิ่มเติม!

// นี่เป็นวิธีที่ฉลาดในการทำ X

// รายการนี้รับประกันว่าไม่ว่างที่นี่


อันที่สามคือ IMO ที่คอมเม้นท์ไม่ดี ทำไมไม่Assert(list.IsEmpty)?
CodesInChaos

@CodeInChaos IMO Assert(!list.isEmpty())ไม่ได้เป็นสัญญาเหมือนในความคิดเห็นที่สาม แต่เพียงพฤติกรรม (เช่น "โยน IllegalArgumentException ถ้าอาร์กิวเมนต์ว่างเปล่า") ที่จะต้องมีการทดสอบหน่วยเช่นตรรกะโปรแกรมอื่น ๆ โปรดสังเกตความแตกต่างเล็กน้อยกับความคิดเห็นซึ่งระบุว่าเมื่อใดที่สามารถใช้วิธีการนี้ได้ แต่จะไม่ระบุพฤติกรรมหากไม่เป็นไปตามเงื่อนไขก่อน ดียิ่งกว่าความคิดเห็นที่จะบังคับใช้สัญญารวบรวมเวลา แต่สิ่งนี้เกินขอบเขตของคำตอบของฉัน;)
Andres F.

คุณไม่ควรออกกำลังกายAssertเนื่องจากพวกเขาอธิบายสิ่งที่ไม่ควรเกิดขึ้นแม้ว่า API สาธารณะจะได้รับการขัดแย้งที่ไม่ถูกต้อง
CodesInChaos

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