ฟังก์ชั่นโปรแกรมแทนรูปแบบการออกแบบของ GoF หรือไม่?


1047

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

คนส่วนใหญ่ที่ฉันพบเจอได้อ่าน หนังสือรูปแบบการออกแบบโดย Gang of Four (GoF) โปรแกรมเมอร์ที่เคารพตนเองจะบอกคุณว่าหนังสือเล่มนี้เป็นผู้ไม่เชื่อเรื่องภาษาและรูปแบบที่ใช้กับวิศวกรรมซอฟต์แวร์โดยทั่วไปไม่ว่าคุณจะใช้ภาษาใด นี่คือการเรียกร้องอันสูงส่ง น่าเสียดายที่มันห่างไกลจากความจริง

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

คุณสมบัติหลักของ functional programming (FP) รวมถึงฟังก์ชั่นเป็นค่าชั้นหนึ่ง, currying, ค่าที่ไม่เปลี่ยนรูปแบบ ฯลฯ ฉันไม่เห็นว่ารูปแบบการออกแบบ OO ใกล้เคียงกับคุณลักษณะใด ๆ เหล่านั้น

นอกจากนี้ในภาษาที่ใช้งานได้ซึ่งสนับสนุน OOP (เช่น F # และ OCaml) ดูเหมือนว่าสำหรับฉันแล้วโปรแกรมเมอร์ที่ใช้ภาษาเหล่านี้จะใช้รูปแบบการออกแบบเดียวกันกับภาษา OOP อื่น ๆ อันที่จริงตอนนี้ฉันใช้ F # และ OCaml ทุกวันและไม่มีความแตกต่างที่โดดเด่นระหว่างรูปแบบที่ฉันใช้ในภาษาเหล่านี้กับรูปแบบที่ฉันใช้เมื่อฉันเขียนด้วย Java

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


18
คุณอาจดูบทความโดย Steve Yegge ( steve-yegge.blogspot.com/2006/03/… )
Ralph

27
"หนังสือเล่มนี้เป็นผู้ไม่เชื่อเรื่องภาษาและรูปแบบที่ใช้กับวิศวกรรมซอฟต์แวร์โดยทั่วไป" - ควรสังเกตว่าหนังสือเล่มนี้ไม่เห็นด้วยกับข้อเรียกร้องนี้ในแง่ที่ว่าบางภาษาไม่จำเป็นต้องแสดงสิ่งต่าง ๆ เช่นรูปแบบการออกแบบ: "รูปแบบของเรา ถือว่า Smalltalk / C ++ - คุณสมบัติภาษาระดับและตัวเลือกนั้นกำหนดสิ่งที่สามารถและไม่สามารถนำไปปฏิบัติได้อย่างง่ายดาย [... ] CLOS มีหลายวิธีเช่นซึ่งช่วยลดความต้องการรูปแบบเช่น Visitor (หน้า 331) " (หน้า 4)
Guildenstern

6
โปรดทราบว่ารูปแบบการออกแบบจำนวนมากไม่จำเป็นต้องใช้ภาษาที่จำเป็นในระดับสูงเพียงพอ
R. Barzell

3
@ R.Barzell อะไรคือ "ภาษาที่จำเป็นในระดับสูงเพียงพอ"? ขอบคุณ
cibercitizen1

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

คำตอบ:


1077

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

อย่างไรก็ตามมันถูกต้องว่ารูปแบบการออกแบบเฉพาะ OOP ส่วนใหญ่นั้นไม่เกี่ยวข้องกับภาษาที่ใช้งานได้จริง

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

นี่คือสิ่งที่ Gang of Four พูดถึงเกี่ยวกับปัญหานี้:

การเลือกภาษาโปรแกรมเป็นสิ่งสำคัญเพราะมันมีอิทธิพลต่อมุมมองของคน ๆ หนึ่ง รูปแบบของเราถือว่าคุณสมบัติภาษาระดับ Smalltalk / C ++ และตัวเลือกนั้นเป็นตัวกำหนดสิ่งที่สามารถและไม่สามารถนำไปปฏิบัติได้อย่างง่ายดาย หากเราสันนิษฐานว่าภาษาเชิงโพรซีเดอร์เราอาจรวมรูปแบบการออกแบบที่เรียกว่า "Inheritance", "Encapsulation," และ "Polymorphism" ในทำนองเดียวกันบางรูปแบบของเราได้รับการสนับสนุนโดยตรงจากภาษาเชิงวัตถุที่พบได้น้อย CLOS มีหลายวิธีเช่นซึ่งช่วยลดความต้องการรูปแบบเช่น Visitor ในความเป็นจริงมี Smalltalk และ C ++ แตกต่างกันมากพอที่จะหมายความว่ารูปแบบบางอย่างสามารถแสดงได้อย่างง่ายดายในภาษาหนึ่งมากกว่าอีกภาษาหนึ่ง (ดูที่ Iterator เป็นต้น)

(ข้างต้นเป็นคำพูดจากหนังสือแนะนำรูปแบบการออกแบบหน้า 4 วรรค 3)

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

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

ใช่รูปแบบการออกแบบ GoF หลายรูปแบบนั้นซ้ำซ้อนในภาษา FP เพราะมีตัวเลือกที่ทรงพลังกว่าและใช้งานง่ายกว่า

แต่แน่นอนว่ายังมีรูปแบบการออกแบบที่ไม่ได้รับการแก้ไขโดยภาษา FP อะไรคือสิ่งเทียบเท่า FP ของซิงเกิลตัน? (ไม่คำนึงถึงช่วงเวลาที่ซิงเกิลมักจะเป็นรูปแบบที่แย่มากที่จะใช้)

และมันก็ใช้ได้ทั้งสองทางด้วย อย่างที่ฉันบอกไปว่า FP มีรูปแบบการออกแบบเช่นกัน คนมักจะไม่คิดว่าเป็นเช่นนั้น

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

เราไม่จำเป็นต้องรูปแบบการออกแบบสำหรับ "เพิ่มตัวแปรคงที่" หรือ "อ่านจากซ็อกเก็ตว่า" เพราะมันเป็นเพียงสิ่งที่คุณทำ

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

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

นอกจากนี้ในภาษาที่ใช้งานได้ซึ่งสนับสนุน OOP (เช่น F # และ OCaml) ดูเหมือนว่าสำหรับฉันแล้วโปรแกรมเมอร์ที่ใช้ภาษาเหล่านี้จะใช้รูปแบบการออกแบบเดียวกันกับภาษา OOP อื่น ๆ อันที่จริงตอนนี้ฉันใช้ F # และ OCaml ทุกวันและไม่มีความแตกต่างที่โดดเด่นระหว่างรูปแบบที่ฉันใช้ในภาษาเหล่านี้เทียบกับรูปแบบที่ฉันใช้เมื่อฉันเขียนด้วย Java

อาจเป็นเพราะคุณยังคิดอย่างไม่ดีอยู่ใช่ไหม ผู้คนจำนวนมากหลังจากที่ต้องรับมือกับภาษาที่จำเป็นตลอดชีวิตพวกเขามีช่วงเวลาที่ยากลำบากในการเลิกนิสัยนี้เมื่อพวกเขาลองใช้ภาษาที่ใช้งานได้ (ฉันเคยเห็นความพยายามที่ค่อนข้างตลกที่ F # โดยแท้จริงทุกฟังก์ชั่นเป็นเพียงคำสั่ง 'Let' โดยทั่วไปราวกับว่าคุณใช้โปรแกรม C และแทนที่เครื่องหมายอัฒภาคทั้งหมดด้วย 'let' :))

แต่ความเป็นไปได้อีกอย่างหนึ่งก็คือคุณเพิ่งไม่ได้ตระหนักว่าคุณกำลังแก้ปัญหาเล็กน้อยซึ่งจะต้องใช้รูปแบบการออกแบบในภาษา OOP

เมื่อคุณใช้การ currying หรือส่งผ่านฟังก์ชันเป็นอาร์กิวเมนต์ให้หยุดและคิดเกี่ยวกับวิธีที่คุณทำในภาษา OOP

มีความจริงใด ๆ ที่อ้างว่าการเขียนโปรแกรมใช้งานได้นั้นไม่จำเป็นต้องใช้รูปแบบการออกแบบ OOP หรือไม่?

อ๋อ :) เมื่อคุณทำงานในภาษา FP คุณไม่จำเป็นต้องใช้รูปแบบการออกแบบเฉพาะ OOP อีกต่อไป แต่คุณยังต้องการรูปแบบการออกแบบทั่วไปเช่น MVC หรือสิ่งที่ไม่ใช่ OOP อื่น ๆ และคุณต้องการรูปแบบการออกแบบเฉพาะ "FP รูปแบบใหม่" สองรายการแทน ทุกภาษามีข้อบกพร่องและรูปแบบการออกแบบมักเป็นวิธีที่เราแก้ไข

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


ตามที่คาดไว้มีไม่กี่คนที่คัดค้านคำจำกัดความของรูปแบบการออกแบบว่า "การแก้ไขข้อบกพร่องในภาษา" ดังนั้นนี่คือเหตุผลของฉัน:

ดังที่ได้กล่าวไปแล้วรูปแบบการออกแบบส่วนใหญ่มีความเฉพาะสำหรับกระบวนทัศน์การเขียนโปรแกรมหนึ่งภาษาหรือบางครั้งแม้แต่ภาษาเดียว บ่อยครั้งที่พวกเขาแก้ปัญหาที่มีอยู่ในกระบวนทัศน์นั้นเท่านั้น(ดู monads for FP หรือโรงงานที่เป็นนามธรรมสำหรับ OOP)

เหตุใดรูปแบบนามธรรมของโรงงานจึงไม่มีใน FP เนื่องจากปัญหาที่พยายามแก้ไขไม่มีอยู่

ดังนั้นหากปัญหามีอยู่ในภาษา OOP ซึ่งไม่มีอยู่ในภาษา FP แสดงให้เห็นอย่างชัดเจนว่าเป็นข้อบกพร่องของภาษา OOP ปัญหาสามารถแก้ไขได้ แต่ภาษาของคุณไม่สามารถทำได้ แต่ต้องใช้รหัสสำเร็จรูปจากคุณในการแก้ไข เป็นการดีที่เราต้องการให้ภาษาการเขียนโปรแกรมของเราสามารถทำให้ปัญหาทั้งหมดหายไปได้อย่างน่าอัศจรรย์ ปัญหาใด ๆ ที่ยังคงมีอยู่ในหลักการข้อบกพร่องของภาษา ;)


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

135
S.Lott: พวกเขาอธิบายวิธีแก้ไขปัญหาที่มีอยู่ในภาษาที่กำหนดใช่ ไม่มีรูปแบบการออกแบบคำสั่งในภาษา FP เนื่องจากไม่มีปัญหาในการพยายามแก้ไข ซึ่งหมายความว่าพวกเขาแก้ปัญหาที่ภาษาไม่สามารถแก้ไขได้ นั่นคือข้อบกพร่องในภาษา
jalf

38
Monad เป็นแนวคิดทางคณิตศาสตร์และคุณยืดมันด้วยการจำแนกของคุณ แน่นอนว่าคุณสามารถดูฟังก์ชั่น, monoids, monads, matrices หรือแนวคิดทางคณิตศาสตร์อื่น ๆ เป็นรูปแบบการออกแบบ แต่สิ่งเหล่านี้เป็นเหมือนอัลกอริทึมและโครงสร้างข้อมูล ... แนวคิดพื้นฐานภาษาอิสระ
Alexandru Nedelcu

41
แน่นอนว่า monads เป็นแนวคิดทางคณิตศาสตร์ แต่พวกเขาก็เป็นรูปแบบเช่นกัน "รูปแบบ FP" ของพระจะค่อนข้างแตกต่างจากแนวคิดทางคณิตศาสตร์ของพระ ก่อนหน้านี้เป็นรูปแบบที่ใช้เพื่อหลีกเลี่ยง "ข้อ จำกัด " ในภาษา FP บริสุทธิ์ หลังเป็นแนวคิดทางคณิตศาสตร์สากล
jalf

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

152

มีความจริงใด ๆ ที่อ้างว่าการเขียนโปรแกรมใช้งานได้นั้นไม่จำเป็นต้องใช้รูปแบบการออกแบบ OOP หรือไม่?

ฟังก์ชั่นการเขียนโปรแกรมไม่เหมือนกับการเขียนโปรแกรมเชิงวัตถุ รูปแบบการออกแบบเชิงวัตถุใช้ไม่ได้กับการเขียนโปรแกรมใช้งานได้ คุณมีรูปแบบการออกแบบโปรแกรมที่ใช้งานได้แทน

สำหรับการเขียนโปรแกรมที่ใช้งานได้คุณจะไม่อ่านหนังสือรูปแบบการออกแบบ OO คุณจะอ่านหนังสือเล่มอื่น ๆ เกี่ยวกับรูปแบบการออกแบบ FP

ผู้ไม่เชื่อเรื่องภาษา

ไม่ทั้งหมด เฉพาะผู้ไม่เชื่อเรื่องภาษาที่เกี่ยวกับภาษา OO รูปแบบการออกแบบไม่ได้ใช้กับภาษาเชิงปฏิบัติเลย พวกเขาแทบจะไม่สมเหตุสมผลในบริบทการออกแบบฐานข้อมูลเชิงสัมพันธ์ ไม่สามารถใช้งานได้เมื่อออกแบบสเปรดชีต

รูปแบบการออกแบบทั่วไปของ OOP และการทำงานที่เทียบเท่ากัน?

ข้างต้นไม่ควรอยู่ มันเหมือนกับขอรหัสชิ้นส่วนที่เขียนใหม่เป็นรหัส OO อืมมม ... ถ้าฉันแปล Fortran ดั้งเดิม (หรือ C) เป็น Java ฉันก็ไม่ได้ทำอะไรมากไปกว่าการแปล ถ้าฉันเขียนมันเป็นกระบวนทัศน์ของ OO โดยสิ้นเชิงมันจะไม่เหมือนกับฟอร์แทรนดั้งเดิมหรือซี - มันจะไม่สามารถจดจำได้อีกต่อไป

ไม่มีการแมปง่าย ๆ ตั้งแต่การออกแบบ OO ไปจนถึงการออกแบบฟังก์ชั่น พวกเขาแตกต่างกันมากในการมองปัญหา

ฟังก์ชั่นการเขียนโปรแกรม (เหมือนทุกรูปแบบของการเขียนโปรแกรม) มีรูปแบบการออกแบบ ฐานข้อมูลเชิงสัมพันธ์มีรูปแบบการออกแบบ OO มีรูปแบบการออกแบบและการเขียนโปรแกรมตามขั้นตอนมีรูปแบบการออกแบบ ทุกอย่างมีรูปแบบการออกแบบแม้แต่สถาปัตยกรรมของอาคาร

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

ทุกคนที่คิดเกี่ยวกับสิ่งที่พวกเขากำลังทำจะเปิดเผยรูปแบบการออกแบบ


12
MVC ไม่ใช่การออกแบบ OO มันคือการออกแบบสถาปัตยกรรม - รูปแบบนั้นใช้กันอย่างแพร่หลาย
S.Lott

1
@ Princess: ฟังก์ชั่นการเขียนโปรแกรมไม่จำเป็นต้องง่ายกว่านี้ ในตัวอย่างของคุณใช่ สำหรับสิ่งอื่น ๆ คณะลูกขุนยังคงออก แต่คุณละทิ้งรูปแบบการออกแบบ Java OO และนำรูปแบบการออกแบบ FP มาใช้
S.Lott

1
+1: ฉันชอบคำตอบนี้มากกว่าคำตอบของ Jalf ด้านบน แม้ว่ารูปแบบการออกแบบบางอย่างจะระบุถึงข้อบกพร่องในภาษา แต่ไม่ใช่ทั้งหมด ตัวอย่างเช่นฉันแทบจะไม่พูดว่ารูปแบบการออกแบบ "untying the recursive knot" แก้ปัญหาข้อบกพร่องในภาษาเป็นเพียงสำนวนที่มีประโยชน์ในการคลายการพึ่งพา
Jon Harrop

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

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

46

ความคิดเห็นของไบรอันเกี่ยวกับการเชื่อมโยงที่แน่นหนาระหว่างภาษาและรูปแบบเป็นประเด็น

ส่วนที่ขาดหายไปของการสนทนานี้เป็นแนวคิดของสำนวน หนังสือของ James O. Coplien "Advanced C ++" เป็นอิทธิพลอย่างมากที่นี่ นานก่อนที่เขาจะค้นพบคริสโตเฟอร์อเล็กซานเดอร์และคอลัมน์ที่ไม่มีชื่อ (และคุณไม่สามารถพูดได้อย่างสมเหตุสมผลเกี่ยวกับรูปแบบโดยไม่อ่านอเล็กซานเดอร์ด้วย) เขาพูดถึงความสำคัญของการใช้สำนวนในการเรียนรู้ภาษาอย่างแท้จริง เขาใช้การคัดลอกสตริงใน C เป็นตัวอย่างwhile(*from++ = *to++);คุณสามารถเห็นสิ่งนี้ว่าเป็น bandaid สำหรับคุณสมบัติภาษาที่ขาดหายไป (หรือคุณสมบัติห้องสมุด) แต่สิ่งที่สำคัญจริงๆเกี่ยวกับมันคือมันเป็นหน่วยความคิดขนาดใหญ่หรือการแสดงออกมากกว่า ชิ้นส่วนของมัน

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

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


8
ขอบคุณ! นี่คือรูปแบบที่เกี่ยวกับ - "แนวคิดเกี่ยวกับการทำให้อ้วน" เพื่อลดภาระการรับรู้
Randall Schulz

และ Monads เชิงหน้าที่อยู่ในการสนทนานี้อย่างแน่นอน
เกร็ก

@ RandallSchulz: คุณสมบัติภาษา (และการใช้สำนวนของพวกเขาแน่นอน) ก็จะพอดีกับหมวดหมู่ของ "แนวคิด chunking เพื่อลดภาระการรับรู้"
Roy Tinker

39

หนังสือ GoF เชื่อมโยงตัวเองกับ OOP อย่างชัดเจน - ชื่อคือรูปแบบการออกแบบ - องค์ประกอบของซอฟต์แวร์เชิงวัตถุที่นำกลับมาใช้ใหม่



26

นี่คือลิงค์อื่นที่พูดถึงหัวข้อนี้: http://blog.ezyang.com/2010/05/design-patterns-in-haskel/

ในบล็อกโพสต์ของเขาเอ็ดเวิร์ดอธิบายรูปแบบ GoF ดั้งเดิม 23 ทั้งหมดในแง่ของ Haskell


4
บทความดูเหมือนจะไม่แสดงรูปแบบการออกแบบใน Haskell แต่แสดงให้เห็นว่า Haskell ตอบสนองความต้องการเหล่านั้นได้อย่างไรโดยไม่ต้องพูดถึงรูปแบบ
Fresheyeball

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

20

เมื่อคุณพยายามดูสิ่งนี้ในระดับ "รูปแบบการออกแบบ" (โดยทั่วไป) และ "FP กับ OOP" คำตอบที่คุณจะพบจะมืดมัวที่สุด

ใช้ระดับที่ลึกลงไปในทั้งสองแกนและพิจารณารูปแบบการออกแบบเฉพาะและคุณสมบัติภาษาเฉพาะและสิ่งต่าง ๆ จะชัดเจนขึ้น

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

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

(นอกเหนือจาก: นี่คือบล็อกล่าสุดที่ฉันเขียนซึ่งมีลิงก์อื่น ๆ เพื่ออภิปรายเพิ่มเติมเกี่ยวกับ FP และรูปแบบการออกแบบ)


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

22
ใช่ แต่เปลี่ยนจากรูปแบบซึ่งเป็นแนวคิดการออกแบบที่คุณอ่านในหนังสือและนำไปใช้กับรหัสของคุณเป็น "แค่โค้ด" นั่นคือ "ใช้ยูเนี่ยนประเภทและการจับคู่รูปแบบ" เป็นเพียงวิธีที่คุณเขียนโค้ดในภาษาดังกล่าวตามปกติ (คล้ายคลึง: หากไม่มีภาษาใดที่มีforลูปและทุกคนก็มีwhileลูปดังนั้น "สำหรับ" อาจเป็นรูปแบบการทำซ้ำ แต่เมื่อforเป็นเพียงโครงสร้างที่สนับสนุนโดยภาษาและวิธีการใช้รหัสคนตามปกติ จำเป็นต้องใช้รูปแบบ, รหัสมันเป็นเพียงแค่คน).
ไบรอัน

4
อีกวิธีหนึ่งการทดสอบสารสีน้ำเงินสำหรับ "นั่นคือรูปแบบ" หรืออาจไม่ดีคือ: รหัสปัจจุบันเขียนด้วยวิธีนี้กับนักศึกษาระดับปริญญาตรีชั้นปีที่สองวิชาเอก CS ด้วยการเขียนโปรแกรมประสบการณ์หนึ่งปีในภาษาของคุณ หากคุณแสดงรหัสพวกเขาและพวกเขาไป "นั่นคือการออกแบบที่ฉลาด" แล้วมันเป็นรูปแบบ หากคุณแสดงรหัสให้พวกเขาและพวกเขาไป "ดี duh!" แล้วมันไม่ใช่รูปแบบ (และถ้าคุณแสดง "ผู้เข้าชม" นี้ให้กับทุกคนที่ทำ ML / F # / Haskell เป็นเวลาหนึ่งปีพวกเขาจะไป "สบายดี!")
Brian

1
ไบรอัน: ฉันคิดว่าเรามีคำจำกัดความที่แตกต่างกันของ "รูปแบบ" ผมคิดว่าสิ่งที่เป็นนามธรรมการออกแบบใด ๆ ที่สามารถระบุตัวจะเป็นรูปแบบในขณะที่คุณพิจารณาเฉพาะแนวคิดที่ไม่ชัดเจนว่าจะเป็นรูปแบบ เพียงเพราะ C # มีforeachและ Haskell mapMไม่ได้หมายความว่าพวกเขาไม่มีรูปแบบ Iterator ฉันไม่เห็นปัญหาในการบอกว่ารูปแบบ Iterator ถูกนำไปใช้เป็นอินเตอร์เฟสทั่วไปIEnumerable<T>ใน C # และ typeclass Traversableใน Haskell
Gabe

อาจเป็นไปได้ว่ารูปแบบที่ไม่ชัดเจนใช้กับวิศวกรซอฟต์แวร์ แต่รูปแบบทั้งหมดใช้สำหรับนักออกแบบภาษา คือถ้าคุณกำลังสร้างภาษาใหม่ตรวจสอบให้แน่ใจว่าได้รวมวิธีที่ชัดเจนเพื่อแสดงรูปแบบตัววนซ้ำ " แม้แต่รูปแบบที่ชัดเจนก็เป็นที่สนใจเมื่อเราเริ่มถามคำถาม "มีไวยากรณ์ที่ดีกว่าสำหรับการแสดงความคิดเห็นนี้หรือไม่" ท้ายที่สุดแล้วนั่นคือสิ่งที่นำพาให้ใครบางคนสร้าง foreach
srm

16

การนำเสนอของ Norvig แสดงถึงการวิเคราะห์ที่พวกเขาทำในทุกรูปแบบของ GoF และพวกเขาบอกว่า 16 จาก 23 รูปแบบนั้นมีการใช้งานที่ง่ายขึ้นในภาษาที่ใช้งานได้หรือเป็นส่วนหนึ่งของภาษา ดังนั้นอย่างน้อยพวกเขาเจ็ดคนก็อาจจะเป็นก) มีความซับซ้อนเท่ากันหรือข) ไม่มีอยู่ในภาษา น่าเสียดายสำหรับพวกเราพวกเขาจะไม่แจกแจง!

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

