แนวทางการเข้ารหัส: วิธีการไม่ควรมีคำสั่งมากกว่า 7 รายการ?


78

ฉันกำลังดูแนวทางการเข้ารหัสของ AvSolสำหรับ C # และฉันเห็นด้วยกับเกือบทุกอย่าง แต่ฉันอยากรู้จริง ๆ ว่าคนอื่นคิดอย่างไรกับกฎข้อหนึ่ง

AV1500

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

คุณส่วนใหญ่ปฏิบัติตามกฎนี้หรือไม่? แม้ว่าจะมีน้อยที่จะถูกบันทึกจากการสร้างวิธีการใหม่ (รหัสของคุณยังคงแห้ง ) นอกเหนือจากการอ่านที่เพิ่มขึ้นอย่างมาก? และหมายเลขของคุณยังต่ำอยู่ที่ 7 หรือไม่ ฉันจะมีแนวโน้มมากขึ้นต่อ 10

ฉันไม่ได้บอกว่าฉันละเมิดกฎนี้ทั่วทุกที่ - ในทางตรงกันข้ามวิธีการของฉันเล็ก 95% และเน้น แต่บอกว่าคุณไม่ควรละเมิดกฎนี้จริงๆพัดฉันออกไป

ฉันแค่อยากจะรู้ว่าสิ่งที่ทุกคนคิดว่าไม่เคยละเมิดกฎนี้ (มัน '1' ในมาตรฐานการเข้ารหัส - ความหมายไม่เคยทำเช่นนี้) แต่ฉันคิดว่าคุณมีปัญหาในการค้นหา codebase ที่ไม่ได้


48
พวกเขานับcaseงบใน singe switchด้วยหรือไม่? ไม่ว่ามันจะเป็นอะไร คนที่เขียนมันไม่รู้อะไรเกี่ยวกับการเขียนโปรแกรม
SK-logic

86
กฎเดียวที่ควรเป็น '1' บนมาตรฐานการเข้ารหัสควรเป็นกฎ "เจ้าจะต้องปฏิบัติตามแนวทางการเข้ารหัสทั้งหมดด้วยเม็ดเกลือ"
Mike Nakis

6
@ SK- ลอจิก 1027 ไม่เลวเช่นกัน - มันจะต้องสนุกกับการเขียนโค้ดที่ต้องจัดการกับข้อมูลที่หายไปถ้าคุณต้องรักษาสตริงว่างให้เท่ากับสตริงว่าง
quant_dev

25
เมื่ออ่านคำแนะนำนี้ฉันคาดว่าจะเห็น codebase ที่เต็มไปด้วย: void DoSomething () {DoSomethingFirstSevenLines (); DoSomethingSecondSevenLines (); DoSomethingThirdSevenLines (); ฯลฯ }
ชักเย่อ

12
ลองไตร่ตรอง. NET Framework ส่วนใหญ่แล้วดูว่ามีวิธีการใดบ้างที่มีงบน้อยกว่า 7 รายการ ...
David Boike

คำตอบ:


195

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


25
+1 สำหรับ "micromanagement โดยพรอกซี" ฉันสงสัยว่ามีคนอ่านเกี่ยวกับกฎ "7 บวกหรือลบ 2" ( en.wikipedia.org/wiki/ ...... ) และสับสนการเก็บข้อมูลความจริงระยะสั้นกับที่เก็บข้อมูลระยะยาวเช่นคุณรู้หรือไม่ว่าโปรแกรมแก้ไขรหัส
ปุย

25
มาตรฐานการคิดที่สมเหตุสมผลใด ๆ ห้ามไม่ให้มีหมายเลขเวทย์มนตร์ในโค้ดใช่มั้ย คุณคิดว่ามาตรฐานการเข้ารหัสจะถูกจัดให้อยู่ในมาตรฐานนั้นเช่นกัน หมายเลข 7 มีคุณสมบัติ "วิเศษ" อย่างแน่นอน
Adam Crossland

