รูปแบบการออกแบบการเขียนโปรแกรมเชิงฟังก์ชันทั้งหมดอยู่ที่ไหน [ปิด]


75

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


6
มีรูปแบบการออกแบบที่ใช้งานได้อย่างแน่นอน - ยกตัวอย่างเช่น memoisation หรือ monads - ฉันยังสงสัยว่ามีใครรวมพวกเขาไว้ในที่แห่งเดียว ...
FinnNk

2
FinnNk Monad เป็นคลาสประเภทมากกว่ารูปแบบการออกแบบ ^ _ ^
ทางเลือก

สำหรับ haskell, Gabriel Gonzalez มีโพสต์บล็อกบางตัวอย่างเช่นhaskellforall.com/2012/08/the-category-design-pattern.html
bennofs


1
แผนที่ย่อเป็นหนึ่ง ฉันผิดหวังที่ไม่มีรายการรูปแบบที่ดี
Sridhar Sarnobat

คำตอบ:


47

OO และฟังก์ชั่นการเขียนโปรแกรมเป็นสองกระบวนทัศน์การเขียนโปรแกรมที่แตกต่างกันมากและรูปแบบการออกแบบ (DP) เป็นส่วนสำคัญของการออกแบบ OO และการเขียนโปรแกรม DP ไม่มีบทบาทในการเขียนโปรแกรมเชิงฟังก์ชัน

อาจกล่าวได้ว่า DP ไม่จำเป็นต้องใช้ในการเขียนโปรแกรมการทำงาน - ไม่มีอาการคันที่ DP จะรักษาไว้

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

  • Peter Norvig พบว่า 16 จาก 23 รูปแบบในหนังสือลวดลายการออกแบบคือ " มองไม่เห็นหรือเรียบง่าย r" ใน Lisp หรือ Dylan

  • "หลายรูปแบบบ่งบอกถึงการวางแนววัตถุหรือสถานะที่ไม่แน่นอนโดยทั่วไปและอาจไม่สามารถใช้งานได้ในภาษาโปรแกรมที่ใช้งานได้ซึ่งข้อมูลไม่สามารถเปลี่ยนแปลงได้หรือได้รับการปฏิบัติเช่นนี้" - http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29


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

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

3
รูปแบบการออกแบบนำไปใช้กับกิจกรรมการออกแบบทั้งหมดไม่ว่าจะเป็นการเขียนโปรแกรมหรือออกแบบบ้าน ในความเป็นจริงมากแนวคิดของภาษารูปแบบมาจากสถาปัตยกรรม: en.wikipedia.org/wiki/A_Pattern_Language
BobDalgleish

2
อืมมม ลำธารที่สังเกตได้การตรวจสอบความถูกต้องของรถไฟและนรกแทบทุก monad เป็นรูปแบบการออกแบบใช่ไหม
เจตน์

2
@ voidvector Monads ไม่ใช่แค่รูปแบบการออกแบบ ใน FP มีการใช้ monads เป็น functors ระหว่างระบบพิมพ์และแนวคิดนั้นมาจากหมวดหมู่ทฤษฎีซึ่งเป็นสาขาหนึ่งของคณิตศาสตร์ พวกมันถูกใช้เพื่ออธิบายความสัมพันธ์ชนิดหนึ่งระหว่างโครงสร้างพีชคณิตโดยทั่วไป มันจะแม่นยำมากขึ้นถ้าจะพูดว่า functional programming เป็น design dattern เพื่ออำนวยความสะดวกในการใช้คณิตศาสตร์ในการเขียนโปรแกรม
John Cramerus

67

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

ดูสิ่งพิมพ์ของเขาเช่นกัน เขาครอบคลุมรูปแบบของ Gang of Four ในรูปแบบการออกแบบเป็นโปรแกรม Datatype-Generic ระดับสูงและอธิบายรูปแบบของการเขียนโปรแกรมด้วยสมการแบบเรียกซ้ำในOrigami Programming (การพับและการกางออก)


13

ความจริงง่ายๆคือรูปแบบ OO จำนวนมากจะถูกพิจารณาว่าเป็นสำนวนในภาษาที่ใช้งานได้ (โดยเฉพาะรูปแบบ GoF ดั้งเดิม) ตัวอย่างเช่นรูปแบบ Iterator (ภาษาในตัวเช่น C # ตอนนี้) ไม่จำเป็นต้องใช้ใน Lisp หรือ ML ที่มีตัวดำเนินการตามลำดับ

มีรูปแบบมากมายที่เราใช้ในระบบ OO เพื่อช่วยให้เรา "ไม่จำเป็น" ออกไปเพื่อให้เราสามารถมุ่งเน้นไปที่การเข้ารหัสวัตถุ กล่าวอีกนัยหนึ่งรูปแบบเป็นวิธีแก้ปัญหาสำหรับส่วนที่ไม่น่าสนใจของแอปพลิเคชัน เราควรใช้รูปแบบเพื่อตอบสนองความต้องการทั่วไปที่ได้รับการแก้ไขมาก่อน (เช่นรูปแบบในรูปแบบ Fowlers ของ Enterprise Application Architecture สำหรับจัดการกับสิ่งต่าง ๆ เช่นการส่งฐานข้อมูลหรือรูปแบบ xUnit เพื่อเพิ่มการทดสอบหน่วยของคุณ) เพื่อให้เราสามารถมุ่งเน้นการเพิ่มมูลค่าทางธุรกิจ สำหรับแอปพลิเคชัน

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


9

พูดคุยที่ดี (ประมาณ 45 นาที) ในหัวข้อนี้โดย Stuart Sierra:

http://www.infoq.com/presentations/Clojure-Design-Patterns

ไม่จำเป็นต้องผูกมัดและมีอำนาจ แต่ฉันจำตัวอย่างของเขาจากประสบการณ์ของฉันเองโดยใช้ FP สำหรับการวิเคราะห์ข้อมูล

ตัวอย่างที่เขียนใน Clojure แต่น่าจะใช้ได้กับภาษา FP ใด ๆ ชื่อที่เขาให้กับรูปแบบที่เขาครอบคลุมคือ:

  • รัฐ / กิจกรรม
  • ผลที่ตามมา
  • ผู้สะสม
  • ลด / นวด
  • การขยายซ้ำ
  • ท่อส่ง
  • เสื้อคลุม
  • เหรียญ
  • ผู้สังเกตการณ์
  • กลยุทธ์

6

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

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

เมื่อคุณมองหา Haskell คุณจะมีคลังแสง FP เพียงพอสำหรับการกำจัดอันตราย จุดคือเก็บไว้จนกว่าคุณจะได้รับมัน ไม่มีทางลัด


-3

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


1
หนังสือของ Okasaki นั้นเทียบเท่ากับโครงสร้างข้อมูลส่วนหนึ่งของโครงสร้างข้อมูลจำนวนมากและหนังสืออัลกอริธึมซึ่งโดยปกติจะพิจารณาเฉพาะโครงสร้างข้อมูลที่ไม่แน่นอน
AProgrammer

1
ฉันไม่คิดว่าการเทียบโครงสร้างข้อมูลเพื่อออกแบบรูปแบบที่เหมาะกับใบเรียกเก็บเงิน มันไม่เหมือนโปรแกรมเมอร์ OO เพียงแค่เหวี่ยงแขนจนกว่าคำจำกัดความของคลาสที่เหมาะสมจะปรากฏ
davidk01

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