หนึ่งอาจเป็นต้นแบบ; ในขณะที่มันเป็นความคิดพื้นฐานของ JavaScript แต่จะต้องดำเนินการตั้งแต่เริ่มต้นในภาษาอื่น ๆ

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


2
เป็นการวิเคราะห์ที่แปลกที่ต้องทำตั้งแต่รูปแบบ GoF ได้รับการออกแบบมาโดยเฉพาะสำหรับภาษา OOP ที่อ้างอิงกับคลาส ดูเหมือนว่าเป็นการวิเคราะห์ว่า wrenches ท่อนั้นดีสำหรับการทำงานไฟฟ้าหรือไม่
munificent

@munificent: ไม่จริง การวางแนววัตถุให้ความแตกต่าง; ฟังก์ชั่นการเขียนโปรแกรมโดยทั่วไปให้ความหลากหลาย
Marcin

@Marcin โปรแกรมเมอร์ OO หมายถึงบางสิ่งที่แตกต่างจาก polymorphism มากกว่าโปรแกรมเมอร์ที่ใช้งานได้
AndrewC

@AndrewC ฉันไม่เห็นด้วย โปรแกรมเมอร์ OO อาจคิดว่าพวกเขาหมายถึงสิ่งที่แตกต่างกัน แต่พวกเขาไม่ได้
Marcin

