รูปแบบการออกแบบที่ไม่ใช่ OOP? [ปิด]


70

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

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

สามารถระบุได้เฉพาะกับภาษาการเขียนโปรแกรมบางภาษา แต่รูปแบบทั่วไป (ระดับกระบวนทัศน์) เป็นที่ต้องการของกระบวนทัศน์อื่นที่ไม่ใช่เชิงวัตถุ


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

14
ออบเจกต์เป็นรูปแบบการออกแบบในภาษาที่ไม่ใช่ OO :)
back2dos

1
ยิ่งแย่กว่านั้นหนังสือรูปแบบได้สร้างคนทั้งชั้นที่เชื่อว่าปัญหาทุกอย่างควรได้รับการแก้ไขโดยการใช้รูปแบบเฉพาะ
jwenting

คำตอบ:


25

12

อันที่จริงมันเป็นความขัดแย้ง - หนึ่งในรูปแบบที่ไม่ใช่ OO ที่นิยมมากที่สุดคือ ... "คลาส"

เนื่องจาก OO ถูกประดิษฐ์ในภาษาที่ไม่ใช่ OO นักพัฒนาจึงต้องจำลอง (และพวกเขากำลังทำมันในตอนนี้) - ดังนั้นรูปแบบจึงเกิด LISP และ C เป็นตัวอย่างของสิ่งนี้

แต่ใช้คำแนะนำของฉัน: อย่าทำผิดพลาดทั่วไป - อย่าใช้รูปแบบเพียงเพราะมันเจ๋งคุณต้องมีเหตุผลที่ร้ายแรงในการปรับการใช้รูปแบบ (อย่างน้อย OO)

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


11

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

ซึ่งหมายความว่าคุณสามารถค้นหารูปแบบการออกแบบได้ทุกที่ ในความเป็นจริง "แนวปฏิบัติที่ดีที่สุด" ทุกรูปแบบอาจเป็นรูปแบบการออกแบบที่เรียบง่าย


9
ตกลงกัน! จากPaul Graham : "ตัวอย่างเช่นในโลก OO คุณได้ยินข้อตกลงเกี่ยวกับ" pattern "เป็นอย่างดี [... ] เมื่อฉันเห็นรูปแบบในโปรแกรมของฉันฉันคิดว่ามันเป็นสัญญาณของปัญหารูปร่างของโปรแกรมควรสะท้อน ปัญหาที่ต้องแก้ไขเท่านั้นความสม่ำเสมออื่น ๆ ในรหัสคือสัญญาณสำหรับฉันอย่างน้อยที่สุดฉันกำลังใช้ abstractions ที่ไม่มีพลังเพียงพอ - บ่อยครั้งที่ฉันสร้างด้วยมือการขยายของแมโครบางตัว ที่ฉันต้องเขียน "
Andres F.

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

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

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

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

10

LtU กล่าวว่าJeremy Gibbonsกำลังเขียนหนังสือเกี่ยวกับรูปแบบในการเขียนโปรแกรมการทำงาน ตรวจสอบนายชะนีรูปแบบในบล็อกหน้าที่ Programmingไม่กี่ทีเซอร์ หมายเหตุเขาแนะนำให้อ่านโพสต์จากเก่าไปหาใหม่

รูปแบบการออกแบบกระดาษของเขาในรูปแบบของโปรแกรม Datatype-Generic (pdf) ที่เป็นแบบจำลองนั้นมีรูปแบบรูปแบบ Gang of Four: Composite, Iterator, Visitor และ Builder เขาอธิบายรูปแบบการเขียนโปรแกรมด้วยสมการแบบเรียกซ้ำในOrigami Programming (การพับและการกางออก)


9

มีรูปแบบการออกแบบ SQL

และมีรูปแบบการออกแบบฟังก์ชั่นบางอย่างเช่นกัน - ดูที่นี่สำหรับสกาลา


ลิงก์สกาล่าใช้งานไม่ได้
corvus_192

7

แทนที่จะตั้งชื่อรูปแบบการออกแบบที่ไม่ใช่อูฉันอยากจะให้คุณตัวอย่างของหนังสือที่มีรูปแบบการออกแบบจำนวนมาก (ในพวกเขาบางรูปแบบจะยังคงเฉพาะ OO):

หวังว่านี่จะช่วยได้


เหล่านี้เป็นคนที่ผมจะแนะนำยังบวก Hohpe และวูล์ฟรูปแบบบูรณาการขององค์กร
TMN

รูปแบบของพรานล่าสัตว์เป็นอย่างมาก OO :)
เดวิด Conde

@David Conde :) ส่วนใหญ่ของพวกเขาบริสุทธิ์ OO ทั้งหมดของพวกเขาจะถูกเขียนลงในวิธี OO แต่บางคนก็ใช้กับ OO ที่ไม่ใช่: ดูที่ "รูปแบบการนำเสนอเว็บ", "รูปแบบของรัฐเซสชั่น", "รูปแบบการกระจาย "
KeesDijk

2

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



1

ตัวอย่างที่ดีของรูปแบบที่ไม่ใช่ OOP เป็นแคตตาล็อกของฉันแน่นอนรูปแบบที่ชื่นชอบ: รูปแบบองค์กรของการพัฒนาซอฟต์แวร์เปรียวโดยเจมส์ทุม Coplien หนังสือเล่มนี้ไม่เกี่ยวกับรูปแบบซอฟต์แวร์เป็นเรื่องเกี่ยวกับคนแคตตาล็อกสำหรับการสร้างทีมที่ประสบความสำเร็จ ผู้จัดการทุกคนควรอ่านหนังสือเล่มนี้!


0

ฉันชอบคิดถึง Data Strucutres เช่น Queues รายการที่ลิงก์ต้นไม้แผนภูมิและรูปแบบอื่น ๆ พวกเขากำหนดรูปแบบบางอย่างเพื่อเก็บข้อมูลและประมวลผล พวกเขาอาจดูดั้งเดิมเมื่อเทียบกับ Gang of Four ผู้มีอุปการคุณระดับสูง แต่พวกเขาเป็นรูปแบบที่ไม่เคยมีมาก่อน ฉันหมายความว่าจะเกิดอะไรขึ้นถ้ามีคนใช้กองซ้อนเป็น FIFO แทนที่จะเป็น LIFO และในทางกลับกันสำหรับคิวและตั้งชื่อพวกเขาเป็นอย่างอื่น

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