เนื่องจากภาษาเครื่อง (เช่น0110101000110101
) ภาษาคอมพิวเตอร์มีวิวัฒนาการโดยทั่วไปในรูปแบบที่เป็นนามธรรมสูงกว่าโดยทั่วไปทำให้ง่ายต่อการเข้าใจรหัสเมื่อมันถูกนำไปใช้กับปัญหา แอสเซมเบลอร์เป็นนามธรรมผ่านรหัสเครื่อง C เป็นนามธรรมเหนือแอสเซมเบลอร์ ฯลฯ
การออกแบบเชิงวัตถุดูเหมือนว่าจะดีมากที่ช่วยให้เราสามารถจำลองปัญหาในแง่ของวัตถุเช่นปัญหาของระบบการลงทะเบียนหลักสูตรมหาวิทยาลัยสามารถทำแบบจำลองกับCourse
ชั้นStudent
เรียนคลาส ฯลฯ จากนั้นเมื่อเราเขียนวิธีการแก้ปัญหา ในภาษา OO เรามีคลาสที่คล้ายกันซึ่งได้รับความรับผิดชอบและโดยทั่วไปมีประโยชน์สำหรับการออกแบบโดยเฉพาะอย่างยิ่งสำหรับการทำให้โค้ดเป็นโมดูล ถ้าฉันให้ปัญหานี้แก่ทีมอิสระ 10 คนที่แก้ปัญหาด้วยวิธี OO โดยทั่วไป 10 วิธีแก้ปัญหาจะมีชั้นเรียนที่เกี่ยวข้องกับปัญหาที่เหมือนกัน อาจมีความแตกต่างมากมายเมื่อคุณเริ่มมีเพศสัมพันธ์และการโต้ตอบของคลาสเหล่านั้นดังนั้นจึงไม่มีสิ่งเช่น "ศูนย์ช่องว่างการเป็นตัวแทน"
ประสบการณ์การใช้งานฟังก์ชั่นการเขียนโปรแกรมของฉันมี จำกัด มาก (ไม่มีการใช้งานจริงในโลกมีเพียงโปรแกรมประเภท Hello World) ฉันล้มเหลวในการดูว่าภาษาดังกล่าวอนุญาตให้ทำแผนที่โซลูชั่น FP ได้อย่างง่ายดายเพื่อแก้ไขปัญหา (ด้วยช่องว่างที่เป็นตัวแทนต่ำ) ในแบบที่ภาษา OO ทำอย่างไร
ฉันเข้าใจถึงข้อดีของ FP ที่เกี่ยวกับการเขียนโปรแกรมพร้อมกัน แต่ฉันขาดอะไรไปหรือ FP ไม่ได้ลดช่องว่างในการเป็นตัวแทน (ทำให้การแก้ปัญหาเข้าใจง่ายขึ้น)?
อีกวิธีที่จะถามสิ่งนี้: รหัส FP ของ 10 ทีมที่แตกต่างกันในการแก้ปัญหาในโลกแห่งความจริงเดียวกันนั้นมีอะไรเหมือนกันมากมายไหม?
จากวิกิพีเดียเกี่ยวกับสิ่งที่เป็นนามธรรม (วิทยาการคอมพิวเตอร์) (เหมืองที่เน้น)
ภาษาเขียนโปรแกรมการทำงานโดยทั่วไปแสดงแนวคิดที่เกี่ยวข้องกับฟังก์ชั่นเช่นนามธรรมแลมบ์ดา (ทำให้ระยะในการทำงานของตัวแปรบางก), ฟังก์ชั่นขั้นสูง (พารามิเตอร์ฟังก์ชั่น) วงเล็บนามธรรม (ทำให้ระยะเวลาในการทำงานของตัวแปร a)
ช่องว่างในการดำเนินการอาจเพิ่มขึ้นได้เนื่องจากปัญหาบางอย่างในโลกแห่งความเป็นจริงนั้นไม่ได้ถูกสร้างแบบจำลองอย่างง่ายดายด้วยนามธรรมดังกล่าว
อีกวิธีหนึ่งที่ฉันเห็นการลดช่องว่างในการดำเนินการคือการติดตามองค์ประกอบโซลูชันกลับไปที่ปัญหา 0
'และ1
ในรหัสเครื่องเป็นเรื่องยากมากที่จะตรวจสอบย้อนกลับในขณะที่Student
ระดับง่ายต่อการตรวจสอบย้อนกลับ ไม่ใช่คลาส OO ทั้งหมดที่ติดตามไปยังพื้นที่ปัญหาได้อย่างง่ายดาย แต่มีอยู่จำนวนมากที่ต้องทำ
FP abstractions ไม่จำเป็นต้องอธิบายเพื่อหาว่าพื้นที่ส่วนใดของปัญหาที่พวกเขากำลังแก้ไขอยู่ (นอกเหนือจากปัญหาทางคณิตศาสตร์ )ตกลง - ฉันทำได้ดีในส่วนนี้ หลังจากดูตัวอย่างอื่น ๆ อีกมากมายฉันเห็นว่า abstractions ของ FP มีความชัดเจนมากสำหรับส่วนต่าง ๆ ของปัญหาที่แสดงในการประมวลผลข้อมูล
คำตอบที่ได้รับการยอมรับสำหรับคำถามที่เกี่ยวข้องสามารถใช้ UML สร้างแบบจำลองโปรแกรมการทำงานได้หรือไม่? - กล่าวว่า "โปรแกรมเมอร์ที่ทำงานไม่ได้ใช้งานไดอะแกรมมากนัก" ฉันไม่สนใจว่ามันจะเป็น UML หรือเปล่า แต่มันทำให้ฉันสงสัยว่า FP abstractions ง่ายต่อการเข้าใจ / สื่อสารถ้าไม่มีไดอะแกรมที่ใช้กันอย่างแพร่หลาย (สมมติว่าคำตอบนี้ถูกต้อง) อีกครั้งระดับการใช้งาน / การทำความเข้าใจ FP ของฉันเป็นเรื่องเล็กน้อยดังนั้นฉันจึงไม่จำเป็นต้องเข้าใจไดอะแกรมในโปรแกรม FP อย่างง่าย
การออกแบบ OO มีฟังก์ชั่น / คลาส / แพ็กเกจระดับของสิ่งที่เป็นนามธรรมด้วยการห่อหุ้ม (การควบคุมการเข้าถึงการซ่อนข้อมูล) ในแต่ละครั้งซึ่งทำให้การจัดการความซับซ้อนง่ายขึ้น องค์ประกอบเหล่านี้ช่วยให้สามารถแก้ไขปัญหาและแก้ไขปัญหาได้ง่ายขึ้น
คำตอบมากมายพูดถึงวิธีการวิเคราะห์และออกแบบใน FP ในลักษณะที่คล้ายคลึงกับ OO แต่ไม่มีใครอ้างถึงสิ่งใดในระดับสูง (พอลอ้างถึงสิ่งที่น่าสนใจ แต่อยู่ในระดับต่ำ) ฉันทำ Googling มากเมื่อวานนี้และพบว่ามีการสนทนาที่น่าสนใจ ต่อไปนี้มาจากRefactoring Functional Programs โดย Simon Thompson (2004) (เหมืองที่เน้น)
ในการออกแบบระบบเชิงวัตถุนั้นจะต้องดำเนินการเพื่อให้ได้รับการออกแบบที่จะนำหน้าการเขียนโปรแกรม การออกแบบจะถูกเขียนโดยใช้ระบบเช่น UML ซึ่งได้รับการสนับสนุนในเครื่องมือเช่น Eclipse โปรแกรมเมอร์เริ่มต้นอาจเรียนรู้วิธีการออกแบบภาพโดยใช้ระบบเช่น BlueJ งานเกี่ยวกับระเบียบวิธีที่คล้ายกันสำหรับการเขียนโปรแกรมการทำงานมีรายงานในFAD: การวิเคราะห์และการออกแบบฟังก์ชั่นแต่มีงานอื่นเล็กน้อย อาจมีสาเหตุหลายประการ
โปรแกรมการทำงานที่มีอยู่มีขนาดที่ไม่ต้องการการออกแบบ โปรแกรมการทำงานหลายโปรแกรมมีขนาดเล็ก แต่โปรแกรมอื่น ๆ เช่น Glasgow Haskell Compiler นั้นมีความสำคัญ
โปรแกรมที่ใช้งานได้จำลองโมเดลโดเมนแอปพลิเคชันโดยตรงซึ่งทำให้การออกแบบไม่เกี่ยวข้อง ในขณะที่ภาษาที่ใช้งานได้นั้นมีรูปแบบนามธรรมที่ทรงพลังมากมายมันเป็นเรื่องยากที่จะโต้แย้งว่าสิ่งเหล่านี้มีรูปแบบนามธรรมที่จำเป็นทั้งหมดในการสร้างแบบจำลองโลกแห่งความจริง
โปรแกรมการทำงานถูกสร้างขึ้นเป็นชุดต้นแบบของการพัฒนา
ในวิทยานิพนธ์ระดับปริญญาเอกที่อ้างถึงข้างต้นประโยชน์ของการใช้วิธีการวิเคราะห์และการออกแบบ (ADM) เป็นโครงร่างที่เป็นอิสระจากกระบวนทัศน์ แต่มีการโต้แย้งว่า ADM ควรสอดคล้องกับกระบวนทัศน์การนำไปปฏิบัติ นั่นคือ OOADM ทำงานได้ดีที่สุดสำหรับการเขียนโปรแกรม OO และใช้ไม่ได้กับกระบวนทัศน์อื่นเช่น FP นี่เป็นคำพูดที่ดีมากที่ฉันคิดว่าการถอดความสิ่งที่ฉันเรียกว่า
หนึ่งสามารถโต้เถียงเกี่ยวกับกระบวนทัศน์ที่ให้การสนับสนุนที่ดีที่สุดสำหรับการพัฒนาซอฟต์แวร์ แต่อย่างใดอย่างหนึ่งประสบความสำเร็จมากที่สุดแพคเกจการพัฒนาที่เป็นธรรมชาติมีประสิทธิภาพและมีประสิทธิภาพเมื่อหนึ่งยังคงอยู่ในกระบวนทัศน์เดียวจากคำอธิบายปัญหา
นี่คือชุดของไดอะแกรมที่เสนอโดย FAD:
- ฟังก์ชั่นการพึ่งพาแผนภาพซึ่งนำเสนอฟังก์ชั่นกับผู้ที่จะใช้ในการดำเนินงานของตน;
- พิมพ์แผนภาพพึ่งพาซึ่งให้บริการเดียวกันสำหรับประเภท; และ,
- โมดูลแผนภาพการพึ่งพาซึ่งนำเสนอมุมมองของสถาปัตยกรรมโมดูลของระบบ
มีกรณีศึกษาในหัวข้อ 5.1 ของวิทยานิพนธ์ FAD ซึ่งเป็นระบบที่จะทำการผลิตข้อมูลที่เกี่ยวข้องกับลีกฟุตบอล (ฟุตบอล) โดยอัตโนมัติ ความต้องการใช้งานได้ 100% เช่นผลฟุตบอลอินพุทสร้างตารางลีกตารางคะแนนตารางการเข้าร่วมถ่ายโอนผู้เล่นระหว่างทีมการอัพเดทข้อมูลหลังผลการแข่งขันใหม่ ฯลฯ ไม่ต้องพูดถึงว่า FAD ทำงานอย่างไรเพื่อแก้ปัญหาความต้องการที่ไม่ใช่หน้าที่ นอกเหนือจากที่ระบุว่า "ควรอนุญาตให้มีฟังก์ชั่นใหม่ในราคาประหยัด" ซึ่งเป็นสิ่งที่แทบเป็นไปไม่ได้ในการทดสอบ
น่าเศร้าที่นอกเหนือจาก FAD ฉันไม่เห็นการอ้างอิงที่ทันสมัยสำหรับการสร้างแบบจำลองภาษา (ภาพ) ที่เสนอให้กับ FP UML เป็นกระบวนทัศน์อื่นดังนั้นเราจึงควรลืม