2
คำตอบของคุณจะสมเหตุสมผลถ้าชื่อเอกสารไม่ "Coding Guidlinesสำหรับ C # 3.0 และ 4.0
Andy

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

3
ฉันดาวน์โหลดเอกสารนี้แล้วเริ่มตรวจสอบ ใน 1.6 นั้นระบุว่า: "เอกสารไม่ได้ระบุว่าโครงการจะต้องปฏิบัติตามแนวทางเหล่านี้และไม่ได้บอกว่าแนวทางใดมีความสำคัญมากกว่าแนวทางอื่น ๆ อย่างไรก็ตามเราสนับสนุนให้โครงการตัดสินใจด้วยตนเองว่าแนวทางใดมีความสำคัญ ใช้ใครเป็นผู้ให้คำปรึกษาในกรณีที่เกิดข้อสงสัยและรูปแบบใดที่จะต้องใช้สำหรับซอร์สโค้ด " แม้ว่า 1 หมายถึง "แนวทางที่คุณไม่ควรข้ามและควรใช้กับโซลูชันทั้งหมด" คุณสามารถเลือกที่จะแก้ไขได้
chrish

83

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

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

Steve McConnellระบุไว้ในCode Completeว่าคุณไม่ได้มีประสิทธิภาพมากขึ้นเมื่อใช้วิธีการแบบสั้น หากคุณแยกเมื่อไม่เหมาะสมคุณจะเพิ่มความซับซ้อนให้กับโค้ดโดยไม่มีประโยชน์

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


1
คำตอบที่ดี สองบรรทัดสุดท้ายขับรถกลับบ้านโดยเฉพาะ
Xonatron

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

4
รหัสที่สมบูรณ์นั้นเต็มไปด้วยสิ่งที่ดี โปรแกรมเมอร์ทุกคนควรทานมื้อเที่ยงทุกวัน
deadalnix

29

ควรถือว่าเป็นกฎง่ายๆ

สิ่งต่าง ๆ เช่น "คอลัมน์ข้อความไม่เกิน 80 (100,120)", "ทางออกเดียวต่อวิธี", "ไม่เกิน 2 ระดับของการทำรัง" คือสิ่งที่ฉันจะเรียกเกณฑ์สำหรับตัวบ่งชี้ของกลิ่นรหัส หากคุณละเมิดพวกเขาในบางครั้งนั่นไม่ได้หมายความว่ารหัสนั้นไม่ดี หากคุณพบว่าตัวเองละเมิดพวกเขาอย่างสม่ำเสมอมีบางสิ่งที่มีกลิ่นในรหัสและคุณอาจต้องการหยุดชั่วคราวและทบทวนวิธีการของคุณใหม่

สำหรับฉันเกณฑ์ที่สำคัญที่สุดคือ "รหัสนี้เป็นที่เข้าใจได้หรือไม่", "มันซ้ำซ้อนหรือไม่", "มันเสียในที่ตรรกะหรือไม่?", "มันเป็นคู่ที่หลวมหรือเปล่า" มีอีกไม่กี่อย่าง แต่ฉันคิดว่าแนวคิดพื้นฐานสามารถสรุปได้โดยการจดจำคำแนะนำของ Donald Knuth: "โปรแกรมนั้นมีไว้สำหรับมนุษย์และสามารถอ่านได้โดยไม่ตั้งใจเท่านั้น"


7
ขีด จำกัด คอลัมน์ "80/100/120" คือเพื่อให้เราสามารถอ่านรหัสได้ เทอร์มินัลส่วนใหญ่เปิดที่ 80 คอลัมน์และใช้ความพยายามน้อยกว่าในการทำให้ผู้เขียนตัดเป็น 80 คอลัมน์มากกว่าที่จะทำให้ผู้อ่านทุกคนปรับขนาดเทอร์มินัลทุกครั้งที่ต้องการอ่านโค้ด ซึ่งแตกต่างจากข้อ จำกัด อื่น ๆ ขีด จำกัด ของคอลัมน์ N ไม่ได้ส่งผลกระทบต่อความหมายของรหัสมันเป็นกฎโวหารล้วนๆ ในหมวดหมู่เดียวกันกับ "ใช้แท็บ 4 ช่องว่าง" หรือ "ใส่เครื่องหมายวงเล็บเปิดสำหรับฟังก์ชั่นในบรรทัดของตนเอง"
Dietrich Epp

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