3
@Marcin จากประสบการณ์ของฉันโปรแกรมเมอร์ OO มักจะอ้างถึง polymorphism ชนิดย่อย (มักจะใช้ Object) ใช้การปลดเปลื้องเพื่อให้บรรลุหรือ ad-hoc polymorphism (overloading ฯลฯ ) เมื่อโปรแกรมเมอร์ที่ใช้งานกล่าวว่า polymorphism นั้นหมายถึง parametric polymorphism (เช่นทำงานกับข้อมูลประเภทใด ๆ - Int, function, list) ซึ่งอาจคล้ายกับการเขียนโปรแกรมทั่วไปของ OO มากกว่าที่เป็นสิ่งที่โปรแกรมเมอร์ OO มักเรียกว่า polymorphism
AndrewC

15

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


ฉันหลงทางไปแล้ว เพื่อเพิ่มบางสิ่งด้วย abstractions ... นั่นหมายความว่าอย่างไร
tuinstoel

2
คุณสามารถสร้าง abstractions เฉพาะโดเมน (แม้แต่ที่ฝังอยู่) โดยไม่ต้องแมโคร แมโครให้คุณเพิ่มความน่ารักด้วยการเพิ่มไวยากรณ์ที่กำหนดเอง
Jon Harrop

2
คุณสามารถนึกได้ว่า Lisp เป็นชุดของ Legos สำหรับการสร้างภาษาการเขียนโปรแกรม - มันเป็นภาษา แต่มันก็เป็นโลหะ ซึ่งหมายความว่าสำหรับโดเมนที่มีปัญหาคุณสามารถกำหนดภาษาที่ไม่มีข้อบกพร่องที่ชัดเจนได้ มันต้องมีการฝึกฝนบ้างและ Kurt Gödelอาจไม่เห็นด้วย แต่ก็คุ้มค่าที่จะใช้เวลากับ Lisp เพื่อดูว่ามันจะนำอะไรมาสู่ตาราง (hint, macros)
เกร็ก

