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


13

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

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

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


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

2
อ่านRefactoring (ฟาวเลอร์)และรูปแบบการออกแบบ (GoF) คำถามนี้ถามจริง ๆ ว่า "ฉันจะโครงสร้างรหัสได้อย่างไร" และถ้าคุณถามว่าคุณมีถนนยาวในการเดินทาง อย่าวางใจใช้คำถามและคำตอบเดียวเพื่อให้คุณได้ครึ่งทาง
Aaronaught

ความเป็นไปได้ที่ซ้ำซ้อนของการถูกครอบงำหลังจากเริ่มโครงการใหม่
gnat

คำตอบ:


13

หยุดคิดเกี่ยวกับรหัส

เริ่มคิดเกี่ยวกับเลเยอร์คุณลักษณะโมดูลบริการและบทคัดย่อระดับสูงอื่น ๆ

คุณกำลังจมเพราะคุณคิดในระดับต่ำเกินไป


9

ทำให้ง่ายที่ซับซ้อนเป็นเรื่องง่าย ; รอคิดว่ามันเป็นวิธีอื่น ๆ

ทุกคนต้องดิ้นรนกับสิ่งนี้ไม่มีทางออกที่ตรงไปตรงมาที่มีประสิทธิภาพสูงสุด

เนื่องจากคุณไม่ได้เขียนสิ่งนี้ไว้ในคำถามของคุณคำแนะนำของฉันคือ:

มุ่งเน้นไปที่การทำงานร่วมกันผ่าน:

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

หากคุณเป็นGoogleผลการค้นหาในหน้าแรกคุณจะพบสองแหล่งข้อมูลที่ยอดเยี่ยม:

  • " หลักการความรับผิดชอบเดี่ยว " โดย Robert C. Martin (ก.พ. / 2545): หลักการนี้กล่าวถึงความจำเป็นในการวางสิ่งต่าง ๆ ที่เปลี่ยนแปลงด้วยเหตุผลที่แตกต่างกันในชั้นเรียนที่แตกต่างกัน
  • " กฎของลอน: ทำสิ่งหนึ่งสิ่งใด " โดย Jeff Atwood (Mar / 2007): หลักการความรับผิดชอบเดี่ยวกล่าวว่าชั้นควรมีหนึ่งและเพียงหนึ่งเหตุผลในการเปลี่ยนแปลง

การทำงานร่วมกันในวิทยาศาสตร์คอมพิวเตอร์คืออะไร?

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

การทำงานร่วมกันจะลดลงถ้า : - ฟังก์ชั่นที่ฝังอยู่ในชั้นเรียนที่เข้าถึงได้ผ่านวิธีการที่มีร่วมกันน้อย - วิธีการดำเนินการกิจกรรมที่แตกต่างกันจำนวนมากมักจะใช้ชุดข้อมูลหยาบหรือไม่เกี่ยวข้อง

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

หากคุณมีคำถามใด ๆ แจ้งให้เราทราบ


1

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


1

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


0

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

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


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

1
+1 @ The Mouth of a Cow: เห็นด้วยและPeter Norvigผู้อำนวยการฝ่ายวิจัยของ Google ซึ่งเป็นโปรแกรมเมอร์ "ยอดเยี่ยม": สอนตัวเองในสิบปี
ความผิดพลาด

1
@blunders - บทความที่ดี มันเป็นความลับเล็ก ๆ น้อย ๆ ที่นักการตลาดไม่ต้องการบอกเรา (ยกเว้นเซก้าแน่นอน) ฝึกฝนฝึกฝนฝึกฝน มันควรจะใช้ได้กับภาษาญี่ปุ่นด้วยเช่นกันalljapaneseallthetime.com/blog

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

0

ฉันคิดว่าผู้คนจำนวนมากพยายามที่จะแก้ปัญหาวิศวกรมากเกินไป พวกเขาใช้แนวทาง "Adam & Eve" เมื่อเพียงแค่การใช้งานที่ง่ายขึ้นเพียงเล็กน้อยก็จะทำให้สิ่งต่าง ๆ ง่ายขึ้นด้วยการจัดการที่ดี

ชั้นเรียนแบบพิเศษไม่ได้เลวร้ายพวกเขาเป็นผลมาจากธรรมชาติของการออกแบบซอฟต์แวร์เสียง

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

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

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

การใช้รูปแบบที่ชาญฉลาดจะลดปริมาณรายละเอียดที่คุณต้องจัดการอย่างมาก

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

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

หวังว่ามันสมเหตุสมผลกับคุณ!

อันเดรีย


โดยวิธีการเพียงเพื่อให้ชัดเจน: ฉันไม่ได้สนับสนุนการเรียนป่าเติบโตออกมาเหมือน gremlins ค่อนข้างเป็นเพียงความรู้สึกในทางปฏิบัติที่เป็นประโยชน์มากขึ้น :)
Andrea Raimondi

0

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

ขั้นตอนง่าย ๆ ที่ช่วยฉัน

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

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