7
ในศตวรรษที่ 21 ไอดีของฉันมีคุณสมบัตินี้ที่เรียกว่า "การห่อคำแบบไดนามิก"
György Andrasek

9
@ GyörgyAndrasek: แต่ทุกคนไม่ได้ใช้ IDE ของคุณเสมอ: เราดูโค้ดใน GitHub ในเทอร์มินัลกับlessในvimและemacs; และการห่อแบบอัตโนมัติดูเหมือนจะเป็นเรื่องที่ดีที่สุด มาตรฐานการเข้ารหัสไม่ใช่เพื่อประโยชน์ของคุณ แต่เพื่อประโยชน์ของผู้ที่ทำงานเป็นทีม
Dietrich Epp

2
@DietrichEpp โดยส่วนตัวฉันมีการอ่านรหัสที่ยากซึ่งมักจะห่อที่คอลัมน์ 80 เมื่อเร็ว ๆ นี้ฉันต้องทำงานกับโครงการ Java ที่ใช้ตัวจัดรูปแบบ Eclipse มาตรฐาน และภายในวิธีการมันยากมากที่จะติดตามเส้นที่ผ่านไปสองหรือสามบรรทัด (ฉันตำหนิการตั้งค่าตัวจัดรูปแบบอื่น ๆ สำหรับเรื่องนั้นด้วย) บรรทัดล่างคือฉันคิดว่า 80 เป็นบิตที่ล้าสมัย โดยส่วนตัวฉันใช้ขีด จำกัด 120 ตัวให้ตั้งค่าตัวแก้ไขของฉันเพื่อบังคับใช้นั้นมีคอนโซลที่มีความกว้าง 120 คอลัมน์และ Github แสดงจริง 125 คอลัมน์ และฉันคิดว่ามันอ่านได้มากกว่านี้มาก
สะกิด

18

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


1
+1 สำหรับการอ่าน มันไม่ควรเกิดขึ้นหากวิธีการนั้นมีความยาว 20, 30 หรือ 50 บรรทัด ถ้า DRY และ SRP เป็นเป้าหมายของคุณมันจะไม่สำคัญว่าวิธีการนั้นดูเหมือนจะอยู่ด้านข้างเล็กน้อย ... แม้ว่าส่วนใหญ่คุณจะพบว่ายิ่งคุณอ่านได้มากเท่าไหร่คุณก็จะพยายามทำให้โค้ดของคุณสั้นลงเท่านั้น จะกลายเป็นธรรมชาติ
S.Robins

11

มันเป็นค่าประมาณ

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

ฉันจะสมมติว่าพวกเขาพูดว่า "7 statement" เพื่อให้ความคิดคร่าวๆกับคุณ (แม้ว่าฉันคิดว่าพวกเขาควรจะพูดว่า "ประมาณ 7") หากคุณต้องการ 9 ครั้งในขณะที่ไม่เหงื่อออก แต่ถ้าคุณกด 20 คุณจะรู้ว่าคุณไม่ได้อยู่ใน ballpark ที่เหมาะสมสำหรับกฎนี้


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

1
@Brian - บางทีนักเขียนแนวปฏิบัติอาจละเว้นคำว่า "คร่าว ๆ " โดยบังเอิญหรืออาจเป็นพวกเผด็จการบ้าคลั่ง ประเด็นของฉันคือ OP ควรใช้สิ่งนี้เป็นหมายเลข ballpark กฎใด ๆ ที่คอมไพเลอร์หรือล่ามไม่ได้บังคับใช้เป็นเพียงข้อเสนอแนะ
นาธานลอง

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

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

10

7 เป็นตัวเลขที่ไม่มีกฎเกณฑ์ใด ๆ เลย