9

และแม้แต่โซลูชันรูปแบบการออกแบบ OO ก็เป็นภาษาเฉพาะ

รูปแบบการออกแบบเป็นวิธีการแก้ปัญหาทั่วไปที่ภาษาการเขียนโปรแกรมของคุณไม่ได้แก้ให้คุณ ใน Java รูปแบบซิงเกิลตันแก้ปัญหาที่เกิดขึ้นครั้งเดียว (แบบง่าย)

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


8

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


4
รูปแบบ GoP เป็นวิธีการแก้ปัญหาข้อ จำกัด ของภาษาการเขียนโปรแกรมเฉพาะประเภทที่เข้ามาในแบบของคุณ ตัวอย่างเช่น "ฉันต้องการอ้อมในชั้นเรียนและบอกให้พวกเขาสร้างวัตถุ" -> "คุณทำไม่ได้ แต่คุณสามารถสร้างวัตถุที่คล้าย metaclass ที่เรียกว่าโรงงาน" "ฉันต้องการการจัดส่งหลายครั้ง" -> "คุณทำไม่ได้ แต่มีเขาวงกตที่คุณสามารถนำไปใช้เรียกว่ารูปแบบผู้เข้าชม" เป็นต้นไม่มีรูปแบบที่เหมาะสมหากคุณไม่ได้อยู่ในภาษา OOP ที่มีข้อ จำกัด เฉพาะ
Kaz

