มาตรฐานการเข้ารหัสเพื่อความชัดเจน: แสดงความคิดเห็นทุกบรรทัดของรหัส?


142

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

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

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

ฉันยังเข้าใจด้วยว่าความคิดเห็นควรอธิบายว่าทำไมรหัสทำในสิ่งที่มันทำไม่ได้อย่างไร

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

ตัวอย่างประเภทของรหัสกฎนี้อาจต้องใช้เมื่อถือว่าเป็นบรรทัดในรายการตรวจสอบ:

/* Display an error message */
function display_error_message( $error_message )
{
    /* Display the error message */
    echo $error_message;

    /* Exit the application */
    exit();
}

/* -------------------------------------------------------------------- */

/* Check if the configuration file does not exist, then display an error */
/* message */
if ( !file_exists( 'C:/xampp/htdocs/essentials/configuration.ini' ) ) {
    /* Display an error message */
    display_error_message( 'Error: Configuration file not found. Application has stopped');
}

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

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


21
ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
maple_shaft

32
“ ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม” ยิ่งกว่านั้นสำหรับความคิดเห็นของโค้ด :) /* Display an error message */ความคิดเห็นเหล่านั้นน่ากลัวและมีผลกระทบต่อการอ่าน
Andrea Lazzarotto

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

1
@ Doug.McFarlane ฉันคิดว่าควรมีอยู่สำหรับกลุ่ม แน่นอนมันทำทั้งในระดับไฟล์และบล็อก - rtfm-sarl.ch/articles/hide-comments.html !
Michael Durrant

1
สลับไปยัง - stackoverflow.com/a/11842371/631619
Michael Durrant

คำตอบ:


171

คำตอบของ Michael Durrant นั้น IMHO ไม่เลว แต่จริงๆแล้วมันไม่ได้ตอบคำถาม (ตามที่เขายอมรับ) ดังนั้นฉันจะพยายามให้คำตอบซึ่ง:

ฉันยังเข้าใจด้วยว่าความคิดเห็นควรอธิบายว่าทำไมรหัสทำในสิ่งที่มันทำไม่ได้อย่างไร

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

เห็นได้ชัดว่าคุณสามารถเขียนรายการตรวจสอบสำหรับความคิดเห็นรหัสของคุณที่มีคำถามเช่น

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

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

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


45
ใครลงคะแนนในเรื่องนี้? นี่คือคำตอบสำหรับการพัฒนาซอฟต์แวร์ที่สำคัญ นี่คือโลกที่แตกต่างเมื่อเทียบกับที่โปรแกรมเมอร์ส่วนใหญ่ทำงาน ในโลกใบนี้มาตรฐานการเข้ารหัสที่เรียกร้องให้โค้ดทุกบรรทัดมีความคิดเห็นของตัวเองไม่ใช่คำตอบที่ถูกต้อง ไม่มีความคิดเห็นใด ๆ OTOH การแสดงความคิดเห็นภายใต้การตรวจสอบโค้ดนั้นเป็นมาตรฐานที่ถูกต้องสำหรับซอฟต์แวร์ที่สำคัญ มันทำให้การตรวจสอบและบำรุงรักษารหัสเพิ่มเติม แต่สิ่งนี้มาในราคา ค่าใช้จ่ายนั้นลดลงเมื่อเทียบกับการฟ้องร้องหลายล้านดอลลาร์ซึ่งเกิดจากซอฟต์แวร์ที่เขียนไม่ดี
David Hammen