ความซับซ้อนของวงจรเป็นปัญหาใหญ่กว่าจำนวนงบ ฉันเห็นโค้ดที่มีข้อความ 100 ข้อความในวิธีการเดียว (ซึ่งฉันคิดว่าแย่มาก) แต่มันมีความซับซ้อนตามวัฏจักรของ 1 และมันก็แค่ 1 อย่างเท่านั้น มีเพียงขั้นตอนมากมาย เราได้พูดถึงการแบ่งมันออกเป็นวิธีที่เล็กกว่า แต่วิธีเหล่านั้นจะถูกเรียกโดยวิธีนี้เพียงวิธีเดียว

ในขณะที่เป็นกรณีที่ค่อนข้างรุนแรงประเด็นคือคุณต้องเก็บรหัส DRY และความซับซ้อนของวงจรต่ำ นั่นสำคัญกว่าจำนวนบรรทัดในเมธอด

ใช้คำสั่ง switch / case เช่น หากคุณมีค่าที่เป็นไปได้มากกว่า 7 ค่าคุณต้องแบ่งการประเมินออกเป็นหลายวิธีหรือไม่ ไม่อย่างนั้นมันคงโง่

การทำลายโค้ดอย่างผิด ๆ เป็นวิธีการอื่น ๆ เพียงเพื่อให้จำนวนงบต่ำกว่า 7 เพียงทำให้โค้ดของคุณแย่ลง

แนวทางควรเป็นแต่ละวิธีควรทำ 1 สิ่งและเก็บรหัสของคุณไว้


1
+1: ข้อ จำกัด โดยพลการมีประโยชน์โดยพลการเท่านั้น วิธีการควรมีการดำเนินการเชื่อมโยงกันเดียวที่ระดับนามธรรมเดียว การทำลายหน่วยอะตอมดังกล่าวทำให้รหัสซับซ้อนขึ้นทำให้ยากต่อการเข้าใจโค้ด
Allon Guralnek

DRY มากเกินไป บ่อยครั้งที่มันหมายถึงการมีเพศสัมพันธ์อย่างแน่นหนาทั้งสองด้านของสิ่งที่ไม่ควรเป็นอย่างนั้น
แบรดโธมัส

4

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


8
คุณไม่สามารถสรุปรหัสสำเร็จรูปได้เป็นวิธีการของตัวเอง?
erjiang

ฉันสังเกตเห็นหลังจากโพสต์ว่านี่ไม่ใช่ C # Java แต่ฉันกำลังคิดเกี่ยวกับสิ่งนี้ stackoverflow.com/questions/321418/…
Jaydee

@erjang: คุณสามารถ เป็นเรื่องที่น่าเกลียดมากใน Java เนื่องจากคุณต้องห่อแบบสอบถามแต่ละรายการในคลาสที่ไม่ระบุชื่อ แต่ก็คุ้มค่าที่จะทำ ไม่น่าเกลียดใน C # และควรทำอย่างแน่นอน
วินไคลน์

โดยส่วนตัวแล้วฉันพบว่าโค้ดบรรทัด staight สองสามบรรทัดที่เพิ่มเติมสามารถอ่านได้มากขึ้น แต่บางทีนั่นเป็นเพียงฉัน
Jaydee

@ Jaydee คำถามที่เชื่อมโยงแสดงให้เห็นถึงการปฏิบัติทั่วไป แต่แปลก: การตัดข้อยกเว้นและการเข้าสู่ระบบ ในระดับถัดไปคุณสามารถทำเช่นเดียวกัน ... วิธีนี้มีข้อยกเว้นปรากฏขึ้นหลายครั้งในบันทึก มันเป็นการดีกว่าที่จะประกาศวิธีการขว้างปาและคุณได้บันทึก 3 บรรทัด เขียนวิธีผู้ช่วยปิดทั้งสองpsและrsและบันทึกอีกวิธีหนึ่ง หรือเขียนวิธีList<Row> readDb(String sql, Object... args)ที่ทำงานทั้งหมด (ใช้ได้เฉพาะกับชุดผลลัพธ์ในหน่วยความจำ แต่การดึงข้อมูลมากเกินไปมักจะบอกเป็นนัยว่างานควรทำในฐานข้อมูลอยู่แล้ว)
maaartinus