1
ฉันไม่รู้เกี่ยวกับ "ไม่มี" ในภาษาอื่น แต่ฉันเห็นด้วยว่าส่วนมากไม่เข้าใจในภาษาอื่น ดูเหมือนว่าอแด็ปเตอร์และบริดจ์มีความเป็นไปได้หลายภาษามากขึ้นลดลงเล็กน้อยสำหรับผู้เข้าชมและอาจน้อยกว่าสำหรับผู้ฟัง อย่างไรก็ตามรูปแบบข้ามภาษามักจะได้รับผลกระทบจาก "วิธีการดำเนินการของภาษา X ในภาษา Y" อยู่เสมอโดยแบ่งประเภทตามขอบเขตของภาษา ตัวอย่างที่สมบูรณ์แบบคือรูปแบบซิงเกิลซึ่งโดยพื้นฐานแล้วฉันจะหา C globals ใน OOP ได้อย่างไร (ซึ่งฉันจะตอบคุณไม่ควร)
Edwin Buck

1
ฉันสอง Kaz: รูปแบบไม่ใช่ "วิธีการแก้ปัญหาที่คล้ายกันที่ได้เห็นครั้งแล้วครั้งเล่า" แต่ "วิธีการแก้ปัญหาที่คล้ายกันที่ได้เห็นครั้งแล้วครั้งเล่าและจะต้องมีการเขียนใหม่อีกครั้งเพราะภาษาไม่อนุญาต เขียนเพียงครั้งเดียว " กล่าวอีกนัยหนึ่งถ้าภาษาอนุญาตให้แยกรูปแบบ / นามธรรมในไลบรารี่ / คลาส / โมดูล ฯลฯ มันหยุดเป็นรูปแบบ แต่กลายเป็นไลบรารี่ / คลาส / โมดูล ใน FP มันง่ายกว่ามากในการแยก / bit ของรหัสเป็นฟังก์ชั่นดังนั้น "รูปแบบ" จึงถูกแปลงได้ง่ายขึ้นในรหัสที่ใช้ซ้ำได้ทำให้ไม่มีรูปแบบ
mb14

