มีวิธีการทางวิศวกรรมซอฟต์แวร์สำหรับการตั้งโปรแกรมการทำงานหรือไม่? [ปิด]


203

วิศวกรรมซอฟต์แวร์ตามที่ได้รับการสอนในปัจจุบันมุ่งเน้นไปที่การเขียนโปรแกรมเชิงวัตถุและมุมมองเชิงวัตถุ 'ธรรมชาติ' ของโลก มีวิธีการอย่างละเอียดที่อธิบายวิธีการแปลงโมเดลโดเมนเป็นโมเดลคลาสที่มีหลายขั้นตอนและสิ่งประดิษฐ์จำนวนมาก (UML) เช่น use-case-diagrams หรือ class-diagrams โปรแกรมเมอร์จำนวนมากใช้วิธีนี้ภายในและมีความคิดที่ดีเกี่ยวกับวิธีการออกแบบแอปพลิเคชันเชิงวัตถุตั้งแต่เริ่มต้น

hype ใหม่คือการเขียนโปรแกรมใช้งานได้ซึ่งสอนในหนังสือและแบบฝึกหัดมากมาย แต่สิ่งที่เกี่ยวกับวิศวกรรมซอฟต์แวร์การทำงาน? ในขณะที่อ่านเกี่ยวกับ Lisp และ Clojure ฉันมาถึงสองข้อความที่น่าสนใจ:

  1. โปรแกรมการทำงานนั้นมักจะถูกพัฒนาจากล่างขึ้นบนแทนที่จะเป็นบนลงล่าง ('บน Lisp', Paul Graham)

  2. ฟังก์ชั่นโปรแกรมเมอร์ใช้แผนที่ที่ OO-โปรแกรมเมอร์ใช้วัตถุ / คลาส ('Clojure สำหรับ Java โปรแกรมเมอร์', พูดคุยโดย Rich Hickley)

ดังนั้นวิธีการสำหรับการออกแบบอย่างเป็นระบบ (ตามรูปแบบ?) ของการใช้งานคือใน Lisp หรือ Clojure? ขั้นตอนทั่วไปคืออะไรฉันใช้สิ่งประดิษฐ์อะไรฉันจะแม็พสิ่งเหล่านั้นจากพื้นที่ปัญหาไปยังพื้นที่โซลูชันอย่างไร


3
ฉันมีความคิดเห็นที่นี่: มีหลายโปรแกรมที่เขียนขึ้นมาจากบนลงล่างเป็นงานแสดงขั้นตอนการพัฒนาซอฟต์แวร์ในภาษาที่ใช้งานได้ในหนังสือ "ฟังก์ชั่นการเขียนโปรแกรมในการทำความสะอาดพร้อมกัน" (ภาษาเอง แม้ว่า)
Artyom Shalkhakov

4
1. Parnas ให้เหตุผลว่าโปรแกรมส่วนใหญ่ควรจะจากล่างขึ้นบนและทำให้หน้าตาเหมือนจากบนลงล่างดังนั้นวิธีการเหล่านั้นควรจะผสมกันไม่มีคำตอบที่ถูกต้อง
Gabriel Ščerbák

2
2. ออบเจกต์มีพฤติกรรมที่ขึ้นอยู่กับสถานะโครงสร้างแบบห่อหุ้มใน FP คุณมีสถานะทั้งหมดและโครงสร้างชัดเจนและพฤติกรรม (ฟังก์ชั่น) จะถูกแยกออกจากโครงสร้าง ดังนั้นสำหรับการสร้างแบบจำลองข้อมูลคุณใช้แผนที่สำหรับวัตถุ แต่เมื่อออกแบบแอปพลิเคชันวัตถุไม่สามารถแทนที่ด้วยฟังก์ชั่น - FP เป็นนิพจน์ขนาดใหญ่ที่สร้างและประเมินผลผ่านทางท่อ OOP เป็นเรื่องเกี่ยวกับการสร้างแบบจำลองและการส่งข้อความระหว่างวัตถุ
Gabriel Ščerbák

1
ฉันถามคำถามที่เกี่ยวข้องในบางครั้ง: " แบบจำลองข้อมูลจากฐานข้อมูลเชิงสัมพันธ์ใน Clojure เป็นอย่างไร" stackoverflow.com/questions/3067261/…
Sandeep