4

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

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

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


4

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

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

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

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

สรุป? หากเปรียบเทียบกลิ่นการออกแบบของ "ใช้ข้อความน้อยกว่า 7 ข้อความ" กับกลิ่นรหัสของ "ฉันใช้ข้อความมากกว่า 7 ข้อความ" ฉันควรกำจัดกลิ่นรหัสออกไป


4

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

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

ฉันไม่เคยอ้างว่าเป็นผู้เชี่ยวชาญ แต่ฉันอยู่ในอาชีพนี้มา 15 ปีแล้วด้วยประสบการณ์ C ++ ประมาณ 4 ปีและประสบการณ์ C # 11 ปี แต่เดิมนั้นใช้พื้นฐานของความแข็งแกร่งทางอุตสาหกรรม C ++ แต่ฉันได้ทำการปรับปรุงตั้งแต่นั้นมาพร้อมกับข้อมูลจากชุมชน

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


3
เป็นการดีที่จะพูดสอดและฉันคิดว่าคุณโต้เถียงอย่างสมเหตุสมผล ที่กล่าวว่าฉันไม่เห็นด้วยกับเหตุผลของคุณ“ พวกเขามักจะเป็นนักพัฒนาซอฟต์แวร์ที่ต้องการแนวทางของพวกเขาอย่างชัดเจน”: คุณไม่สามารถตอบสนองต่อไอดอทและคุณไม่ควรลอง การกำหนดแนวทางอย่างชัดเจนนั้นดีตราบใดที่สิ่งนี้ไม่ได้ทำให้พวกเขาไม่ถูกต้อง: ตอนนี้มันไม่ได้เป็นแนวทางอีกต่อไปมันเป็นกฎเกณฑ์โดยพลการ การแนะนำหมายเลขตามอำเภอใจตามที่คุณได้เห็นเป็นวิธีที่แน่นอนที่จะทำให้ถูกยิงและเป็นธรรม
Konrad Rudolph

3

ประการแรก: มันเป็นแนวทางไม่ใช่กฎ มันเรียกว่าแนวทางดังนั้นโปรดปฏิบัติเช่นนี้ นี่ก็หมายความว่าคุณต้องมีการตัดสินใจด้วยตนเอง (เช่นเคย)

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


2

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


6
"ฉันเห็นด้วยกับข้อความข้างต้นฉัน" หลีกเลี่ยงประโยคประเภทนี้ในไซต์ stackexchange โปรดจำไว้ว่าคำสั่งที่โพสต์คำตอบนั้นไม่จำเป็นต้องเป็นคำสั่งที่แสดงไว้
luiscubal

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

2

ค่อนข้างโง่เมื่อคุณเพิ่มการจัดการข้อยกเว้นลงในส่วนผสม

หลังจาก "ลองจับแล้วในที่สุด" คุณเหลือคำสั่งสี่รายการต่อวิธี!

นอกจากนี้ให้พิจารณาเมธอด "validateForm" สำหรับฟอร์มฟิลด์ 20 แม้ว่าคุณจะจัดการกับการตรวจสอบแต่ละรายการทั้งหมดในวิธีที่แยกต่างหากคุณยังมีวิธีตรวจสอบฟิลด์ 20 วิธีที่จะเรียกใช้ ตามแนวทางเหล่านี้คุณจะพบกับการแบ่งที่ไม่มีจุดหมายเช่น "validateTopOfScreen", "validateMiddleOfScreen" และ "validateBottomOfScreen"


ฉันคิดว่ามันค่อนข้างปลอดภัยที่จะพูดว่าtry/ catch/ finallyไม่ใช่ข้อความใน C # ดู Ecma-334 § 12.3.3.15 และส่วนโดยรอบ (ตัวย่อ) " คำสั่งลองจับในที่สุดของแบบฟอร์ม : ลองลองจับบล็อก (... ) catch-block-nในที่สุดในที่สุดบล็อก "
CVn

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