1
การตีความของคุณยินดีต้อนรับ แต่หนังสือ GoF นั้นชัดเจนในการกำหนดรูปแบบและถ้าคุณอ่านบทแนะนำก็ไม่ได้พูดอะไรเกี่ยวกับภาษาหรือจุดอ่อนของภาษา แน่นอนว่าบางภาษามีพื้นที่ซึ่งจะทำให้พวกเขาใช้ประโยชน์จากรูปแบบบางอย่างบ่อยขึ้น แต่ไม่ว่าคุณจะเขียนสิบครั้ง (ตัดและวาง) หรือใช้งานครั้งเดียวกับสิบสำนึก (sub-classing) หรือมีกรอบการกำหนดค่าให้สิบเล็กน้อย วิธีที่แตกต่างเป็นเพียงรายละเอียดการใช้งานของรูปแบบการเปิดเผย
Edwin Buck

1
เมื่อย้อนกลับไปสู่การสนทนานี้หลังจากหลายปีที่ผ่านมาฉันคิดว่าผู้คนจำนวนมากเชื่อมโยงรูปแบบกับภาษาการเขียนโปรแกรมเฉพาะหรือกระบวนทัศน์การเขียนโปรแกรมเฉพาะ สามารถใช้ในบริบทดังกล่าว แต่มีอยู่ก่อนการเขียนโปรแกรม "วิธีการสร้างที่ไร้กาลเวลา" กล่าวถึง patters ในสถาปัตยกรรมอาคารและการวางแผนชุมชน นี่หมายความว่าเทคนิคการวางลวดลายสามารถใช้นอก "ข้อ จำกัด ของภาษา" นอกเสียจากว่าคุณต้องการเรียกโครงสร้างการสร้างภาษาการเขียนโปรแกรม :)
Edwin Buck

8

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

ลองดูว่า Scala ทำอะไรได้บ้างด้วย "รูปแบบซิงเกิล": คุณเพียงแค่ประกาศวัตถุแทนคลาส คุณสมบัติอื่นการจับคู่รูปแบบช่วยหลีกเลี่ยง clunkiness ของรูปแบบผู้เข้าชม ดูการเปรียบเทียบได้ที่นี่: การจับคู่รูปแบบของ Scala = รูปแบบผู้เข้าชมบนเตียรอยด์

และ Scala เช่น F # นั้นเป็นการผสมผสานระหว่าง OO-functional ฉันไม่รู้เกี่ยวกับ F # แต่อาจมีฟีเจอร์เหล่านี้

การปิดมีอยู่ในภาษาที่ใช้งานได้ แต่ไม่จำเป็นต้องถูก จำกัด พวกเขาช่วยด้วยรูปแบบของผู้แทน

อีกหนึ่งข้อสังเกต โค้ดชิ้นนี้ใช้รูปแบบ: มันเป็นแบบคลาสสิกและเป็นองค์ประกอบที่เรามักจะไม่คิดว่าเป็น "รูปแบบ" แต่แน่นอนว่า:

for(int i = 0; i < myList.size(); i++) { doWhatever(myList.get(i)); }

ภาษาที่จำเป็นเช่น Java และ C # ได้นำสิ่งที่เป็นโครงสร้างการทำงานเพื่อจัดการกับสิ่งนี้: "foreach"


ฉันจะบอกว่า Scala รวมถึงการสนับสนุนชั้นหนึ่งสำหรับรูปแบบซิงเกิล รูปแบบยังคงอยู่ที่นั่น แต่รหัสสำเร็จรูปจำเป็นต้องใช้รูปแบบจะลดลงอย่างมากเมื่อเทียบกับ Java
JacquesB

หากความคิดเห็นเป็นเหมือน ******* ก็ดี ... ดูคำตอบที่เหลือ "คุณเพียงแค่ประกาศวัตถุแทนคลาส" นั้นเป็นความจริงฉันจะเรียกมันว่าเป็นวัตถุตามตัวอักษรอย่างชัดเจน (เช่น var singleton = {};) ฉันยังชอบพูดถึงเกี่ยวกับรูปแบบ foreach น่าเสียดายที่ดูเหมือนว่าคนส่วนใหญ่ที่ตอบ / แสดงความคิดเห็นในคำถามนี้ไม่เข้าใจการเขียนโปรแกรมที่ใช้งานได้และต้องการปรับการใช้รูปแบบการออกแบบ OOP +1 สำหรับการให้ตัวอย่างที่เป็นรูปธรรมฉันจะให้มากขึ้นถ้าทำได้
Evan Plaice

@JacquesB ฉันไม่สามารถให้ความเห็นเกี่ยวกับ Scala / Haskell ได้ แต่ใน JavaScript (เช่นไฮบริดใช้งานได้ / จำเป็น) ไม่มีการสร้างแผ่นเพียงแค่คุณปรับวิธีที่คุณประกาศวัตถุโดยใช้การรวมกันของไวยากรณ์ตัวอักษรวัตถุฟังก์ชันที่ไม่ระบุชื่อ สมาชิกของคลาสและอนุญาตให้มีการสืบทอดหลายรายการ (ไม่จำเป็นต้องทำสัญญาอินเตอร์เฟส)
Evan Plaice

8

รูปแบบการออกแบบ GoF คือการเข้ารหัสสูตรการแก้ปัญหาสำหรับภาษา OO ที่เป็นทายาทของSimula 67เช่น Java และ C ++

"ills" ส่วนใหญ่ที่ได้รับการออกแบบโดยลวดลายนั้นเกิดจาก:

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

รูปแบบการออกแบบเหล่านี้ไม่มีรูปแบบเดียวที่ไม่ได้หายไปใน Common Lisp Object System แม้ว่าโซลูชันจะมีโครงสร้างในแบบเดียวกับในรูปแบบการออกแบบที่สอดคล้องกัน (ยิ่งไปกว่านั้นระบบวัตถุนั้นนำหน้าหนังสือ GoF ในช่วงทศวรรษที่ผ่านมา Common Lisp กลายเป็นมาตรฐาน ANSI ในปีเดียวกับที่หนังสือเล่มนั้นได้รับการตีพิมพ์ครั้งแรก)

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