4
Hehe ในการบรรยาย SICP Hal Abelson กล่าวว่าครึ่งหนึ่งเป็นเรื่องตลกมีบางอย่างตามแนวของ "มีวิธีการที่มีชื่อเสียงหรือฉันควรจะบอกว่าเทพนิยายที่เรียกว่าวิศวกรรมซอฟต์แวร์ [... ] การทำไดอะแกรมและข้อกำหนดที่ซับซ้อน ระบบกับพวกเขาคนเหล่านั้นไม่ได้ตั้งโปรแกรมมากนัก " ฉันมาจาก "Java School" ซึ่งสำหรับทุกวัยที่เราสอน UML และสิ่งประดิษฐ์และสิ่งของและในขณะที่มันเล็กน้อยดีการวางแผนมากเกินไปและวางแผน (วางแผนไว้) เป็นอันตรายมากกว่าประโยชน์: คุณไม่เคยรู้ว่าคุณ ซอฟต์แวร์จะเป็นจนกว่าคุณจะได้รับรหัสจริง
lfborjas

คำตอบ:


165

ขอบคุณพระเจ้าที่ผู้คนในวิศวกรรมซอฟต์แวร์ยังไม่ได้ค้นพบการเขียนโปรแกรมการทำงาน นี่คือแนวบางอย่าง:

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

    ฟังก์ชันลำดับสูงเหล่านี้มักจะมาพร้อมกับกฎหมายของการเขียนโปรแกรมบางอย่างหรือที่เรียกว่า "ทฤษฎีบทเสรี"

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

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

    ไม่ใช่ภาษาที่ใช้งานได้ทั้งหมดใช้ประเภทที่ชัดเจน แต่หนังสือHow To Design Programsหนังสือที่ยอดเยี่ยมสำหรับการเรียนรู้ Scheme / Lisp / Clojure นั้นอาศัย "การบรรยายข้อมูล" ซึ่งเกี่ยวข้องกับประเภทอย่างใกล้ชิด

ดังนั้นวิธีการสำหรับการออกแบบอย่างเป็นระบบ (ตามรูปแบบ?) ของการใช้งานคือใน Lisp หรือ Clojure?

วิธีการออกแบบใด ๆ ที่อยู่บนพื้นฐานของข้อมูลนามธรรมทำงานได้ดี ฉันคิดว่าสิ่งนี้จะง่ายขึ้นเมื่อภาษามีประเภทที่ชัดเจน แต่ก็ใช้ได้แม้จะไม่มี หนังสือที่ดีเกี่ยวกับวิธีการออกแบบสำหรับประเภทข้อมูลนามธรรมซึ่งปรับให้เข้ากับการเขียนโปรแกรมการทำงานได้อย่างง่ายดายคือAbstraction และ Specification ในการพัฒนาโปรแกรมโดย Barbara Liskov และ John Guttag ฉบับพิมพ์ครั้งแรก Liskov ได้รับรางวัลทัวริงในส่วนของงานนั้น

วิธีการออกแบบอื่นที่ไม่ซ้ำกับ Lisp คือการตัดสินใจว่าส่วนขยายของภาษาใดจะมีประโยชน์ในโดเมนปัญหาที่คุณใช้งานอยู่จากนั้นใช้มาโครที่ถูกสุขลักษณะเพื่อเพิ่มโครงสร้างเหล่านี้ในภาษาของคุณ เป็นสถานที่ที่ดีในการอ่านเกี่ยวกับชนิดของการออกแบบนี้เป็นบทความแมทธิว Flatt ของการสร้างภาษาในแร็กเก็ต บทความอาจอยู่เบื้องหลัง paywall คุณสามารถค้นหาเนื้อหาทั่วไปเพิ่มเติมเกี่ยวกับการออกแบบประเภทนี้ได้โดยค้นหาคำว่า "ภาษาฝังตัวเฉพาะโดเมน" โดยเฉพาะอย่างยิ่งสำหรับคำแนะนำและตัวอย่างเกินกว่าสิ่งที่แมทธิว Flatt ครอบคลุมผมก็อาจจะเริ่มต้นด้วยเกรแฮมในเสียงกระเพื่อมหรือบางทีอาจจะANSI Common เสียงกระเพื่อม