@Dennis - จริงใช้รูปแบบ HTML มานานแล้ว!
James Anderson

@ James และนั่นคือสิ่งที่แนวทางนี้มีไว้สำหรับ พยายามทำให้คุณคิดถึงวิธีแก้ปัญหาทางเลือกอาจดีกว่า
Dennis Doomen

2

คำถามกำลังทำให้เกิด "กฎ" กับ "แนวทาง" กฎมีไว้เพื่อให้เชื่อฟัง - แนวทางคือคำแนะนำที่มีไว้เพื่อให้คุณพิจารณาสิ่งที่คุณกำลังทำและหากสามารถทำได้จริง ๆ ในทางที่ดีขึ้น

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

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


0

ฉันเห็นด้วยกับความคิดเห็นข้างต้น 7 สำหรับฉันเป็นตระกูลและอาจมีประโยชน์ในบางภาษาที่ทับทิม แต่สำหรับภาษาเช่น C #, Java, C ++ ฉันสงสัยว่าการประชุม "7 บรรทัด" นี้ ให้ฉันเป็นตัวอย่างแอปพลิเคชั่นปัจจุบันของฉันมี 22 ช่องข้อความและฉันทำการตรวจสอบฝั่งเซิร์ฟเวอร์ เมธอดนี้เรียกว่า validateInput () และการตั้งค่าของฉันจะตรวจสอบความถูกต้องของฟิลด์ทั้งหมดในวิธีเดียวยกเว้นว่าฉันได้ตรวจสอบบางอย่างที่ซับซ้อนเช่น checkEmailFormat () ดังนั้นโดยทั่วไปโค้ดวิธี validateInput ของฉันคือ 108 บรรทัดที่มีการเรียกใช้การตรวจสอบที่ซับซ้อนเป็นครั้งคราว

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

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

validateInput (ผู้ใช้ UserObj) {

// ยืนยันชื่อจริง ....... ......

// ตรวจสอบความถูกต้องของชื่อ ......

// ตรวจสอบอีเมล ..... // ซับซ้อนเกินกว่าที่จะตรวจสอบรูปแบบอีเมลปกติ checkEmailFormat expresion (); ....

และอื่น ๆ .. }


1
ดูคำตอบของฉันที่มีต่อคำถามของ James Andersons ในกรณีเฉพาะของคุณฉันสงสัยว่าวิธีการตรวจสอบนั้นไม่ได้ละเมิดหลักการและแนวทางต่าง ๆ ในเวลาเดียวกัน
Dennis Doomen

0

กฎไม่ดี ด้วยรหัสสำหรับการจัดการข้อยกเว้นการตั้งค่าฟิลด์ฐานข้อมูลการตรวจสอบวิธีส่วนใหญ่จะอยู่ภายใต้ข้อความสั่งเจ็ดรายการได้อย่างไร เราไม่ควรทำฟังก์ชั่นแลมบ์ดาแบบอินไลน์หรือไม่?

บรรทัดของโค้ดเป็นการนับความซับซ้อนตามอำเภอใจ ด้วยวิธีการขยายฉันสามารถสร้างรหัสเช่น

                Parallel.ForEach(regions, region => {   Console.Write(region.Resorts.Where(x => x.name == "Four Seasons").OrderBy(x => x.RegionId).ThenBy(x => x.ResortId).ThenBy(x => x.name).ToList());   });

อีกตัวอย่างที่ดีของการทำมากเกินไปในวิธีการเดียว ในเกือบทุกคนโต้แย้งโต้แย้งกำลังละเมิดหลักการความรับผิดชอบเดียว (ในบริบทของวิธีการ)
Dennis Doomen

-1

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

ขณะนี้ฉันกำลังดูวิธีการของโค้ด 550 บรรทัดโดยมีคำสั่ง if อื่น ๆ มากมายและดำเนินการต่อและส่งคืนทอปมัน มันอึ หากโปรแกรมเมอร์ถูกบังคับให้คิดเกี่ยวกับสิ่งที่เขาทำ ...

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