การก่อสร้างและการเข้าถึงที่ไม่กลายพันธุ์นั้นเข้ากันได้กับฟังก์ชั่นการเขียนโปรแกรมและรูปแบบอื่น ๆ ที่เกี่ยวข้องกับการเข้าถึงแบบ abstracting หรือการก่อสร้างสามารถใช้ได้: รูปแบบเช่นโรงงาน, ซุ้ม, พร็อกซี่, มัณฑนากร, มัณฑนากร

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


2
"รูปแบบการออกแบบของ GoF คือการเข้ารหัสสูตรการแก้ปัญหา" เป็นเพียงข้อความเท็จ
John Peters

7

ฉันต้องการเชื่อมต่อเอกสารที่ยอดเยี่ยม แต่ค่อนข้างหนาแน่นโดย Jeremy Gibbons: "รูปแบบการออกแบบเป็นโปรแกรมประเภทข้อมูลทั่วไปที่มีคำสั่งซื้อสูงกว่า" และ "สาระสำคัญของรูปแบบ Iterator" (มีให้ทั้งสองที่นี่: http: // www comlab.ox.ac.uk/jeremy.gibbons/publications/ )

ทั้งสองอธิบายถึงวิธีการสร้างฟังก์ชั่นสำนวนครอบคลุมภูมิประเทศที่ครอบคลุมโดยรูปแบบการออกแบบเฉพาะในการตั้งค่าอื่น ๆ (เชิงวัตถุ)


6

คุณไม่สามารถสนทนานี้ได้หากไม่นำระบบชนิดขึ้นมา

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

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

แต่แน่นอนว่ายังมีรูปแบบการออกแบบที่ไม่ได้รับการแก้ไขโดยภาษา FP อะไรคือสิ่งเทียบเท่า FP ของซิงเกิลตัน? (ไม่คำนึงถึงช่วงเวลาที่ซิงเกิลมักจะมีรูปแบบการใช้งานที่แย่มาก)

สิ่งแรกที่ทำคือการกำจัดความจำเป็นในการพิมพ์เดี่ยว

คุณสามารถผ่านรายการ 23 และกำจัดเพิ่มเติม แต่ตอนนี้ฉันไม่มีเวลา


6
ประเภทของ typeclasses (เทียบเท่า FP ของอินเตอร์เฟส OOP) กำจัดความต้องการ singletons (เทียบเท่า FP ของรัฐทั่วโลก) ได้อย่างไร
Gabe

4

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


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

4

เป็นหลักใช่ !

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

นอกจากนี้หน้านี้(AreDesignPatternsMissingLanguageFeatures)ยังมีตารางการแปล "รูปแบบ / คุณสมบัติ" และการสนทนาที่ดีหากคุณยินดีที่จะขุด


3

ฟังก์ชั่นการเขียนโปรแกรมไม่ได้แทนที่รูปแบบการออกแบบ ไม่สามารถเปลี่ยนรูปแบบการออกแบบ

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


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

3
รูปแบบเฉพาะใด ๆอาจเปลี่ยนได้ แต่แนวคิดของรูปแบบไม่สามารถทำได้ โปรดจำไว้ว่าคำว่า "รูปแบบ" ที่เกิดขึ้นในเขตของสถาปัตยกรรม
Frank Shearar

1
รูปแบบไม่ได้หมายถึงการแก้ปัญหาการเขียนโปรแกรม รูปแบบเป็นวิธีที่เราเขียนโปรแกรม เอกสารประกอบของรูปแบบมีขึ้นเพื่อช่วยแก้ปัญหาการเขียนโปรแกรม
Torbjørn

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

1
ยกเว้นรูปแบบนั้นมีอยู่จริงเพียงเพื่ออำนวยความสะดวกในการสื่อสาร ไม่มีวัตถุประสงค์อื่น และในการประชุมออกแบบทั้งหมดที่ฉันเข้าร่วมตลอดหลายปีที่ผ่านมาการอภิปรายเกี่ยวกับอัลกอริทึมคือสิ่งที่สำคัญไม่ใช่รูปแบบ รูปแบบไม่ค่อยอธิบายสิ่งที่เกิดขึ้นจริงในความหมายใด ๆ มันอธิบายได้อย่างแม่นยำว่า O (n) vs O (n Log (n)) มีผลกระทบหรือไม่ ไม่มันอธิบายได้อย่างง่ายดายว่ามันจะพอดีกับสถาปัตยกรรมที่มีอยู่หรือไม่ ไม่ได้การอภิปรายอัลกอริทึมแบบเต็มทำ ฉันไม่ได้โต้แย้งว่ารูปแบบควรจะเกษียณต่อ se แต่ถ้าพวกเขาเกือบจะไม่มีอะไรจะได้รับผลกระทบ

3

ในหนังสือเล่มใหม่ 2013 ชื่อ"Functional Programming Patterns- in Scala and Clojure"ผู้เขียน Michael.B Linn ทำงานได้ดีมากเมื่อเปรียบเทียบและให้บริการทดแทนในหลาย ๆ กรณีสำหรับรูปแบบ GoF และยังกล่าวถึงรูปแบบการทำงานที่ใหม่กว่าเช่น 'tail recursion', 'memoization', 'lazy sequence' เป็นต้น

หนังสือเล่มนี้มีอยู่ใน Amazon ฉันพบว่ามันให้ข้อมูลและให้กำลังใจอย่างมากเมื่อมาจากภูมิหลังของ OO สองสามทศวรรษ


3

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

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

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

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

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

เนื่องจากรูปแบบ GoF ไม่จำเป็นสำหรับการเขียนโปรแกรมที่ใช้งานจริงไม่ได้หมายความว่าไม่ควรใช้หลักการ SOLID หลักการของ SOLID นั้นเหนือกว่ากระบวนทัศน์ทางภาษาใด ๆ


2
FP สามารถมีสถานะได้ - ไม่มีสถานะโกลบอลแชร์หรือไม่แน่นอน
vt5491

2

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

หลักการของ HOF หมายความว่าฟังก์ชันสามารถส่งผ่านเป็นอาร์กิวเมนต์ไปยังฟังก์ชันอื่นได้ และฟังก์ชั่นสามารถคืนค่า


1

ตามคำตอบที่ยอมรับ OOP และ FP ทุกคนมีรูปแบบเฉพาะของพวกเขา

อย่างไรก็ตามมีบางรูปแบบซึ่งเป็นเรื่องธรรมดาที่ทุกแพลตฟอร์มการเขียนโปรแกรมที่ฉันคิดว่าควรจะมี นี่คือรายการ (ไม่สมบูรณ์):

  • อะแดปเตอร์ ฉันแทบจะไม่สามารถนึกถึงแพลตฟอร์มการเขียนโปรแกรมที่มีประโยชน์ซึ่งครอบคลุม (และเติมเต็มด้วยตนเอง) จนไม่จำเป็นต้องพูดคุยกับโลกใบนี้ ถ้ามันจะทำเช่นนั้นจำเป็นต้องมีอะแดปเตอร์

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

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

นอกจากนี้ฉันสังเกตเห็นในภาษา FP ทั่วไป Haskell มีบางสิ่งที่คล้ายกับรูปแบบ GoF แต่มีชื่อแตกต่างกัน ในความคิดของฉันนี้แนะนำให้พวกเขาอยู่ที่นั่นเพราะมีปัญหาที่พบบ่อยในการแก้ปัญหาทั้งในภาษา FP และ OOP

  • หม้อแปลง Monad และมัณฑนากร อดีตใช้เพื่อเพิ่มความสามารถเพิ่มเติมลงใน monad ที่มีอยู่หลังเพิ่มความสามารถเพิ่มเติมให้กับวัตถุที่มีอยู่

1

ฉันคิดว่าแต่ละกระบวนทัศน์มีจุดประสงค์ที่แตกต่างกันและไม่สามารถเปรียบเทียบได้ด้วยวิธีนี้

ฉันไม่เคยได้ยินมาก่อนว่ารูปแบบการออกแบบ GoF ใช้ได้กับทุกภาษา ผมเคยได้ยินว่าพวกเขาจะสามารถใช้ได้กับทุกภาษา OOP หากคุณใช้การเขียนโปรแกรมเชิงฟังก์ชันโดเมนของปัญหาที่คุณแก้ไขแตกต่างจากภาษา OO

ฉันจะไม่ใช้ภาษาทำงานเพื่อเขียนส่วนติดต่อผู้ใช้ แต่หนึ่งในภาษา OO เช่น C # หรือ Java จะทำให้งานนี้ง่ายขึ้น ถ้าฉันกำลังเขียนภาษาที่ใช้งานได้ฉันจะไม่พิจารณาใช้รูปแบบการออกแบบ OO


1

OOP และ FP มีเป้าหมายแตกต่างกัน OOP มีวัตถุประสงค์เพื่อห่อหุ้มความซับซ้อน / ชิ้นส่วนที่เคลื่อนไหวของส่วนประกอบซอฟต์แวร์และ FP มีวัตถุประสงค์เพื่อลดความซับซ้อนและการพึ่งพาของส่วนประกอบซอฟต์แวร์

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

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


1

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

ในประสบการณ์ของฉันการพัฒนาในหลายภาษากระบวนทัศน์ (Ruby), การใช้ FP ทำงานได้ดีในกรณีที่เรียบง่าย แต่ที่บริบทมีความซับซ้อนมากขึ้นวิธีการตาม GoF OOP เป็นแบบที่ดีกว่า

วิธีการของ FP ไม่ได้แทนที่วิธีการของ OOP แต่จะเป็นการเติมเต็มให้กับมัน


0

คุณลักษณะที่สำคัญที่สุดของการเขียนโปรแกรมฟังก์ชั่น IMHO คือคุณกำลังเขียนโปรแกรมโดยไม่มีอะไรนอกจากนิพจน์ - นิพจน์ภายในนิพจน์ภายในนิพจน์ที่ทั้งหมดประเมินถึงนิพจน์สุดท้ายสุดท้ายที่ "อุ่นเครื่องเมื่อประเมิน"

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

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


อืมฉันควรสังเกตว่าคำถามนั้นอายุสิบเอ็ดปีก่อนที่จะตอบ :-)
Jim Flood