อะไรคือขั้นตอนทั่วไปฉันใช้สิ่งประดิษฐ์อะไร

ขั้นตอนทั่วไป:

  1. ระบุข้อมูลในโปรแกรมและการดำเนินการของคุณและกำหนดประเภทข้อมูลนามธรรมที่เป็นตัวแทนของข้อมูลนี้

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

  3. หากคุณใช้ภาษาที่ใช้งานได้ให้ใช้ตัวตรวจสอบประเภทก่อนและบ่อยครั้ง หากคุณใช้ Lisp หรือ Clojure แนวทางปฏิบัติที่ดีที่สุดคือการเขียนสัญญาฟังก์ชั่นก่อนรวมถึงการทดสอบหน่วย - เป็นการพัฒนาโดยใช้การทดสอบเป็นส่วนใหญ่ และคุณจะต้องการที่จะใช้สิ่งที่รุ่นของ QuickCheck ได้รับการแจ้งความกับแพลตฟอร์มของคุณซึ่งในกรณีลักษณะของคุณเหมือนว่ามันจะเรียกว่าClojureCheck มันเป็นห้องสมุดที่ทรงพลังอย่างยิ่งสำหรับการสร้างการทดสอบแบบสุ่มของรหัสที่ใช้ฟังก์ชั่นการสั่งซื้อที่สูงขึ้น


2
ผู้เข้าชม IMO ไม่ได้เป็นโฟลว์ - โฟลด์เป็นชุดย่อยของผู้เข้าชม การจัดส่งหลายรายการไม่ได้ถูกจับโดยการพับ (โดยตรง)
Michael Ekstrand

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

6
ฉันยอมรับว่าฉันเห็นไดอะแกรมที่ใช้บ่อยครั้งมากในการอธิบายการออกแบบฟังก์ชั่นและฉันคิดว่านั่นเป็นความอัปยศ เป็นเรื่องยากที่จะแสดงแผนภาพลำดับต่อเนื่องเมื่อใช้ HOF จำนวนมาก แต่ฉันหวังว่าพื้นที่ของวิธีการอธิบายการออกแบบฟังก์ชั่นด้วยภาพได้รับการสำรวจที่ดีขึ้น เท่าที่ฉันเกลียด UML (ตามมาตรฐาน) ฉันพบว่า UML (เป็นร่าง) มีประโยชน์มากใน Java และหวังว่าจะมีแนวปฏิบัติที่ดีที่สุดเกี่ยวกับวิธีการทำสิ่งที่เทียบเท่า ฉันกำลังทดลองทำสิ่งนี้กับโปรโตคอลและบันทึก Clojure แต่ไม่มีอะไรที่ฉันชอบ
Alex Miller

22
+1 สำหรับ "ขอบคุณพระเจ้าที่ผู้คนในวิศวกรรมซอฟต์แวร์ยังไม่ได้ค้นพบการเขียนโปรแกรมที่ใช้งานได้" ;)
Aky

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

46

สำหรับ Clojure ฉันขอแนะนำให้กลับไปใช้โมเดลเชิงสัมพันธ์แบบเก่าที่ดี Out of the Tarpitเป็นการอ่านที่สร้างแรงบันดาลใจ


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

1
นี้. นี้. นี้! ฉันกำลังอ่านบทความนี้และมันน่าสนใจจริง ๆ ว่ามันครอบคลุมฐานทั้งหมดของสิ่งที่ใช้ในการสร้างระบบจริงในขณะที่รักษาสถานะไม่แน่นอนน้อยที่สุดในแฟชั่นที่ควบคุมอย่างมาก ฉันกำลังเล่นกับการสร้าง Pong และ Tetris ในสไตล์ FRelP (แก้ตัวการเริ่มต้นที่แปลกประหลาด แต่ก็มี FRP ยอดนิยมอีกอย่างหนึ่ง: การเขียนโปรแกรมปฏิกิริยาโต้ตอบ)
John Cromartie

