คุณได้รับแนวทางปฏิบัติที่ดีสำหรับการออกแบบ OOP ได้อย่างไร [ปิด]


12

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

ตัวอย่างเช่นนี่คือโพสต์ที่มีสองสามวัน: /codereview/8041/how-to-improve-my-factory-design

ฉันไม่มั่นใจในรหัสของฉัน ดังนั้นฉันต้องการที่จะปรับปรุงการออกแบบของฉันใช้เวลาน้อยลงในการสร้างมันขึ้นมา

คุณเรียนรู้การสร้างงานออกแบบที่ดีได้อย่างไร หนังสือบางเล่มที่คุณสามารถแนะนำฉันได้ไหม


ระดับปัจจุบันของคุณคืออะไร ฉันคิดว่าคุณรู้เกี่ยวกับรูปแบบการออกแบบ?
ACNB

ไม่จริงเลยฉันเริ่มอ่านบางส่วนของพวกเขาในหลักสูตรPluralSight
Darf Zon

1
หนังสือที่มีอิทธิพลมากที่สุดในการออกแบบซอฟต์แวร์คือ '' ลวดลายการออกแบบ: องค์ประกอบของซอฟต์แวร์เชิงวัตถุที่นำกลับมาใช้ใหม่ '' มันยังคงคุ้มค่าที่จะอ่านแม้ว่ามันจะเก่าไปสักหน่อย คุณสามารถเริ่มอ่านบทความ[ en.wikipedia.org/wiki/Software_design_pattern เหมือนกัน (วิกิพีเดีย ) รูปแบบการออกแบบซอฟต์แวร์เหล่านี้ไม่เพียง แต่ช่วยให้คุณมีทางออกที่ดีสำหรับปัญหาทั่วไป แต่ยังเป็นส่วนหนึ่งของคำศัพท์มืออาชีพในขณะนี้
ACNB

1. เขียน - 2. การตรวจสอบ (รวมถึงการอ่านวรรณกรรมและเว็บไซต์เช่น P.SE) - 3. refactor - 4. ทำซ้ำ
HorusKol

ไม่มีประสบการณ์มาทดแทนไม่มีการตัดทอนความรู้เช่นนี้มาก่อน

คำตอบ:


14

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

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

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


4

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

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

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

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

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

ดังนั้นนี่คือสิ่งที่ฉันแนะนำ:

  1. เขียนรหัส (และพยายามเข้าใจสิ่งที่ทำให้มันแย่)
  2. อ่านรหัส (และพยายามเข้าใจสิ่งที่ทำให้ดี)
  3. แลกเปลี่ยนความรู้กับผู้อื่น นำความคิดของคุณไปทดสอบ

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

3

ดังที่คนอื่น ๆ พูดถึงคุณจะได้รับการฝึกฝนและประสบการณ์ที่ดีเท่านั้น ไม่มีทางลัดที่คุณสามารถทำได้จริง ๆ

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

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

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

ในการเริ่มต้นฉันอยากจะแนะนำหนังสือเหล่านี้:

  • หลักการรูปแบบและการปฏิบัติที่คล่องตัวใน C # - ฉันเป็นคนที่ 3/4 ผ่านหนังสือเล่มนี้ด้วยตัวเอง หนึ่งในประเด็นหลักที่ผู้เขียนทำและฉันเห็นด้วย 100% กับสิ่งนั้นอย่าเริ่มต้นแก้ปัญหาโดยมองหารูปแบบการออกแบบที่จะใช้ ทำให้สิ่งต่าง ๆ เรียบง่ายที่สุดเท่าที่จะเป็นไปได้และพัฒนาโค้ดให้เป็นรูปแบบหากทางเลือกเริ่มซับซ้อนกว่านั้น
  • รูปแบบการออกแบบ Head First - ฉันไม่ได้อ่านหนังสือเล่มนี้และใน IMO หลายชุด Head First ออกแบบมาเพื่อผู้ที่มาใหม่โดยเฉพาะ ดังนั้นพวกเขาจึงมีแนวโน้มที่จะอยู่ด้านที่เรียบง่ายขึ้น แต่ฉันได้ยิน / อ่านคำตอบที่ดีจากผู้อื่นเกี่ยวกับหนังสือเล่มนั้น

1
+1: "ทำให้สิ่งต่าง ๆ เรียบง่ายที่สุดเท่าที่จะทำได้" ... "วิวัฒนาการโค้ดให้เป็นรูปแบบ ... "
kevin cline

1

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

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