0

รั้งตัวเอง

มันจะทำให้รุนแรงขึ้นอีกมากมายที่ได้ยินฉันอ้างว่าได้เปลี่ยนรูปแบบการออกแบบและ debunked SOLID และ DRY ฉันไม่มีใคร อย่างไรก็ตามฉันได้สร้างแบบจำลองสถาปัตยกรรมความร่วมมือ (การผลิต) อย่างถูกต้องและเผยแพร่กฎสำหรับการสร้างกระบวนการทางออนไลน์พร้อมกับรหัสและวิทยาศาสตร์ที่อยู่ด้านหลังที่เว็บไซต์ของฉันที่http://www.powersemantics.com/ http://www.powersemantics.com/

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

  • การผลิต = แต่ละขั้นตอนโต้ตอบกับผลิตภัณฑ์เดียว
  • OOP = แต่ละขั้นตอนมีปฏิสัมพันธ์กับตัวเองและโมดูลอื่น ๆ ผ่านผลิตภัณฑ์จากจุดหนึ่งไปยังอีกจุดหนึ่งเหมือนพนักงานสำนักงานที่ไร้ประโยชน์

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

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

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


0

มันทำเช่นนั้นใน PL ระดับสูงที่ใช้งานได้ (เช่น OCaml, กับคลาส, โมดูล, ฯลฯ ) แน่นอนว่าแทนที่ภาษา OOP ที่จำเป็นในความสามารถรอบด้านและความสามารถในการแสดงออก abstractions ไม่รั่วไหลคุณสามารถแสดงความคิดเห็นส่วนใหญ่ของคุณโดยตรงในโปรแกรม ดังนั้นใช่มันเปลี่ยนรูปแบบการออกแบบซึ่งส่วนใหญ่เป็นแบบง่ายขันเมื่อเทียบกับรูปแบบการทำงานใด ๆ

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