4
คำตอบที่ชาญฉลาด หากเราสามารถหากฎของแท้สำหรับการเข้ารหัสเราจะไม่ต้องการโปรแกรมเมอร์ เราสามารถมีรหัสเครื่องได้ มันอาจเกิดขึ้น! :(

4
@DavidHammen: ขอบคุณสำหรับความคิดเห็นของคุณ ที่จริงแล้วฉันคิดว่านี่ไม่ได้ใช้กับ "การพัฒนาซอฟต์แวร์ที่สำคัญ" เท่านั้น ซอฟต์แวร์ชิ้นส่วนทุกชิ้นที่ได้รับการบำรุงรักษาและพัฒนามานานหลายปีซึ่งหลาย ๆ คนมักจะได้รับประโยชน์จากผึ้งที่เข้าใจได้สำหรับโปรแกรมเมอร์บำรุงรักษาคนต่อไป
Doc Brown

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

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

151

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

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

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

นักพัฒนาซอฟต์แวร์มักจะเขียนโค้ดที่แย่ลง พวกเขาจะใช้ชื่อและโครงสร้างที่คลุมเครือมากขึ้นเพราะ 'อธิบายไว้ในความคิดเห็น - ดู!'

พิจารณา:

living_room_set = tables + chairs.

พิจารณาตอนนี้:

set = tbls+chrs # Make the set equal to the table plus the chairs

คุณไม่เพียง แต่มีชื่อที่เป็นความลับมากขึ้นและอ่านได้มากขึ้นเท่านั้นคุณยังต้องมองย้อนกลับไปดูโค้ดแล้วชุดอะไร ดูที่ด้านซ้ายของรหัส, มองไปที่ความคิดเห็น, tbls คืออะไร, มองไปทางซ้ายที่โค้ด, มองไปที่ความคิดเห็น, อะไรคือ chrs, มองไปที่ความคิดเห็นที่ถูกต้อง Yuch!

สรุป

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

  • รหัสและความคิดเห็นไม่ซิงค์กันเมื่อมีการเปลี่ยนแปลงเพียงอันเดียว

  • ความคิดเห็นอาจอธิบายสิ่งที่คนคนหนึ่งคิด แต่อาจผิดและปกปิดข้อบกพร่อง

  • รหัสอ่านยากขึ้น

  • รหัสที่ดีกลายเป็นเรื่องยากที่จะเขียน

  • มีแนวโน้มที่จะใช้ชื่อลับ ๆ มากกว่านี้

  • อักขระมากเกินไปที่จะอ่านในรหัสและความคิดเห็น

  • บรรณาธิการที่แตกต่างกันใช้สไตล์ที่ต่างกัน

  • ต้องการความรู้ภาษาอังกฤษสูงกว่าการเขียนโปรแกรม

  • ใช้เวลาและทรัพยากรและการลบออกจากค่าระยะยาว *

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

หนึ่งในสองปัญหาที่ยากคือการตั้งชื่อ - อย่าข้ามปัญหากับความคิดเห็น

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

* รหัสในวันพรุ่งนี้


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

7
ใช่ฉันไม่ได้ตอบคำถามมาตรฐานที่เฉพาะเจาะจง แต่แทนที่จะพยายามช่วยให้คนไม่ไปตามเส้นทางนั้น ดังนั้นนี่อาจไม่ใช่คำตอบสำหรับคำถามเฉพาะแต่มีคำแนะนำที่มีค่าซึ่งยากที่จะแสดงความคิดเห็น
Michael Durrant

1
ปัญหาที่ยากอื่น ๆ คืออะไร?
David Grinberg

20
@DavidGrinberg การตรวจสอบแคชและข้อผิดพลาดไม่ถูกต้อง
Eric King เมื่อ

1
แต่ละเหตุผลของคุณที่จะหลีกเลี่ยงความคิดเห็นสามารถถูกโต้กลับได้ แต่ StackExchange ไม่อนุญาตให้มีความคิดเห็นที่ยาวพอ (heh) สำหรับฉันที่จะกล่าวถึงพวกเขาทั้งหมดที่นี่ เพียงแค่: overcommenting เป็นเหมือนการหลอกลวงผู้มีสิทธิเลือกตั้ง: มันเกิดขึ้น แต่ไม่ค่อยมาก; ครั้งสุดท้ายที่คุณเห็นมันเกิดขึ้นจริงเมื่อไหร่? การเขียนความคิดเห็นที่ดีไม่ควรเป็นการคิดในภายหลัง หากทำอย่างถูกต้องจะช่วยให้กระบวนการพัฒนา ใช่มันต้องใช้ทรัพยากร แต่ผลตอบแทนคือรหัสที่ดีกว่า คุณจะไม่สามารถได้รับเสียงเดียวกันจากเจ้าชู้โดยการเสียสละความคิดเห็นสำหรับมาตรฐานการตั้งชื่อตัวแปรที่ดีกว่า ใช่การแสดงความคิดเห็นทุกบรรทัดคือถั่ว
kmoser

23

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

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

หากคุณเริ่มเพิ่ม "แนวทางปฏิบัติที่ดีที่สุด" ทุกชนิดลงในมาตรฐานการเข้ารหัสคุณจะสิ้นสุดการทำซ้ำซึ่งได้ระบุไว้ในหนังสือหลายเล่มแล้ว เพียงแค่ซื้อ "Clean Code", "Code Complete" และ "The Pragmatic Programmer" ให้กับผู้พัฒนาที่มีปัญหาและรักษามาตรฐานการเข้ารหัสของคุณไว้


63
หนึ่งในหลาย ๆ สิ่งที่ฉันได้เรียนรู้มานานกว่า 40 ปีในแร็กเก็ตนี้ก็คือสามัญสำนึกนั้นไม่ธรรมดาเลย
John R. Strohm

10
ไม่มีสิ่งเช่นสามัญสำนึก
whatsisname

1
in_programming no .. โลกแห่งความจริงโอ้ใช่ แต่มันเป็นเพียงคำศัพท์สำหรับโลกแห่งความรู้ที่มีอยู่จริง
Michael Durrant

@ JohnR.Strohm: ประสบการณ์ของฉันเป็นบวกมากกว่าของคุณมาก แต่ฉันได้เห็นด้วยว่าการใช้สามัญสำนึกสามารถกีดกันอย่างแข็งขันได้อย่างไรโดยการบังคับใช้กฎอย่างมีกลไก
JacquesB

ฉันอยู่ในข้อตกลง 99.9% กับคำตอบนี้ มาตรฐานการเข้ารหัสมีไว้เพื่อเป็นสิ่งที่นักพัฒนาชี้ไปเมื่อการอภิปรายเกิดขึ้นที่การตรวจสอบโค้ด การตรวจสอบรหัสมีขึ้นเพื่อเสริมสร้างผลิตภัณฑ์ที่ไม่ได้เริ่มสงคราม สงครามจำนวนมากที่ฉันเคยเห็นเกี่ยวข้องกับรีวิวโค้ดโดยไม่มีมาตรฐานการเข้ารหัส ฉันกล้าพูดว่าถ้าคุณไม่สามารถทำการตรวจสอบรายการในมาตรฐานการเข้ารหัสได้โดยอัตโนมัติ การตรวจสอบโค้ดคือเวลาที่จะให้ 'สามัญสำนึก' แก่ผู้พัฒนาที่มีประสบการณ์น้อยกว่าคนอื่น ๆ ไม่ใช่เวลาที่จะต่อสู้กับการตั้งชื่อตัวแปร linux / kernel / gen_init_cpio.c บรรทัด 335.
Andrew T Finnell

19

มันเป็นไปไม่ได้. สิ่งที่คุณกำลังพยายามทำคือการสร้างกลไกการตัดสินที่ดี

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

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


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

1
@ Wildcard คุณสามารถอธิบายได้ว่ามาตรฐานสามารถให้การตัดสินได้อย่างไร นั่นจะไม่เป็นคู่มือในจุดนั้น? มาตรฐานคือ "ความคิดหรือสิ่งที่ใช้เป็นตัววัดบรรทัดฐานหรือแบบจำลองในการประเมินเปรียบเทียบ" เราจะใช้สิ่งที่เป็นอัตวิสัยโดยเนื้อแท้ได้อย่างไรดังนั้นอัตนัยจึงขึ้นอยู่กับว่าใครอ่านมันเป็นการวัดคุณภาพ
Andrew T Finnell

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

มันเป็นโลกที่แปลกและจำไว้ว่ากฎนั้นเขียนโดยข้าราชการที่มีความรู้เพียงเล็กน้อยเกี่ยวกับโดเมนซอฟต์แวร์และคุณมักจะจบลงด้วยระบบที่มีเหตุผลและต้องการตัวเองแทนที่จะเป็นหนทางสู่การรับประกันผลิตภัณฑ์ที่มีคุณภาพ
whatsisname

1
@whatsisname ฉันมีความสุขมากมีคนอื่นที่เข้าใจ คำตอบของคุณถูกเขียนอย่างงดงามและแม่นยำกว่าที่ฉันเคยพยายาม คำแถลงwith systems that exist to justify and require themselves rather than being a means to an end to ensure quality productsเป็นสิ่งที่ฉันพยายามจะอธิบาย ขอบคุณสำหรับการค้นหาคำของฉันสำหรับฉัน ฉันหมายถึงอย่างแท้จริง เราต้องแยกความคิดในการชักนำคุณภาพจากแนวคิดของการทำตามกระบวนการที่ไม่เหมือนกัน นี่คือเหตุผลที่เรามี QA, Stackoverflow และลูกค้าที่ให้อภัย
Andrew T Finnell

14

ปรับปรุง

การตอบสนองของฉันในคำพูดสำหรับการเน้น:

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

ปัญหานี่คือมาตรฐานการเข้ารหัสเป็นเพียงที่เป็นมาตรฐาน มากความคิดอัตนัยควรไม่อยู่ในมาตรฐานการเข้ารหัส อาจเป็นแนวทางปฏิบัติที่ดีที่สุด แต่ไม่สามารถใช้คู่มือดังกล่าวกับนักพัฒนาซอฟต์แวร์ในระหว่างการตรวจสอบโค้ด ในความเห็นส่วนตัวของฉันมาตรฐานการเข้ารหัสควรใกล้เคียงกับอัตโนมัติมากที่สุด มีเวลามากเสียในการวิจารณ์รหัสการโต้เถียงเรื่องการตั้งชื่อระยะห่างแท็บวงเล็บความคิดเห็น ฯลฯ ฯลฯ เมื่อทุกอย่างสามารถเป็นไปโดยอัตโนมัติ แม้แต่คำตอบเกี่ยวกับtablesและchairsสามารถเป็นไปโดยอัตโนมัติ LINT'ers อนุญาตให้ใช้พจนานุกรมการตรวจสอบตัวพิมพ์ใหญ่ต่อแนวคิด (ตัวแปร, ฟังก์ชั่น, วิธีการ, ชั้นเรียน ฯลฯ )

แม้แต่การตรวจสอบ JavaDoc ก็สามารถใช้งานได้โดย Robot LINT'er ก่อนที่จะยอมรับคำขอดึง โครงการโอเพนซอร์สจำนวนมากทำสิ่งที่แน่นอนนี้ คุณส่งคำขอดึงรหัสของคุณถูกสร้างขึ้นด้วยไฟล์ Travis-CI รวมถึงการวิเคราะห์แบบคงที่และต้องผ่านมาตรฐานการเข้ารหัสทั้งหมดซึ่งสามารถแสดงออกได้อย่างเป็นกลาง ไม่มีคนตีระฆังเกี่ยวกับการ 'ทำมันไม่ถูกต้อง' หรือไม่ 'ให้คุณค่า' กับความคิดเห็นหรือวิธีที่ผิดในการตั้งชื่อตัวแปรและอื่น ๆ การสนทนาเหล่านั้นไม่ได้ให้คุณค่าใด ๆ และเป็นสิ่งที่ดีที่สุดสำหรับหุ่นยนต์ของบุคคลที่สาม

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

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

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

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

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

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

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

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


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

เรามีความคิดเห็นสองประเภท:

ความเห็นที่เครื่องอ่านได้

สไตล์ความคิดเห็นเช่น Javadoc, JSDoc, Doxygen ฯลฯ เป็นวิธีการแสดงความคิดเห็นในส่วนต่อประสานสาธารณะที่มีชุดโค้ดให้ อินเทอร์เฟซนั้นสามารถใช้งานได้โดยผู้พัฒนารายอื่นเพียงคนเดียว (รหัสที่เป็นกรรมสิทธิ์สำหรับทีมสองคน) จำนวนนักพัฒนาที่ไม่รู้จัก (เช่น JMS) หรือสำหรับทั้งแผนก รหัสนี้สามารถอ่านได้โดยกระบวนการอัตโนมัติซึ่งจะสร้างวิธีการอ่านความคิดเห็นเหล่านั้น ala HTML, PDF และอื่น ๆ

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

ฉันกำลังทำสิ่งที่ดูบ้า แต่ก็ไม่จริง

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

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

ความคิดเห็นไม่สามารถเชื่อถือได้

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

นี่อาจฟังดูแปลก ๆ แต่ทนกับฉัน ข้อใดของสองบรรทัดนี้สำคัญ?

// We don't divide by 0 in order to stop crashes.

return 1 / n;

ในตัวอย่างนี้สิ่งที่สำคัญคือเราไม่มีความคิดว่า 'n' คืออะไรไม่มีการตรวจสอบสำหรับ n เป็น 0 และแม้ว่าจะมีไม่มีอะไรหยุดนักพัฒนาจากการวางn = 0หลังจากการตรวจสอบสำหรับ 0 ดังนั้นความคิดเห็น ไม่มีประโยชน์และไม่มีอะไรอัตโนมัติสามารถจับสิ่งนี้ได้ ไม่มีมาตรฐานที่สามารถจับสิ่งนี้ได้ ความคิดเห็นในขณะที่สวย (บางคน) ไม่มีผลต่อผลลัพธ์ของผลิตภัณฑ์

ทดสอบการพัฒนาขับเคลื่อน

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

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

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

ข้อสรุป

หากคุณทำงานใน บริษัท ที่ต้องการทุกความคิดเห็นฉันรับประกันว่าอย่างน้อยสองวิศวกรซอฟต์แวร์ในโครงการได้เขียนโปรแกรมเอกสารอัตโนมัติใน Perl, Lisp หรือ Python ซึ่งกำหนดความคิดทั่วไปของสิ่งที่สายทำ จากนั้นเพิ่มความคิดเห็นด้านบนบรรทัดนั้น เนื่องจากเป็นไปได้ที่จะทำมันหมายความว่าความคิดเห็นที่ไร้ประโยชน์ ค้นหาวิศวกรที่เขียนสคริปต์เหล่านี้เพื่อจัดทำรหัสโดยอัตโนมัติและใช้เป็นหลักฐานว่าทำไม 'ความคิดเห็นในทุกบรรทัด' จึงเสียเวลาไม่มีค่าและอาจเป็นอันตรายได้

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

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

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


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

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

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

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

1
@AndrewTFinnell ฉันหมายความว่าถ้าบางครั้งคุณได้รับการหารด้วยข้อผิดพลาดเป็นศูนย์ให้เพิ่ม "if (divisor == 0) return <something>; // หลีกเลี่ยงการหารด้วยศูนย์" ไม่ทำให้โค้ดของคุณถูกต้องอีกต่อไป แต่คุณต้องค้นหาสาเหตุที่ตัวหารเป็นศูนย์และแก้ไข ขั้นตอนวิธีการบางอย่างได้รับการออกแบบเพื่อให้เป็นศูนย์หารหลีกเลี่ยงไม่ได้ แต่พวกเขากำลังยกเว้น (และในที่กรณีที่คุณสามารถกลับค่า "ผลไม่สามารถคำนวณได้")
immibis

12

มีสองสิ่งที่แตกต่างที่คุณพูดถึงเมื่อคุณพูดถึงความคิดเห็น พวกเขาไม่เหมือนกันและความแตกต่างเป็นสิ่งสำคัญ

เอกสารประกอบจะบอกคุณเกี่ยวกับบิตนอกของรหัสชิ้นส่วน - ส่วนต่อประสาน

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

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

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

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

ความคิดเห็นจะอ่านอยู่เสมอในบรรดารหัสที่สำคัญ

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

# 'map' outperforms 'for' here by a factor of 10  

// This line works around an obscure bug in IE10, see issue #12053  

-- We are going to recursively find the parents up to and including the root node.
-- We will then calculate the number of steps from leaf node to root node.
-- We first use a WITH clause to get the ID of the root node.

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

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

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

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

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


เอกสาร API สาธารณะเป็นจุดที่ดี แต่ฉันชอบอธิบายการตัดสินใจที่น่าประหลาดใจ เป็นเรื่องที่ดีมากหากการละเมิดหลักการอย่างน้อยน่าประหลาดใจอย่างน้อยก็มาพร้อมกับเหตุผล +1
candied_orange

1
+1 สำหรับความคิดเห็นที่ไม่เกี่ยวข้องเป็นเสียงรบกวน ให้สัญญาณเสียงรบกวนสูง
sq33G

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

10

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

แต่คุณยังต้องการตรวจสอบให้แน่ใจว่ามีการแสดงความคิดเห็นรหัสอย่างถูกต้องเนื่องจากนี่เป็นรหัสวิกฤติของชีวิต การแก้ปัญหาคือต้องมีมาตรฐานสำหรับการตรวจสอบโค้ด - กำหนดให้ต้องมีการตรวจสอบความคิดเห็นของโค้ดเกี่ยวกับความเข้าใจ

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

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

รหัสที่อ่านไม่ได้คือในระดับหนึ่งไม่สามารถหลีกเลี่ยงได้ เนื่องจากผู้เขียนจมอยู่ในบริบทและจะเห็นบางสิ่งบางอย่างที่ชัดเจนเมื่อเห็นได้ชัดก็ต่อเมื่อคุณรู้จัก x, y หรือ z

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


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

"... เมื่อเห็นได้ชัดก็ต่อเมื่อคุณรู้ว่า x, y หรือ z" คุณสามารถระบุจำนวนความรู้ {x, y, z} ที่จำเป็นต้องทราบล่วงหน้าเพื่อที่จะเห็นบางสิ่งที่ชัดเจนและจากนั้น (ชนิด ของกลไก) คุณสามารถตรวจสอบว่าสิ่งนี้ถือเป็นจริงสำหรับรหัสปัจจุบัน ไม่เพิ่มความคิดเห็นจนกว่าจะเป็น
Trilarion

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

@DavidHammen คนที่เลือกเพื่อรับการพิจารณาคดีจะทำการเรียก? และเมื่อพวกเขาออกไป? ถ้าคนใหม่ไม่คิดแบบเดียวกันหรือพูดภาษาอังกฤษ หาก 'ผู้ตรวจสอบ' ออกไป? ข้อเสนอแนะของคุณทำให้นักพัฒนาสองสามคนอยู่บนหอคอยงาช้างซึ่งนำไปสู่การคัดค้านความไม่ไว้วางใจและการหยุดสื่อสาร ความคิดเห็นมีไว้เพื่อให้ข้อมูลเชิงลึกหรือความกระจ่างสำหรับผู้ที่สามารถใช้งานได้ บางทีโจต้องการ แต่แมรี่ไม่ได้ จะเกิดอะไรขึ้นเมื่อแมรี่เป็นผู้ตรวจสอบ? หรือโจ หรือทำเครื่องหมาย?
Andrew T Finnell

@jmoreno - การไม่วางกฎ / แนวทางเกี่ยวกับความคิดเห็นไว้ในมาตรฐานการเข้ารหัสหมายความว่าโปรแกรมเมอร์ต้องดูหลาย ๆ แหล่ง - และพวกเขาไม่รู้ว่าจะดูที่ใดจนกว่าการตรวจสอบจะกลับมาอีกครั้ง เป็นความผิดพลาดที่จะคิดว่าทุกอย่างในมาตรฐานการเข้ารหัสจะต้องเป็นไปโดยอัตโนมัติ ยกตัวอย่างเช่นกฎเกี่ยวกับชื่อที่มีความหมายไม่สามารถทำได้โดยอัตโนมัติ อย่างน้อยยังไม่ ตัวอย่างเช่นx, yและz, หรือi, jและkสามารถเป็นชื่อที่มีความหมายค่อนข้างหากมีการดำเนินการขั้นตอนวิธีการทางวิทยาศาสตร์ที่อยู่บนพื้นฐานของกระดาษสมุดรายวันที่ใช้ว่าชื่อผู้ที่อยู่ในสูตรของมัน
David Hammen

9

แสดงความคิดเห็นทุกบรรทัดของรหัส? ไม่

วัตถุประสงค์ของกฎอื่น ๆ ที่คุณพูดถึงคือหลีกเลี่ยงสิ่งนั้นอย่างแม่นยำ

ความคิดเห็นต่อรหัสที่อ่านได้นั้นมีความซ้ำซ้อนที่สุดและที่แย่ที่สุดจะทำให้ผู้อ่านมองหาจุดประสงค์ที่ไม่มีอยู่จริงของความคิดเห็น

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

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

มีสไตล์ที่ไปตรงกันข้ามทั้งหมดถ้าคุณมีข้อสงสัยเกี่ยวกับเส้นมันทั้ง:

  1. รหัสมีความซับซ้อนเกินไปและควรได้รับการปรับเปลี่ยนใหม่ในฟังก์ชั่นที่มีชื่อที่มีความหมายความหมายสำหรับส่วนของรหัส ไม่ว่าจะเป็นความซับซ้อนifหรือบางส่วนของอัลกอริทึม (หรือ LINQ หนึ่งซับที่ฉลาด)

  2. ถ้ามันไม่สามารถทำให้เป็นเรื่องง่ายได้คุณก็ไม่รู้ภาษาที่เพียงพอ

(โดยส่วนตัวแล้วฉันไม่ใช่คนที่คลั่งไคล้ในกฎการไม่แสดงความคิดเห็นที่เข้มงวด แต่ฉันคิดว่ามันเป็นความคิดเริ่มต้นที่ดีที่จะต้องดำเนินการ)

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

สำหรับกระบวนการ มาตรฐานของเราให้เครดิตแก่ผู้ตรวจสอบค่อนข้างมาก สมมติว่าพวกเขาไม่เป็นอันตรายนี่ใช้งานได้ดี

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

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

ยังไม่มีตายตัว แม้ว่าเราจะเป็นกลุ่มเล็ก ๆ มันง่ายที่จะหาฉันทามติในกลุ่ม 5


2
การใช้การตรวจสอบโค้ดเพื่อกำหนดตัวแปรคลาสและวิธีการที่ควรตั้งชื่อนั้นเป็นวิธีที่ดีที่สุดในการทำให้คนเกลียด บริษัท ธุรกิจหรือระเบียบวิธี ไม่ควรใช้การตรวจสอบโค้ดเพื่อบังคับใช้สิ่งที่ไม่สำคัญ มาตรฐานการเข้ารหัสจะต้องตรวจสอบได้ผ่านกระบวนการอัตโนมัติ ความยาวชื่อตัวแปร, ความซับซ้อนแบบวงกลม, กฎของ Demeter เป็นทุกสิ่งที่สามารถตรวจสอบได้ หากมีคนบอกให้ฉันเปลี่ยนชื่อตัวแปรจาก 'i' เป็นอย่าง indexForThePreviousCollection ฉันจะหาที่ทำงานอีกแห่ง ตัวแปร> 3 ตัวอักษรทั้งหมดจะถูกตรวจสอบก่อนที่จะเช็คอินโดยอัตโนมัติ
Andrew T Finnell

3
@AndrewTFinnell ฉันสามารถเขียนโค้ดที่เป็นไปไม่ได้ในกระบวนทัศน์การเขียนโปรแกรมใด ๆ ที่คุณสนใจ
candied_orange

2
@ AndrewTFinnell ดีฉันจะไม่เห็นด้วยอย่างสุภาพ " การใช้การตรวจสอบโค้ดเพื่อกำหนด " ฉันไม่รู้ว่าคุณดึงมาจากไหน ฉันไม่ต้องการที่จะทำงานในรหัสที่มีตัวแปรi, j, kทั่วทุกสถานที่หลังจากที่ผู้เขียนต้นฉบับจบการทำงาน ฉันไม่เข้าใจประเด็นของคุณเกี่ยวกับจีโนม "มนุษย์" ฉันสงสัยว่ามีภาษาที่มีคำเดียวหรือสองคนยากที่จะเข้าใจ อย่างที่ฉันพูดไปฉันเคยเห็นคอมเพล็กซ์ifs และLINQซับในตัวหนึ่งแล้ว พวกเขาสามารถแสดงความคิดเห็นหรือ refactored ภายใต้ชื่อที่มีความหมายความหมายฉันเดาว่าเป็น "ความคิดเห็นที่ดีของคุณ"
luk32

3
@ luk32 ฉันเคารพสิทธิ์ในการไม่เห็นด้วย ตัวแปรการทำซ้ำค่อนข้างชัดเจนในบริบทความคิดของฉัน ในขณะที่ฉันเข้าใจความรู้สึกของคำพูดของคุณ แต่ฉันเชื่อว่ามีวิธีปฏิบัติมากเกินไปที่จะนำความเชื่อมั่นนั้นไปสู่สุดขั้ว เราจำเป็นต้องใช้รหัสที่อ่านจริงๆ: for (int indexForCurrentDatabaseRow = 0; indexForCurrentDatabaseRow < currentUserRecordSetResults.length; indexForCurrentDatabaseRow = indexForCurrentDatabaseRow + 1)เมื่อเทียบกับfor (int i = 0; i < results.length; i++)? อาจเป็นเรื่องของการตั้งค่าและ / หรือเวลาที่ใช้ในการดูรหัส ชื่อ verbose มากเกินไปกลิ่นฉัน
Andrew T Finnell

2
ฉันไม่คิดว่าชื่อควรได้รับการพิจารณาในการตรวจสอบโค้ด การตรวจสอบโค้ดควรเริ่มต้นหลังจากผู้เขียนคิดว่ามันดีพอซึ่งหมายความว่ามันมีความคิดเห็นที่ถูกต้องเข้าใจง่ายและตัวแปรมีชื่อที่เหมาะสม สิ่งนี้คือ - หากผู้ตรวจสอบคิดว่ารหัสนั้นซับซ้อนเกินไปหรือต่อสู้กับความหมายของตัวแปรดังนั้นรหัสนั้นยากที่จะเข้าใจ สิ่งนี้ไม่เป็นที่ถกเถียงกันอย่างชัดเจนนักพัฒนาอย่างน้อยหนึ่งคนผู้วิจารณ์ไม่เข้าใจ ไม่ว่าจะต้องมีการปรับโครงสร้างใหม่ (และวิธี) หรือให้ความเห็นอย่างถูกต้องหรือไม่ก็เป็นสิ่งที่แตกต่างกัน
Idan Arye

9

คำถาม:

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

ความคิดเห็นไม่ควรพยายามให้ความรู้แก่ผู้อ่านเกี่ยวกับภาษา ผู้อ่านควรสันนิษฐานว่ารู้ภาษาดีกว่าผู้เขียน แต่มีบริบทน้อยกว่านักเขียน

ผู้อ่านของรหัสนี้จากตัวอย่างของคุณควรรู้ว่าexit()จะออกจากแอปพลิเคชัน - จึงทำให้ความคิดเห็นซ้ำซ้อน:

/* Exit the application */
exit();

ความคิดเห็นที่ซ้ำซ้อนเป็นการละเมิด DRY และการเปลี่ยนแปลงโค้ดไม่จำเป็นต้องเผยแพร่ไปยังความคิดเห็นทิ้งความคิดเห็นที่ไม่สะท้อนสิ่งที่รหัสกำลังทำอยู่

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

Python PEP 8 (คู่มือสไตล์สำหรับ Python ในไลบรารีมาตรฐาน CPython) ให้แนวทางต่อไปนี้สำหรับความคิดเห็นแบบอินไลน์:

ใช้ความคิดเห็นแบบอินไลน์เท่าที่จำเป็น

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

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

x = x + 1                 # Increment x

แต่บางครั้งสิ่งนี้มีประโยชน์:

x = x + 1                 # Compensate for border

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

border_compensation = 1
compensated_x = x + border_compensation

ทำให้รหัสของคุณตนเอง documenting ไม่เป็นความคิดใหม่

กลับไปที่คำถามจริง:

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

ฉันเชื่อว่าแนวทางและตัวอย่างของ PEP 8 แสดงให้เห็นถึงมาตรฐานการเข้ารหัสที่ดีซึ่งรวบรวมความคิดนี้ ใช่ฉันเชื่อว่าเป็นไปได้


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

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

4

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

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

แก้ไข ----

เพียงชี้แจง ฉันไม่ได้รับความเห็นเกี่ยวกับการทดสอบ vs tdd กับหน่วยที่ดีที่สุด หรือการแนะนำความคิดเห็นต่อบรรทัดนั้นดี / ไม่ดี

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

และจากการตั้งคำถามว่ามาตรฐานการเข้ารหัสเกี่ยวกับการแสดงความคิดเห็นจะเป็นจริงได้ดีกว่าเขียนเป็นข้อกำหนดเอกสารข้อกำหนดบางชนิด

ความคิดเห็นเช่นสำหรับการอธิบายวัตถุประสงค์ของรหัสซึ่งก็คือสเป็คคืออะไร


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

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

6
ยังถือกำเนิด tdd ฉันเชื่อว่า
Ewan

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

2
@JoshCaswell และ Ewan ใช่มันเป็นเทคนิคที่หลายปีที่ผ่านมาและไม่แน่นอนก่อนวันจริง TDD แต่คุณตั้งใจจะลบความคิดเห็นในภายหลัง! และ TDD ได้แทนที่มันอย่างสมบูรณ์ในฐานะวิธีการสร้างรหัสที่ตรงตามข้อกำหนด
David Arno

4

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

สิ่งนี้เห็นได้ชัดว่าเหนือกว่าเอกสารอื่น ๆ - นี่เป็นวิธีการที่โครงสร้างมีการเลือกอัลกอริธึมและอื่น ๆ ซึ่งอาจสัมผัสกับการวิเคราะห์และออกแบบข้อกำหนด

กฎ # 1 ของฉันคือ "ไม่ต้องจัดทำเอกสารที่ชัดเจน" กฎ # 2 คือ "เขียนรหัสที่ชัดเจน"

สำหรับรหัสความปลอดภัยที่สำคัญ (ซึ่งฉันไม่เคยทำงานขอบคุณพระเจ้า) นี่เป็นสิ่งที่จำเป็น แต่ไม่มีที่ไหนเลยใกล้ขั้นตอนแรกที่เพียงพอ มันอาจจะต้องลงมาเพื่อกำหนดคุณสมบัติของภาษาที่ต้องหลีกเลี่ยง (ฉันเคยเห็นมากกว่าหนึ่งคำสั่งมาตรฐาน "คุณจะไม่ใช้scanf( "%s", input ); ด้วยเหตุผลใดก็ตาม ")


ชัดเจนอยู่ในสายตาของคนดู และการเปลี่ยนแปลงขึ้นอยู่กับกำหนดเวลา
Tony Ennis

3

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

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

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

ดังนั้นจึงไม่ใช่บรรทัดที่ควรให้ความเห็น แต่เป็นโค้ดที่ใหญ่กว่า ควรแสดงความคิดเห็นรหัสทุกชิ้น? ไม่แฮโรลด์ Abelson กล่าวว่า " โปรแกรมต้องถูกเขียนขึ้นเพื่อให้ผู้คนอ่านและมีเพียงเครื่องเท่านั้นที่จะทำงาน " แต่การแสดงความคิดเห็นเป็นเพียงสำหรับคนที่จะอ่าน - เครื่องไม่ได้ดำเนินการให้ หากมาตรฐานการเข้ารหัสของคุณบังคับให้เขียนความคิดเห็นที่ซ้ำซ้อนในทุกบรรทัด / ชิ้นส่วนของรหัสคุณไม่ได้เป็นเพียงภาระของนักพัฒนาที่จำเป็นต้องเขียนพวกเขา - คุณยังเป็นภาระนักพัฒนาที่จะต้องอ่าน !

ปัญหานี้เป็นปัญหาเพราะเมื่อความคิดเห็นส่วนใหญ่ที่คุณอ่านซ้ำซ้อนคุณหยุดให้ความสนใจกับพวกเขา (เพราะคุณรู้ว่าพวกเขาจะเป็นขยะซ้ำซ้อน) จากนั้นคุณจะพลาดความคิดเห็นที่สำคัญ ดังนั้นฉันพูด - เขียนเฉพาะความคิดเห็นที่สำคัญดังนั้นเมื่อมีคนเห็นความคิดเห็นในรหัสพวกเขาจะรู้ว่ามันคุ้มค่าที่จะอ่านเพื่อทำความเข้าใจโค้ด


1
พลาดความคิดเห็นที่สำคัญ: +1 ประโยคที่เริ่มต้น: "พวกเขาไม่ได้อธิบาย" สามารถใช้การปรับโครงสร้างบางอย่างเพื่อให้ง่ายต่อการติดตาม
candied_orange

3

IMHO มันควรทำทั้งสองอย่าง การแสดงความคิดเห็นทุกบรรทัดเป็นเรื่องโง่เพราะคุณท้ายเรื่องชอบ

  i++;    /* Increment i */

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

OTOH ถ้าคุณเขียนบล็อกความคิดเห็นที่ดีที่ส่วนหัวของฟังก์ชั่น (หรือการจัดกลุ่มใดก็ตามที่มีเหตุผล) อธิบายทั้งสิ่งที่ต้องทำให้สำเร็จและวิธีการถ้ามันน้อยกว่าที่เห็นได้ชัดคุณมีบางสิ่งที่มีประโยชน์ หากคุณเป็นฉันคุณอาจรวมรหัส LaTeX สำหรับสมการที่เกี่ยวข้องหรือการอ้างอิงไปยังเอกสารเช่น "นี่เป็นการดำเนินการตามแผน WENO สำหรับการแก้สมการแฮมิลตัน - จาโคบีดังที่กล่าวไว้ใน ... "


2
+1 สำหรับความคิดเห็น doxygen: นี่เป็นคำคัดค้านของฉันที่จะรวมถึง "เอกสาร" ของ doxygen ในรหัสของฉัน 95% ของเวลาที่ทำซ้ำสิ่งที่เห็นได้ชัดจากฟังก์ชั่นลายเซ็น ฉันเองก็ยังไม่เคยเห็นเอกสาร doxygen ตัวเดียวที่มีค่าอะไรเลย การเขียนความคิดเห็นเหล่านั้นทำให้เสียเวลาสามครั้ง: หนึ่งครั้งเพื่อเขียนความคิดเห็นหนึ่งครั้งเพื่ออ่านความคิดเห็นอีกครั้งและอีกครั้งเพื่อแก้ไขปัญหาที่สร้างขึ้นโดยเนื้อหาความคิดเห็นเก่า
cmaster

1
คุณไม่ได้ขัดแย้งกับตัวเองเหรอ? ฉันคิดว่าเราทั้งคู่เห็นพ้องกันว่ามันเป็นสิ่งสำคัญสำหรับฟังก์ชั่นที่จะมีความคิดเห็นที่อธิบายถึงสิ่งที่มันทำจากมุมมองกล่องดำ - "อินพุตเหล่านี้เข้าไปในฟังก์ชั่นนี้และสิ่งที่ออกมา" มันเป็นสัญญาระหว่างผู้เขียนฟังก์ชันและผู้ใช้ฟังก์ชัน วัตถุประสงค์ของ Doxygen เป็นเพียงการสร้างมาตรฐานรูปแบบของความคิดเห็นเหล่านั้นในลักษณะที่สามารถแยกวิเคราะห์และทำให้สามารถค้นหา / จัดทำดัชนีได้ เหตุใดคุณจึงต้องการ "บล็อกความคิดเห็นที่ดี" แต่ไม่ต้องการในรูปแบบมาตรฐานแบบมนุษย์และแบบเครื่องอ่านได้
เกรแฮม

การใช้มาตรฐานความคิดเห็นเช่น JSDoc, JavaDoc และ Doxygen นั้นใช้สำหรับการจัดทำเอกสารที่สามารถค้นหาได้และเป็นมนุษย์ที่สามารถอ่านได้ตามที่ @Graham กล่าว บรรทัดของรหัสที่กล่าวถึงในคำตอบนี้ไม่เกี่ยวข้องกับ Doxygen ฉันไม่สามารถจินตนาการได้ว่าชุดของกฎอยู่ในตำแหน่งที่จะแยกความคิดเห็นนั้นและสร้างรายการในเอกสารเอาท์พุท เมื่อคุณดู Docs for JMI, Java Standard Libraries ฯลฯ ทั้งหมดจะถูกสร้างขึ้นโดยใช้เครื่องมือที่คล้ายกับ Doxygen นั่นคือจุดประสงค์ของมัน ไม่ใช่สิ่งที่พูดที่นี่
Andrew T Finnell

ฉันไม่ได้ทำมันขึ้นมา - เพื่อให้เป็นไปตามข้อกำหนดของแคนาดา บริษัท ที่ฉันทำงานให้นักพัฒนาเขียนตัวประมวลผลล่วงหน้าที่เพิ่มความคิดเห็นตรงตามตัวอย่างของ OP ฉันคิดว่าของเราคือ "C เพิ่ม 1 กับฉัน" หรือบางอย่างเช่น มันเป็น FORTRAN ดังนั้นลูปจึงได้รับการยกย่องในทำนองเดียวกันว่า "C ลูปจาก 1 ถึง 10" รหัสเต็มไปด้วยความคิดเห็นที่ไร้ประโยชน์ ฉันลบอึทั้งหมดที่ฉันรักษารหัส ไม่มีใครเคยพูดอะไรกับฉัน
Tony Ennis

2

ได้เวลานำแผนภูมิการไหลกลับมาแล้ว! (ไม่จริงๆ แต่แขวนในนาที)

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


ฉันขอโทษที่ต้องแจ้งให้คุณทราบว่าผังงานไม่เคยหายไป
Ant P

ความคิดเห็นที่ดีอยู่ในระดับที่แตกต่างกันของนามธรรมกว่ารหัส ได้ยินได้ยิน!
candied_orange

1
แม้ว่านี่อาจเป็นคำแนะนำที่ดี แต่ก็ไม่ได้ตอบคำถามที่ถูกถามยกเว้นบางทีประโยคเดียว
ไบรอัน Oakley

0

ฉันจะตอบคำถามตามที่ระบุไว้:

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

ใช่. WYSIWYG มาตรฐานการเข้ารหัสที่ดีคือตัวอักษร " ชัดเจนต่อผู้อ่านว่าโค้ดต่อไปนี้ทำอะไรและทำไม "

ในคำอื่น ๆ รหัสของฉันตรวจสอบความคิดเห็นเกี่ยวกับการอ่านรหัสแท้จริง 1-1 เกิดขึ้นจากสภาพจิตใจของฉัน

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

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

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

มาตรฐานที่สองที่ต้องระบุอย่างชัดเจนคือ "การทดสอบฉุกเฉิน 2am"

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

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


0

คำตอบนี้ครอบคลุมถึงปัญหาส่วนใหญ่อย่างไรก็ตามมีสิ่งหนึ่งที่สำคัญ

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

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


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

@jamesqf ใช่เมื่อฟังก์ชั่นครึ่งหนึ่งไม่ได้รับการบันทึกและอีกครึ่งหนึ่งไม่ดี อย่างไรก็ตาม Doxygen สามารถสร้างเอกสารค่อนข้างดีสมมติว่านักพัฒนาให้ความเห็นอย่างถูกต้องฟังก์ชั่นของพวกเขาเรียน ฯลฯ
BЈовић

-1

คำตอบที่มีอยู่จำนวนมากมีรายละเอียดดี แต่ฉันรู้สึกว่าสำคัญที่จะต้องตอบ:

... [ความคิดเห็น] ที่จะมีความเกี่ยวข้องในการตรวจสอบแบบเพื่อน แต่จะไม่เปลี่ยนเป็นรายการตรวจสอบที่ไม่สนใจ ...

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

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

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