หลังจากที่ได้อ่านกระดาษที่ผมคิดว่า Clojure ที่จะเป็นภาษาที่สมบูรณ์แบบสำหรับ FR (El) P, อย่างน้อยสำหรับตรรกะที่จำเป็นที่รัฐอุบัติเหตุและการควบคุมและอื่น ๆส่วนประกอบ ฉันสงสัยว่าจะให้คำจำกัดความเชิงสัมพันธ์ของรัฐสำคัญใน clojure โดยไม่ต้อง reinventing sql (ไม่มีข้อบกพร่อง) หรือเป็นความคิดที่จะใช้ DB relational (sql) ที่ดีและสร้างโปรแกรมที่ใช้งานได้โดยไม่ต้องมีแนวคิดที่ไม่ตรงกับแนวคิดของ OOP
Thorsten

1
@Thorsten ความคิดพื้นฐานคือ set = table, map = index ส่วนที่ยากคือการรักษาดัชนีและตารางที่ซิงค์ แต่ปัญหานี้สามารถแก้ไขได้ด้วยประเภทชุดที่ดีขึ้น ชุดแบบง่าย ๆ ที่ฉันใช้งานคือชุดคีย์ซึ่งเป็นชุดที่ใช้ฟังก์ชันคีย์เพื่อทดสอบความเป็นหนึ่งเดียว ซึ่งหมายความว่ากำหนดค่าการแทรกหรืออัปเดตการเรียกใช้ get ด้วยฟิลด์คีย์หลักส่งคืนทั้งแถว
cgrand


38

โดยส่วนตัวแล้วฉันพบว่าการปฏิบัติที่ดีตามปกติจากการพัฒนา OO นำไปใช้ในการเขียนโปรแกรมฟังก์ชั่นเช่นกัน - เพียงแค่ปรับแต่งเล็กน้อยเพื่อรับฟังมุมมองการทำงาน จากมุมมองของวิธีการคุณไม่จำเป็นต้องทำอะไรที่แตกต่างกันโดยสิ้นเชิง

ประสบการณ์ของฉันมาจากการย้ายจาก Java ไป Clojure ในปีที่ผ่านมา

ตัวอย่างบางส่วน:

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

  • การวางแนวทางการบริการในการออกแบบ - ใช้งานได้ดีมากในมุมมองของ FP เนื่องจากบริการทั่วไปเป็นเพียงฟังก์ชั่นที่มีผลข้างเคียง ฉันคิดว่ามุมมอง "จากล่างขึ้นบน" ของการพัฒนาซอฟต์แวร์บางครั้งดำเนินการในโลก Lisp เป็นจริงเพียงหลักการออกแบบ API ที่มุ่งเน้นบริการที่ดีในอีกรูปแบบหนึ่ง

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

  • การป้องกัน / การทำซ้ำ - ทำงานได้ดีกับ FP คุณอาจสามารถใช้ต้นแบบกับผู้ใช้งานได้หากคุณเก่งเรื่องเครื่องมือสร้าง / DSL และใช้พวกมันที่ REPL


3
การปฏิบัติเหล่านี้ฟังดูค่อนข้างคุ้นเคยสำหรับฉัน ฉันยังคิดว่าใครบางคนควรเขียนฟังก์ชันการทำงานที่เทียบเท่ากับ "วิศวกรรมซอฟต์แวร์เชิงวัตถุโดยใช้ UML รูปแบบและ Java" โดย Bruegge / Dutoit แทนที่จะเป็นหนังสือเล่มที่หก "Programing in Clojure" มันอาจเรียกว่า "ฟังก์ชั่นวิศวกรรมซอฟต์แวร์โดยใช้ Clojure และ" อะไร " พวกเขาใช้ UML และรูปแบบใน FP หรือไม่ ฉันจำได้ว่าพอลเกรแฮมเขียนว่ารูปแบบเป็นสัญญาณสำหรับการขาดความเป็นนามธรรมใน Lisp ซึ่งควรได้รับการแก้ไขด้วยการแนะนำมาโครใหม่
Thorsten

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

2
มีการออกแบบหลักการที่น่าสนใจในหนังสือ PAIP norvig.com/paip.html
mathk

1
นอกจากนี้ยังมีรูปแบบการเขียนโปรแกรมที่ใช้งานได้ (โครงร่างการเรียกซ้ำ ฯลฯ )
Gabriel Ščerbák

13

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

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

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

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

ตอนนี้คุณมีโดเมนที่คุณมีฟังก์ชั่นที่เขียนตามกฎหมายที่ประพฤติตัวดี DSL ในตัวที่เรียบง่าย!

