การเลือกรูปแบบการออกแบบที่เหมาะสม


32

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

ตัวอย่างเช่น:

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

เมื่อการสร้างอินสแตนซ์เหลือให้กับคลาสที่ได้รับให้พิจารณา Factory

จำเป็นต้องเข้าถึงองค์ประกอบของวัตถุรวมตามลำดับลอง Iterator

หรือสิ่งที่คล้ายกัน



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

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

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

คำตอบ:


109

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

พวกเขาไม่.

อืมมันไม่ใหญ่พอ

รูปแบบไม่ใช่การสร้างบล็อก

นั่นดีกว่า.

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

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

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

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

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

นี่คือข้อความที่ตัดตอนมาจากการสัมภาษณ์กับ Erich Gamma (ของGamma, Helm, Johnson และ Vissides ): วิธีใช้รูปแบบการออกแบบ :

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


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

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

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


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

1
ฉันมักจะแนะนำให้นักพัฒนาเริ่มดูรูปแบบเพื่อทำความคุ้นเคยกับหลักการออกแบบก่อน ทุกรูปแบบเป็นภาพประกอบของหลักการออกแบบ (ชุดของหลักการ 'SOLID' เป็นเพียงตัวอย่างเดียว)
ryscl

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

2
การอ่านระหว่างบรรทัดที่นี่ขั้นตอนในการเลือกรูปแบบการออกแบบ: 1.คิดอย่างถี่ถ้วนถึงรหัสที่คุณใช้งานอยู่2.สรุปรหัสเฉพาะลงในปัญหาพื้นฐาน3.ปัญหานั้นมีวิธีแก้ปัญหาที่รู้จักหรือไม่ )? 4.ใช่ฉันจะใช้โซลูชันนั้นกับข้อมูลเฉพาะของฉันได้อย่างไร 5.ปรับใช้โซลูชันทั่วไปกับปัญหานามธรรมเพื่อสร้างโซลูชันสำหรับปัญหาเฉพาะของคุณ
Chris

@Chris ที่สรุปมันขึ้นมาจริงๆ นอกจากนี้ยังมีอะไรผิดปกติกับการเขียนโดยไม่ต้องรูปแบบแล้วrefactoringรหัสลงในรูปแบบที่เหมาะสมหากมีการออกแบบต้องการมัน

18

ฉันถามตัวเอง:

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

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


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

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