... และอาจเป็นหนึ่งในบทความที่ OOP อ้างอิง
ไม่จริง แต่มันเพิ่มการอภิปรายโดยเฉพาะอย่างยิ่งสำหรับผู้ปฏิบัติงานที่ในเวลานั้นได้รับการฝึกฝนให้ย่อยสลายระบบโดยใช้เกณฑ์แรกที่เขาอธิบายในเอกสาร
ก่อนอื่นฉันต้องการทราบว่าการประเมินของฉันถูกต้องหรือไม่ กระบวนทัศน์ของ FP และบทความนี้ขัดแย้งกับปรัชญาหรือไม่?
ไม่ยิ่งไปกว่านั้นในสายตาของฉันคำอธิบายของคุณในสิ่งที่โปรแกรม FP ดูเหมือนไม่แตกต่างจากโปรแกรมอื่นที่ใช้ขั้นตอนหรือฟังก์ชั่น:
ข้อมูลถูกส่งผ่านจากฟังก์ชั่นหนึ่งไปยังอีกฟังก์ชั่นแต่ละฟังก์ชั่นจะรับรู้ข้อมูลอย่างใกล้ชิดและ "เปลี่ยน" ไปพร้อมกัน
...ยกเว้นส่วน "ความสนิทสนม" เนื่องจากคุณสามารถ (และบ่อยครั้ง) มีฟังก์ชั่นที่ทำงานบนข้อมูลนามธรรมได้อย่างแม่นยำเพื่อหลีกเลี่ยงความใกล้ชิด ดังนั้นคุณสามารถควบคุม "ความใกล้ชิด" และคุณสามารถควบคุมมันได้ตามที่คุณต้องการโดยการตั้งค่าอินเทอร์เฟซ (เช่นฟังก์ชั่น) สำหรับสิ่งที่คุณต้องการซ่อน
ดังนั้นฉันไม่เห็นเหตุผลที่เราจะไม่สามารถปฏิบัติตามเกณฑ์การซ่อนข้อมูลของ Parnas โดยใช้การเขียนโปรแกรมการทำงานและจบลงด้วยการใช้ดัชนี KWIC พร้อมประโยชน์ที่คล้ายคลึงกันในการใช้งานครั้งที่สองของเขา
สมมติว่าพวกเขาเห็นด้วยฉันต้องการทราบว่าการนำ FPs ไปปฏิบัติใช้ของการซ่อนข้อมูลคืออะไร เห็นได้ชัดใน OOP คุณสามารถมีฟิลด์ส่วนตัวที่ไม่มีใครสามารถเข้าถึงได้ ไม่มีสิ่งใดที่เปรียบเทียบกับฉันใน FP
เท่าที่ข้อมูลมีความกังวลคุณสามารถทำอย่างละเอียดนามธรรมข้อมูลและนามธรรมชนิดข้อมูลโดยใช้ FP ใด ๆ ของโครงสร้างคอนกรีตซ่อนเร้นและการจัดการของโครงสร้างคอนกรีตเหล่านี้โดยใช้ฟังก์ชั่นเป็นนามธรรม
แก้ไข
มีการยืนยันจำนวนมากขึ้นเรื่อย ๆ ที่นี่ซึ่งระบุว่า "การซ่อนข้อมูล" ในบริบทของ FP ไม่เป็นประโยชน์ (หรือ OOP-ish (?)) ดังนั้นให้ฉันประทับตราที่นี่เป็นตัวอย่างที่ง่ายและชัดเจนจาก SICP:
สมมติว่าระบบของคุณต้องทำงานกับจำนวนตรรกยะ วิธีหนึ่งที่คุณอาจต้องการใช้แทนมันคือเป็นคู่หรือรายการของจำนวนเต็มสองตัว: ตัวเศษและส่วน ดังนั้น:
(define my-rat (cons 1 2)) ; here is my 1/2
หากคุณไม่สนใจข้อมูลที่เป็นไปได้ว่าคุณจะได้รับเศษและส่วนที่ใช้car
และcdr
:
(... (car my-rat)) ; do something with the numerator
หลังจากใช้วิธีนี้ทุกส่วนของระบบที่จัดการกับจำนวนตรรกยะจะรู้ว่าจำนวนตรรกยะคือ a cons
- พวกเขาจะcons
สร้างตัวเลขปันส่วนและแยกพวกมันออกโดยใช้ตัวดำเนินรายการ
ปัญหาหนึ่งที่คุณอาจเผชิญคือเมื่อคุณจำเป็นต้องลดจำนวนของจำนวนตรรกยะ - การเปลี่ยนแปลงจะต้องเกิดขึ้นทั่วทั้งระบบ นอกจากนี้หากคุณตัดสินใจที่จะลดเวลาในการสร้างคุณอาจพบว่าการลดลงเมื่อเข้าถึงข้อตกลงที่มีเหตุผลข้อใดข้อหนึ่งจะดีกว่าทำให้ได้รับการเปลี่ยนแปลงแบบเต็มอีกครั้ง
ปัญหาอีกอย่างก็คือถ้าสมมุติว่าเป็นตัวแทนที่เป็นทางเลือกสำหรับพวกเขาและคุณตัดสินใจที่จะละทิ้งการcons
เป็นตัวแทน - เปลี่ยนสเกลเต็มรูปแบบอีกครั้ง
ความพยายามอย่างมีสติใด ๆ ในการรับมือกับสถานการณ์เหล่านี้มีแนวโน้มที่จะเริ่มต้นซ่อนการเป็นตัวแทนของปันส่วนหลังอินเทอร์เฟซ ในตอนท้ายคุณอาจท้ายด้วยสิ่งนี้:
(make-rat <n> <d>)
ส่งกลับจำนวนจริงที่มีเศษเป็นจำนวนเต็มและส่วนซึ่งเป็นจำนวนเต็ม<n>
<d>
(numer <x>)
<x>
ผลตอบแทนที่ได้เศษของจำนวนจริงที่
(denom <x>)
<x>
ผลตอบแทนส่วนของจำนวนจริงที่
และระบบจะไม่ (และไม่ควรรู้) อีกต่อไปถึงสิ่งที่ปันส่วนมา เพราะนี่คือcons
, car
และcdr
ไม่ได้อยู่ภายใน rationals แต่make-rat
, numer
และมีdenom
แน่นอนว่านี่อาจเป็นระบบ FP ได้อย่างง่ายดาย ดังนั้น "data hiding" (ในกรณีนี้รู้จักกันดีในชื่อ data abstraction หรือความพยายามในการห่อหุ้มการแสดงและโครงสร้างคอนกรีต) มาเป็นแนวคิดที่เกี่ยวข้องและเทคนิคที่ใช้กันอย่างแพร่หลายและสำรวจไม่ว่าจะในบริบทของ OO อะไรก็ตาม
และประเด็นก็คือ ... แม้ว่าเราอาจพยายามสร้างความแตกต่างระหว่างสิ่งที่ "ซ่อนเร้น" หรือการห่อหุ้มที่พวกเขากำลังทำอยู่ (ไม่ว่าจะเป็นการซ่อนการตัดสินใจการออกแบบหรือโครงสร้างข้อมูลหรืออัลกอริทึม - ในกรณีของขั้นตอนนามธรรม) พวกเขาทั้งหมดมีรูปแบบเดียวกัน: พวกเขามีแรงจูงใจจากหนึ่งหรือหลายจุดที่ Parnas ทำไว้อย่างชัดเจน นั่นคือ:
- ความสามารถในการเปลี่ยนแปลง: การเปลี่ยนแปลงที่จำเป็นสามารถทำได้ในพื้นที่หรือถูกแพร่กระจายผ่านระบบ
- การพัฒนาอิสระ: ระบบสองส่วนสามารถพัฒนาได้ในระดับใด
- ความเข้าใจ (Comprehensibility): ระบบจะต้องรู้จำนวนเท่าใดในการทำความเข้าใจส่วนใดส่วนหนึ่ง
ตัวอย่างข้างต้นถูกนำมาจากหนังสือ SICP ดังนั้นสำหรับการสนทนาแบบเต็มและนำเสนอแนวความคิดนี้ในหนังสือเล่มนี้ผมขอแนะนำให้ตรวจสอบจากบทที่ 2 ฉันยังแนะนำให้ทำความคุ้นเคยกับประเภทข้อมูลนามธรรมในบริบทของ FP ซึ่งจะนำปัญหาอื่น ๆ มาสู่ตาราง