ฉันกำลังค้นหาไฟล์บรรทัด 2-3k มากมายและมันก็ไม่ได้รู้สึกว่ามันควรจะใหญ่ขนาดนั้น
อะไรคือเกณฑ์ที่ดีในการโทรหาไฟล์ซอร์สโค้ดอย่างออบเจ็กต์ "ใหญ่เกินไป"?
ฉันกำลังค้นหาไฟล์บรรทัด 2-3k มากมายและมันก็ไม่ได้รู้สึกว่ามันควรจะใหญ่ขนาดนั้น
อะไรคือเกณฑ์ที่ดีในการโทรหาไฟล์ซอร์สโค้ดอย่างออบเจ็กต์ "ใหญ่เกินไป"?
คำตอบ:
ในฐานะที่เป็นแบบอย่างที่ดีฉันใช้เกณฑ์ต่อไปนี้ (ด้วยเหตุผลที่คล้ายคลึงกับสิ่งที่ Martin Beckett แนะนำคือให้คิดในแง่ของโครงสร้างเชิงตรรกะและไม่ได้อยู่ในรูปของบรรทัดของโค้ด):
กฎข้อที่ 1
หนึ่งคลาสต่อไฟล์ (ใน C ++: หนึ่งคลาส -> หนึ่งส่วนหัวและหนึ่งไฟล์สำหรับการนำไปใช้)
กฎ 2
เซเว่นถือเป็นจำนวนรายการที่สมองของเราสามารถสังเกตได้ในเวลาเดียวกันโดยไม่สับสน ด้านบน 7 เราพบว่ามันยากที่จะเก็บภาพรวมของสิ่งที่เราเห็น ดังนั้น: แต่ละคลาสไม่ควรมีมากกว่า 7-10 วิธี คลาสที่มีมากกว่า 10 วิธีอาจซับซ้อนเกินไปและคุณควรพยายามแบ่งมัน การแยกเป็นวิธีที่มีประสิทธิภาพมากเพราะทุกครั้งที่คุณแบ่งชั้นเรียนคุณจะลดความซับซ้อนของแต่ละชั้นอย่างน้อยที่สุดด้วยปัจจัย 2
กฎข้อ 3
ส่วนของเมธอดที่ไม่พอดีกับหนึ่งหรือสองหน้าจอใหญ่เกินไป (ฉันถือว่าหน้าต่างหน้าจอ / ตัวแก้ไขมีขนาดประมาณ 50 บรรทัด) เป็นการดีที่คุณสามารถดูวิธีการทั้งหมดในหน้าต่างเดียว หากไม่ใช่กรณีนี้คุณจะต้องเลื่อนขึ้นและลงเล็กน้อยโดยไม่ลืมส่วนของวิธีการที่ซ่อนอยู่ ดังนั้นหากคุณต้องเลื่อนมากกว่าหนึ่งหน้าจอขึ้นหรือลงเพื่ออ่านเนื้อความของวิธีการทั้งหมดวิธีการของคุณอาจใหญ่เกินไปและคุณอาจสูญเสียภาพรวมได้ง่าย
อีกครั้งวิธีการแยกโดยใช้วิธีการช่วยเหลือส่วนตัวสามารถลดความซับซ้อนของวิธีการได้อย่างรวดเร็ว (ในทุก ๆ ความแตกต่างความซับซ้อนจะลดลงครึ่งหนึ่ง) หากคุณแนะนำวิธีการช่วยเหลือส่วนตัวมากเกินไปคุณสามารถพิจารณาสร้างคลาสแยกต่างหากเพื่อรวบรวมพวกเขา (ถ้าคุณมีวิธีส่วนตัวมากกว่าวิธีสาธารณะอาจจะมีคลาสที่สองซ่อนอยู่ในคลาสหลักของคุณ)
รวบรวมการประมาณคร่าวๆเหล่านี้เข้าด้วยกัน:
ดังนั้นไฟล์ต้นฉบับที่มีมากกว่า 2000 บรรทัดอาจใหญ่เกินไปและเริ่มยุ่งเกินไป
นี่เป็นค่าประมาณคร่าวๆและฉันไม่ปฏิบัติตามเกณฑ์เหล่านี้อย่างเป็นระบบ (โดยเฉพาะอย่างยิ่งเนื่องจากมีเวลาไม่เพียงพอที่จะทำการปรับโครงสร้างที่เหมาะสม) นอกจากนี้ตามที่ Martin Beckett แนะนำไว้มีสถานการณ์ที่ชั้นเรียนเป็นชุดของวิธีการที่หลากหลายและมันก็ไม่สมเหตุสมผลที่จะแยกพวกมันออกเป็นบางส่วนด้วยวิธีประดิษฐ์เพื่อทำให้ชั้นเรียนเล็กลง
อย่างไรก็ตามในประสบการณ์ของฉันไฟล์จะเริ่มอ่านไม่ได้เมื่อไม่มีพารามิเตอร์ใดพารามิเตอร์หนึ่งข้างต้น (เช่นตัวเมธอด 300 บรรทัดที่ครอบคลุมหกหน้าจอหรือไฟล์ต้นฉบับที่มีรหัส 5000 บรรทัด)
ไม่ - ไม่ได้อยู่ในบรรทัดของรหัส ไดรเวอร์ควรเป็นการจัดกลุ่มแบบลอจิคัล ไม่ควรมีหลายคลาสในไฟล์ขนาดใหญ่เพียงไฟล์เดียว
หากคุณมีคลาสที่ถูกต้องตามกฎหมายมีสองสามร้อยวิธี (ไม่สามารถบอกได้ว่าเป็นแบบจำลอง 3 มิติ) มันจะสะดวกกว่าที่จะแยกมันออกเป็นไฟล์โดยพลการ เราเคยต้องทำเช่นนี้เมื่อหน่วยความจำมีปัญหามากขึ้นและโปรเซสเซอร์ช้าลง - และมันก็เป็นความเจ็บปวดพยายามค้นหาคำจำกัดความของฟังก์ชั่นอยู่ตลอดเวลา
เมื่อรหัสในนั้นจะกลายเป็น unmaintainable เช่น:คุณไม่สามารถบอกได้เพียงแค่ดูรหัสหากวิธีการ / คลาส / ฟังก์ชั่นที่คุณกำลังมองหา (และต้องแก้ไข / ดีบั๊ก) อยู่ในนั้นหรือไม่และถ้าเป็นเช่นนั้น
ตัวเลือกและฟีเจอร์ของ IDE / Editor ของคุณจะมีผลต่อปริมาณที่แท้จริงของขีด จำกัด บนนี้ การพับโค้ด , ฟังก์ชั่น / วิธีการรายชื่อและการค้นหาจะเลื่อนออกไปขณะที่การพัฒนานี้นำเสนอสถานการณ์
แต่เมื่อมันถึงเวลาที่จะแบ่งมัน
นี่คือมุมมองทางเลือก: คุณกำลังถามเกี่ยวกับวิธี จำกัด ขนาดไฟล์ ความคิดเห็นของฉันคือมีหลายปัจจัยที่ทำให้ไฟล์รหัสขนาดใหญ่มีปัญหามาก บางครั้งไฟล์รหัสมีขนาดใหญ่ แต่เนื้อหาของมันมีการรวมกลุ่มกันเป็นอย่างดีและโค้ดที่สะอาดมากดังนั้นขนาดจึงไม่ทำให้เกิดปัญหาที่สำคัญ ฉันได้เห็นไฟล์จำนวนมากที่สามารถอ่านได้แม้จะมี LOC สูง
แทนที่จะแตะที่ตัวชี้วัด LOC ฉันอยากจะคิดถึงการใช้ข้อมูลประวัติเพื่อทำความเข้าใจความถี่ที่รหัสเสียหายในไฟล์ขนาดใหญ่เหล่านั้น โดยทั่วไปแล้วเหตุผลที่ทำให้ผู้พัฒนาไม่มีเวลาอดทนในการตรวจสอบสถานที่อื่น ๆ ที่เกี่ยวข้องในไฟล์เดียวกันและทำการเปลี่ยนแปลงด้วยความคิด "แก้ไขด่วน" โดยไม่มีความเข้าใจเพียงพอ
อันตรายที่ใหญ่กว่าคือการมีรหัสการคัดลอกวาง การเข้ารหัสการคัดลอกและวางจะช่วยเร่งการเติบโตของ LOC ฉันคิดว่าการกำจัดคัดลอกวางมีความสำคัญยิ่งกว่าการเก็บ LOC ให้ต่ำกว่าจำนวนเวทมนตร์ นอกเหนือจากการคัดลอกวางอย่างแท้จริงแล้วยังมีอันตรายที่สองในไฟล์ขนาดใหญ่: ฟังก์ชันการทำงานที่ทับซ้อนกัน ยิ่งไฟล์มีขนาดใหญ่เท่าใดคุณก็ยิ่งมีโอกาสนำส่วนย่อยมาใช้ใหม่มากขึ้นซึ่งอยู่ในส่วนอื่น ๆ ของไฟล์เดียวกันอยู่แล้ว
ดังนั้นตราบใดที่อัตราส่วนการแก้ไขข้อบกพร่อง (อัตราส่วนของการแก้ไขข้อผิดพลาดมุ่งมั่นที่จะกระทำทั้งหมด) อยู่ในระดับต่ำสำหรับไฟล์ขนาดใหญ่สถานการณ์ที่ยอมรับได้ โปรดลองgit log
และอ่านผ่านคอมมิชชันจำนวนมากที่เกี่ยวข้องกับข้อผิดพลาด หรือใช้เครื่องมือที่สามารถวิเคราะห์โดยอัตโนมัติและเห็นภาพมันเช่นSoftagram
Metaphor
พิจารณานี้ เมื่อพูดถึงความยาวของรหัสฉันคิดว่าเราควรพิจารณาสิ่งต่อไปนี้:
The Cat in The Hat (50 pp.)
และ
Lord of The Rings (1,178 pp.)
Lord of the Rings
มีอะไรผิดปกติกับการเป็น มันเป็นหนังสือที่ยอดเยี่ยม The Cat in the Hat
ยังเป็นหนังสือที่ดี ทั้งคู่สามารถเข้าใจได้โดยเด็กอายุ 5 ปี แต่มีเพียงคนเดียวที่เหมาะสมกว่าเนื่องจากเนื้อหา
ถึงจุดของฉันการเขียนรหัสควรสมเหตุสมผลกับ 5 ปีทุกครั้งที่เราสามารถ Cyclomatic Complexity
เป็นแนวคิดที่สำคัญที่นักพัฒนาซอฟต์แวร์ควรพิจารณาเมื่อสร้างรหัส ใช้และสร้างไลบรารีเพื่อปรับปรุงการทำงานและการใช้งานโค้ดให้มากที่สุด วิธีนี้รหัสของเราสามารถพูดได้หลายเล่มมากกว่าสิ่งที่เราเห็นเขียน
ส่วนใหญ่เราจะไม่ได้เขียนรหัสการชุมนุม แต่รากของรหัสของเราคือการชุมนุม การค้นหาแอสเซมบลี 10,000 บรรทัดนั้นยากกว่างูหลาม 10,000 บรรทัดหากทำอย่างถูกต้อง
แต่งานบางอย่างต้องเขียน 500 ถึง 1,000 บรรทัด เป้าหมายของเราด้วยรหัสควรเขียนโค้ดสะอาด 300 บรรทัด
ในฐานะนักพัฒนาเราต้องการเขียน "ลอร์ดออฟเดอะริงส์" จนกว่าเราจะได้รับข้อผิดพลาดและหวังว่าเราจะเขียน "Cat in the Hat" อย่าทำการเขียนโค้ดของอีโก้ เพียงแค่ทำให้สิ่งต่าง ๆ ทำงานในแบบง่าย ๆ
นักพัฒนาไม่ต้องการรหัสเอกสาร (ฉันชอบรหัสที่เป็นเอกสารส่วนตัวฉันไม่ใช่คนเห็นแก่ตัว) ดังนั้นอย่าเขียนโค้ดที่มีเพียงคุณเท่านั้นที่สามารถเข้าใจ / อ่านได้ เขียนCat in the Hat
รหัส
เราทุกคนรู้ว่าคุณคือJRR Tolken (ในหัวของคุณ) จำไว้ว่าคุณจะไม่มีอะไรจะพิสูจน์ด้วยรหัสข้อผิดพลาดฟรี
อีกเหตุผลที่อุปมา
อย่า overkill ผู้อ่านกระจายความมั่งคั่ง หากคุณทำงานกับกลุ่มคนและพวกเขาทั้งหมดต้องเปลี่ยนไฟล์ขนาดใหญ่แบบเดียวกันคุณอาจจะทำให้ตัวเองตกอยู่ในgit
นรก
ทุกคนรักการลดราคา
-> ไม่มีใครพูดเลย!
TL; DR เน้นที่ความสามารถในการอ่าน กระจายรหัสและผู้ช่วยเหลือของคุณผ่านหลายบรรทัดและไฟล์มากที่สุดเท่าที่จะทำได้ อย่าโยน 8 หรือ 9 คลาสในไฟล์เดียวมันทำให้โค้ดอ่านยากและยากต่อการบำรุงรักษา หากคุณมีรหัสเงื่อนไขหรือลูปขนาดใหญ่ให้ลองเปลี่ยนเป็น Lambdas หากภาษานั้นรองรับ ฟังก์ชั่นยูทิลิตี้ควรได้รับการพิจารณาว่าเป็นแนวทางที่ดีในการเพิ่มความสามารถในการอ่านโค้ด หลีกเลี่ยงการทำรังหนัก