โอ้และคุณสมบัติที่กำหนดคุณสามารถเขียนแบบทดสอบอัตโนมัติแบบสุ่ม (ala QuickCheck) .. และนั่นเป็นเพียงจุดเริ่มต้น


1
วิธีการสร้างค่าที่เป็นไปไม่ได้นั้นไม่สามารถนำมาใช้ได้กับภาษาที่มีการพิมพ์แบบไดนามิกเช่น Clojure และ Scheme มากกว่าภาษาที่มีการพิมพ์แบบคงที่เช่น Haskell และ ML
Zak

@Zak - คุณไม่สามารถตรวจสอบแบบคงที่ว่าไม่สามารถแสดงตัวตนได้ แต่คุณสามารถสร้างโครงสร้างข้อมูลของคุณในลักษณะเดียวกันได้
sclv

7

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

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


5

วิธีหนึ่งคือการสร้าง DSL ภายในภายในภาษาการทำงานของโปรแกรมที่เลือกไว้ "รุ่น" นั้นเป็นชุดของกฎเกณฑ์ทางธุรกิจที่แสดงใน DSL


1
ฉันเข้าใจวิธีการสร้างภาษาไปยังโดเมนปัญหาก่อนจนกว่าจะถึงระดับที่เป็นนามธรรมที่ไม่มีรูปแบบซ้ำ ๆ เกิดขึ้นอีกในรหัสแทนที่จะแก้ปัญหาด้วย abstractions นั้น
Thorsten

1
แต่ดูเหมือนว่า "รุ่นเป็นชุดของกฎธุรกิจที่แสดงใน DSL" อย่างไร ในแอ็พพลิเคชัน Java EE โมเดลถูกเขียนเป็น POJO-Entities ที่ถูกเรียกจาก controller-EJBs ซึ่งจะอัพเดต view-JSPs - ตัวอย่างเช่น มีรูปแบบสถาปัตยกรรมที่คล้ายคลึงกัน (เช่นรูปแบบ MVC) ใน FP หรือไม่ มันมีลักษณะอย่างไร
Thorsten

2
ไม่มีเหตุผลที่คุณไม่สามารถมีรูปแบบ MVC ใน FP ได้อย่างนั้น FP ยังช่วยให้คุณสร้างโครงสร้างข้อมูลที่หลากหลายและเนื้อหาที่มี ADTs และการจับคู่แบบช่วยให้คุณสร้างมากยิ่งขึ้นคน หากมีสิ่งใดเนื่องจาก FP แยกข้อมูลและพฤติกรรมระบบประเภท MVC จะเกิดขึ้นตามธรรมชาติมากขึ้น
sclv

5

ดูคำตอบของฉันในโพสต์อื่น:

Clojure aproach แยกความกังวลได้อย่างไร

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


3
ฉันชอบไปป์ไลน์ 90% และวิธีมาโคร 10% ดูเหมือนว่าเป็นเรื่องธรรมดาที่จะคิดว่าโปรแกรมการทำงานเป็นเสมือนการแปลงข้อมูลที่ไม่เปลี่ยนรูป ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณหมายถึงโดย "ใส่สติปัญญาทั้งหมดลงในข้อมูลไม่ใช่รหัส" เนื่องจากวิธีการที่จะให้ 100 ฟังก์ชันทำงานบนโครงสร้างข้อมูล 1 (มากกว่า 10 ฟังก์ชั่นใน 10 datastructures) ดูเหมือนว่า ตรงข้าม. โครงสร้างข้อมูลใน OOP ไม่ฉลาดกว่าใน FP เพราะพวกมันมีพฤติกรรมของตัวเอง
Thorsten

3

ในขณะนี้อาจถือว่าไร้เดียงสาและง่าย แต่ฉันคิดว่า "สูตรการออกแบบ" (แนวทางการแก้ปัญหาที่ประยุกต์ใช้กับการเขียนโปรแกรมที่สนับสนุนโดย Felleisen et al. ในหนังสือHtDPของพวกเขา) จะใกล้เคียงกับสิ่งที่คุณมองหา

นี่ลิงค์ไม่กี่:

http://www.northeastern.edu/magazine/0301/programming.html

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.86.8371


ลิงก์ไปยังหน้าตะวันออกเฉียงเหนือดูเหมือนว่าจะตาย
James Kingsbery

