ฉันเริ่มอ่านหนังสือรูปแบบการออกแบบโดย GoF รูปแบบบางอย่างคล้ายกันมากกับความแตกต่างทางแนวคิดเล็กน้อย
คุณคิดว่าในหลาย ๆ รูปแบบบางอย่างนั้นไม่จำเป็นในภาษาไดนามิกเช่น Python (เช่นเพราะมันถูกแทนที่ด้วยคุณสมบัติแบบไดนามิก)?
ฉันเริ่มอ่านหนังสือรูปแบบการออกแบบโดย GoF รูปแบบบางอย่างคล้ายกันมากกับความแตกต่างทางแนวคิดเล็กน้อย
คุณคิดว่าในหลาย ๆ รูปแบบบางอย่างนั้นไม่จำเป็นในภาษาไดนามิกเช่น Python (เช่นเพราะมันถูกแทนที่ด้วยคุณสมบัติแบบไดนามิก)?
คำตอบ:
Peter Norvig แสดงให้เห็นว่ารูปแบบการออกแบบ 16 ใน 23 รูปแบบที่พบในหนังสือ GOF นั้นมองไม่เห็นหรือง่ายกว่าในภาษาแบบไดนามิก (เขาเน้นที่ Lisp และ Dylan)
เนื่องจากคุณพูดถึง Python มีการนำเสนอที่ดีโดย Alex Martelli เกี่ยวกับหัวข้อ นอกจากนี้ยังเกี่ยวข้องกับงูหลามมีการโพสต์บล็อกที่ดีแสดงให้เห็นถึงหกรูปแบบการออกแบบในหลามสำนวน
ฉันยังให้พื้นที่เก็บข้อมูล GitHub กับการใช้งาน (โดยคนอื่น) ของรูปแบบการออกแบบที่พบมากที่สุดในหลาม
ไม่จำเป็นต้องมีรูปแบบการออกแบบ ในทุกภาษา
ฉันมักจะเจอโค้ดจำนวนมากที่เขียนโดยคนที่อ่านเกี่ยวกับรูปแบบการออกแบบและจากนั้นคิดว่าพวกเขาควรใช้พวกเขาทุกที่ ผลลัพธ์คือรหัสจริงถูกฝังอยู่ใต้ส่วนต่อประสานส่วนห่อหุ้มและเลเยอร์มากมายและอ่านยาก นั่นเป็นวิธีที่ผิดในการออกแบบลวดลาย
รูปแบบการออกแบบมีอยู่เพื่อที่คุณจะได้สำนวนที่มีประโยชน์สำนวนที่มีประโยชน์เมื่อคุณเจอปัญหา แต่คุณไม่ควรใช้รูปแบบใด ๆ ก่อนที่จะระบุปัญหา Keep It Simple Stupidควรเป็นหลักการที่เหนือกว่าเสมอ
นอกจากนี้ยังช่วยให้คิดถึงรูปแบบการออกแบบเป็นแนวคิดในการคิดเกี่ยวกับปัญหาแทนที่จะเขียนโค้ดสำเร็จรูปที่เฉพาะเจาะจง และส่วนมากของแผ่นสำเร็จรูปเป็นวิธีแก้ปัญหากับ Java ขาดฟังก์ชั่นฟรีและวัตถุฟังก์ชั่นมาตรฐานที่คุณใช้ในภาษาอื่น ๆ ส่วนใหญ่ที่มีพวกเขา (เช่น Python, C #, C ++ ฯลฯ )
ฉันอาจจะบอกว่าฉันมีรูปแบบผู้มาเยือน แต่ในภาษาใด ๆ ที่มีฟังก์ชั่นชั้นหนึ่งมันจะเป็นเพียงฟังก์ชั่นที่ใช้ฟังก์ชั่น แทนที่จะเป็นคลาสโรงงานฉันมักจะมีแค่ฟังก์ชั่นจากโรงงาน ฉันอาจจะบอกว่าฉันมีอินเทอร์เฟซ แต่จากนั้นเป็นเพียงสองสามวิธีที่ระบุไว้ด้วยความคิดเห็นเนื่องจากจะไม่มีการใช้งานอื่น ๆ (แน่นอนใน python อินเทอร์เฟซมักจะแสดงความคิดเห็นเสมอ ฉันยังพูดถึงรหัสว่าใช้รูปแบบเพราะมันเป็นวิธีที่มีประโยชน์ในการคิดเกี่ยวกับมัน แต่อย่าพิมพ์ทุกสิ่งจนกว่าฉันจะต้องการมันจริงๆ
ดังนั้นการเรียนรู้ทุกรูปแบบเป็นแนวความคิด และลืมการใช้งานเฉพาะ การนำไปใช้นั้นแตกต่างกันไปและควรแตกต่างกันไปในโลกแห่งความเป็นจริงแม้แต่ในจาวา
รูปแบบนามธรรมของโรงงานนั้นไม่จำเป็นในภาษาที่พิมพ์ด้วยเป็ดเช่น Python เนื่องจากเป็นภาษาที่สร้างขึ้นจริง
สิ่งเดียวที่อยู่ในใจคือรูปแบบซิงเกิล
เนื่องจาก Python ไม่ได้บังคับให้คุณใช้คลาสสำหรับทุกสิ่งคุณจึงสามารถใช้โครงสร้างข้อมูลส่วนกลางแทน อินสแตนซ์โครงสร้างข้อมูลส่วนกลางนั้นสามารถจัดการได้โดยอินสแตนซ์ แต่คุณไม่จำเป็นต้องควบคุมอินสแตนซ์ของคลาสนั้นคุณเพียงแค่สร้างอินสแตนซ์เมื่อนำเข้าและปล่อยไว้ที่นั้น
ส่วนใหญ่ Singletons ใน python จะถูกแทนที่ด้วยโมดูล โมดูลในหลามนั้นมีลักษณะเป็น Singletons โดยธรรมชาติ หลามล่ามสร้างเหล่านี้ครั้งเดียวและครั้งเดียวเท่านั้น
รูปแบบอื่น ๆ ทั้งหมดใน Design Patters ที่ฉันใช้ใน Python พร้อมกันและคุณจะพบตัวอย่างของพวกมันทั่วทั้ง Python standard library และใน Python
len
ทำงาน; กุยทำทางเลือกที่ชัดเจนที่นี่ ประเด็นของฉันคือแสดงให้เห็นว่า Python ไม่ใช่ภาษา OOP บริสุทธิ์ มันเป็นภาษาที่ใช้งานได้จริง ฉันชอบแบบนั้น.
รูปแบบการออกแบบสำหรับโปรแกรมเมอร์ไม่ใช่สำหรับภาษา โปรแกรมเมอร์มักจะใช้รูปแบบที่ช่วยให้พวกเขาเข้าใจถึงปัญหาที่เกิดขึ้น ไม่จำเป็นต้องมีรูปแบบการออกแบบ แต่อาจใช้เพื่อช่วยลดความซับซ้อนของสิ่งที่คุณพยายามทำ
Python และการพิมพ์เป็ดโดยเฉพาะนั้นมีจุดสิ้นสุดเกี่ยวกับรูปแบบและแนวทางปฏิบัติทั่วไปมากมายและข้อ จำกัด มากมายที่ถูกกำหนดโดยรูปแบบบางอย่าง (ความเป็นส่วนตัวความไม่สามารถเปลี่ยนแปลงได้ ฯลฯ ) จะมีผลต่อโปรแกรมเมอร์ที่ตกลงจะไม่ทำลายมันเท่านั้น . แต่ยังคงพวกเขาจะทำงานเป็นเวลานานเป็นโปรแกรมเมอร์เล่นพร้อม ประตูยังคงเป็นประตูแม้ว่าจะถูกล้อมรอบด้วยกำแพงในจินตนาการ
Python ถือเป็นภาษา "หลายกระบวนทัศน์" คุณสามารถใช้รูปแบบใดก็ได้ที่คุณต้องการ นี่คือเจตนา มันมีไว้สำหรับลำดับชั้นของคลาสที่ซับซ้อนเช่นแม้ว่าพวกเขาจะไม่จำเป็นอย่างสมบูรณ์และประดิษฐ์ขึ้นเล็กน้อย แต่สำหรับบางคนที่สิ่งที่เป็นนามธรรมโดยเฉพาะนั้นมีประโยชน์ ไม่ใช่เพราะปัญหานั้นต้องการ แต่เป็นเพราะโปรแกรมเมอร์ทำ ดังนั้นคุณไป
หนังสือ "Design Patterns" ต้นฉบับมีการบันทึกและตั้งชื่อสำนวนทั่วไปที่มีประโยชน์ในภาษาเชิงวัตถุที่จำเป็นเช่น C ++ และ Smalltalk แต่ Smalltalk เป็นภาษาที่พิมพ์แบบไดนามิกดังนั้นจึงไม่สามารถเป็นเรื่องของการเป็นแบบไดนามิกได้
อย่างไรก็ตามคำตอบสำหรับคำถามของคุณยังคงเป็น "ใช่": บางรูปแบบการออกแบบเหล่านี้จะไม่เกี่ยวข้องกับภาษาที่พิมพ์แบบไดนามิกที่ทันสมัย โดยทั่วไปจะมีที่แตกต่างกันรูปแบบการออกแบบในภาษาที่แตกต่างโดยเฉพาะอย่างยิ่งในการที่แตกต่างกันชนิดของภาษา
หากต้องการย้ำ: "รูปแบบการออกแบบ" เป็นเพียงชื่อสำนวนการเขียนโปรแกรม: วิธีแก้ปัญหาทั่วไปสำหรับปัญหาที่พบบ่อย ภาษาที่ต่างกันต้องการสำนวนที่แตกต่างกันเพราะสิ่งที่เป็นปัญหาสำหรับภาษาหนึ่งอาจเป็นเรื่องเล็กน้อยสำหรับอีกภาษาหนึ่ง ในแง่นี้รูปแบบการออกแบบมีแนวโน้มที่จะชี้ให้เห็นจุดอ่อนในภาษาที่ใช้
ดังนั้นคุณอาจมองหาคุณสมบัติอื่น ๆ ที่ทำให้ภาษาแบบไดนามิกที่ทันสมัย (หรือภาษาโบราณเช่น Lisp) มีประสิทธิภาพมากขึ้นทำให้การออกแบบรูปแบบคลาสสิกเหล่านี้ไม่เกี่ยวข้อง
รูปแบบการออกแบบเป็นวิธีการแก้ปัญหาเฉพาะ หากไม่พบปัญหารูปแบบการแก้ไขปัญหานั้นไม่มีประโยชน์
ผู้คนกำลังพยายามปรับรูปแบบการออกแบบทุกหนทุกแห่งราวกับว่าเป็นแนวทางปฏิบัติที่ดีที่สุดที่จะมีรูปแบบการออกแบบในโครงการของคุณ นั่นเป็นวิธีอื่น ๆ คุณพบปัญหาที่สามารถแก้ไขได้ด้วยรูปแบบจากโรงงานหรือไม่? เย็น. ปรับตัว อย่าค้นหารหัสของคุณและพยายามหาที่ที่เหมาะสมในการติดตั้งซิงเกิล (หรือจากโรงงานหรือด้านหน้าหรืออะไรก็ตาม ... )
บางที Python มีรูปแบบการออกแบบของตัวเองไม่พร้อมใช้งานสำหรับคน Java และ. NET (เนื่องจากลักษณะของภาษาเหล่านี้)?
ฉันจะบอกว่ารูปแบบขึ้นอยู่กับภาษาเสมอ รูปแบบหลามส่วนใหญ่นั้นดูเหมือนว่าที่กำหนดไว้ใน GoF เป็นเพราะ OOP ของ Python ที่กล่าวว่า OOP นั้นไม่เหมือนกับ OOP (ไม่มีสองภาษากำหนดวัตถุและการจัดการ 100% เหมือนกัน)
ดังนั้นจึงไม่ต้องสงสัยเลยว่ารูปแบบบางอย่างจะไม่สามารถใช้งานได้ "ตามที่เป็นอยู่" บางอย่างอาจไม่สมเหตุสมผลและมีรูปแบบบางอย่างที่อาจมีความหมายกับ Python เท่านั้น
ที่จะได้รับกลับมาตรงที่คำถามของคุณ: รูปแบบที่มีความจำเป็นเท่านั้นถ้าคุณต้องการให้พวกเขา คุณไม่จำเป็นต้องใช้มันหากไม่จำเป็นสำหรับพวกเขา
นอกจากนี้ยังมีรูปแบบมากกว่าที่กล่าวไว้ใน GoF ดูในวิกิพีเดียรูปแบบอื่น ๆ