1
เจมส์คุณพูดถูกและฉันจำไม่ได้ว่ามีอะไรอยู่ในนั้นเพื่อแก้ไขโชคไม่ดี ฉันรู้แค่ว่าผู้เขียน HtDP ดำเนินการต่อเพื่อสร้างภาษา Pyret (และอาจแก้ไข HtDP รุ่นที่ 2 เพื่อใช้แทน Racket ซึ่งเป็นชื่อ PLT Scheme)
Artyom Shalkhakov

3

ฉันเพิ่งพบหนังสือเล่มนี้: การสร้างแบบจำลองโดเมนที่ใช้งานได้และปฏิกิริยา

ฉันคิดว่าสอดคล้องกับคำถามของคุณอย่างสมบูรณ์

จากคำอธิบายหนังสือ:

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


2

มีรูปแบบ "การคำนวณโปรแกรม" / "ออกแบบโดยการคำนวณ" ที่เกี่ยวข้องกับศาสตราจารย์ Richard Bird และกลุ่มพีชคณิตของ Programming ที่ Oxford University (UK) ฉันไม่คิดว่ามันไกลเกินกว่าที่จะพิจารณาวิธีการนี้

โดยส่วนตัวในขณะที่ฉันชอบงานที่ผลิตโดยกลุ่ม AoP ฉันไม่มีวินัยในการฝึกการออกแบบด้วยวิธีนี้เอง อย่างไรก็ตามนั่นเป็นข้อบกพร่องของฉันไม่ใช่การคำนวณหนึ่งในโปรแกรม


2

ฉันได้พบว่าการพัฒนาพฤติกรรมขับเคลื่อนเป็นแบบธรรมชาติสำหรับการพัฒนารหัสอย่างรวดเร็วทั้ง Clojure และ SBCL ข้อได้เปรียบที่แท้จริงของการใช้ประโยชน์จาก BDD ด้วยภาษาที่ใช้งานได้คือฉันมักจะเขียนการทดสอบหน่วยเกรนละเอียดมากกว่าที่ฉันมักจะใช้เมื่อใช้ภาษาเชิงปฏิบัติเพราะฉันทำงานได้ดีขึ้นมากในการย่อยสลายปัญหา


เครื่องมืออะไรที่คุณใช้เพื่อทำ BDD ใน clojure
murtaza52

ฉันชอบ Midje มันทันสมัยและแสดงออกมาก ลองดู: github.com/marick/Midje
Marc

1

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

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


-7

ดี,

โดยทั่วไปภาษาการเขียนโปรแกรมฟังก์ชั่นจำนวนมากถูกนำมาใช้ในมหาวิทยาลัยเป็นเวลานานสำหรับ "ปัญหาของเล่นขนาดเล็ก"

พวกเขากำลังได้รับความนิยมมากขึ้นในขณะนี้เนื่องจาก OOP ประสบปัญหากับ "การเขียนโปรแกรม paralel" เนื่องจาก "state" และรูปแบบการใช้งานบางครั้งดีกว่าสำหรับปัญหาในมือเช่น Google MapReduce

ฉันแน่ใจว่าเมื่อผู้ชาย functioanl ชนกำแพง [ลองใช้ระบบที่มีขนาดใหญ่กว่า 1,000,000 บรรทัดของโค้ด] บางคนจะมาพร้อมกับวิธีการทางวิศวกรรมซอฟต์แวร์ใหม่พร้อมคำฉวัดเฉวียน :-) พวกเขาควรตอบคำถามเก่า: จะแบ่งระบบออกเป็นชิ้น ๆ อย่างไรเพื่อที่เราจะ "กัด" แต่ละชิ้นทีละครั้ง? [ทำงานซ้ำ, วิธีการวิวัฒนาการระหว่างกรรม] โดยใช้สไตล์การใช้งาน

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

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

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


ตอนนี้มีระบบขนาดใหญ่ที่สร้างด้วยภาษาที่ใช้งานได้แล้ว แม้ว่าจะไม่ได้มีสิ่งนี้ไม่ได้โต้แย้งเลย
Svante

ทีนี้ตั้งชื่อบางคน? ฉันเพิ่งรู้จักระบบ "Erlang" น้อยมาก [ขนาดกลาง] แต่ Haskel? Clojure? เสียงกระเพื่อม?
Hippias Minor

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

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

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