FP และ OO orthogonal?


13

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

ประการแรกมันหมายความว่าอย่างไรสำหรับ 2 แนวคิดที่จะเป็นมุมฉาก

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

พวกเขาดูเหมือนตรงกันข้าม นั่นหมายความว่าพวกเขาเป็นมุมฉาก?

ภาษาอย่างสกาล่าทำให้ง่ายต่อการทำ OO และ FP ทั้งสองสิ่งนี้ส่งผลกระทบต่อความตั้งฉากของทั้งสองวิธีหรือไม่?


5
การวางแนววัตถุไม่ต้องการวัตถุเพื่อจัดการสถานะของมัน วิธีการสามารถส่งคืนวัตถุใหม่เป็นผลลัพธ์ ความจริงที่ว่าคน ๆ หนึ่งสามารถทำได้และบ่อยครั้งทำการปรับเปลี่ยนสถานะของวัตถุไม่ได้หมายความว่าพวกเขาต้องทำหรือว่าเป็นความคิดที่ดี OO และ FP ไม่ใช่สิ่งที่ตรงกันข้าม
Huperniketes

4
ทำซ้ำใน stackoverflow: FP และ OO orthogonal หรือไม่
sepp2k

คำตอบ:


22

คำว่า "orthogonal" มาจากคณิตศาสตร์ซึ่งมีคำพ้องความหมาย: "ตั้งฉาก" ในบริบทนี้คุณสามารถเข้าใจว่า "ทั้งสองสิ่งไม่มีส่วนเกี่ยวข้องกัน"

เมื่อผู้คนเปรียบเทียบ FP และ OO พวกเขามักจะสับสนระหว่างสองแกน

ในอีกด้านหนึ่งคุณมีการเขียนโปรแกรมการทำงานและการเขียนโปรแกรมที่จำเป็น โจนัสให้การเปรียบเทียบที่ดีของทั้งสอง เวอร์ชั่นหนึ่งประโยคบอกว่า "data flow กับ control flow"

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

เป็นที่เข้าใจได้อย่างสมบูรณ์แบบว่าคนส่วนใหญ่คิดว่า FP และ OO เป็นสิ่งที่ตรงกันข้าม: ภาษา OO ส่วนใหญ่มีความจำเป็นดังนั้นถ้าคุณเปรียบเทียบพูด Haskell และ Java คุณมี data flow + ADT กับ control flow + object แต่มีความเป็นไปได้อื่น ๆ ! แมตเธียสเฟลเลเซนอธิบายถึงวิธีการอย่างมีความสุขแต่งงาน FP และ OO ในการพูดคุยของเขาวัตถุที่ฟังก์ชั่น


+1, คำตอบที่ดี คำตอบของคุณพลาดไปกับประเภทของ Haskell
missingfaktor

ได้อย่างแน่นอน ฉันเพิ่งเริ่มเรียนรู้ Haskell
Frank Shearar

ฉันสงสัยว่ามีการบันทึกการนำเสนอ Functional Objects ใด ๆ หรือไม่ ... ฉันสนใจจริง ๆ แต่สไลด์เพียงอย่างเดียวไม่ได้ทำให้เกิดความยุติธรรม
Rei Miyasaka

9

ประการแรกมันหมายความว่าอย่างไรสำหรับ 2 แนวคิดที่จะเป็นมุมฉาก

หมายความว่าทั้งสองแนวคิดไม่มีความคิดที่ขัดแย้งกันหรือไม่เข้ากัน

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

พวกเขาดูเหมือนตรงกันข้าม มันมีผลต่อความตั้งฉากของพวกเขาอย่างไร?

ภาษาอย่างสกาล่าทำให้ง่ายต่อการทำ OO และ FP ทั้งสองสิ่งนี้ส่งผลกระทบต่อความตั้งฉากของทั้งสองวิธีหรือไม่?

OO เป็นเรื่องเกี่ยวกับการห่อหุ้มองค์ประกอบวัตถุนามธรรมข้อมูล polymorphism ผ่าน subtyping และการกลายพันธุ์ควบคุมเมื่อมีความจำเป็น (เปลี่ยนไม่ได้รับการสนับสนุนใน OO เช่นกัน) FP เป็นเรื่องเกี่ยวกับองค์ประกอบของฟังก์ชั่น, Abstraction control และ polymorphism ที่ จำกัด (aka parametric polymorphism) ดังนั้นความคิดทั้งสองจึงไม่ขัดแย้งกัน พวกเขาทั้งสองให้อำนาจที่แตกต่างและกลไกการคิดแบบต่าง ๆ ซึ่งเป็นไปได้อย่างแน่นอนที่คุณจะมีในภาษาเดียว อันที่จริงนี่เป็นวิทยานิพนธ์ที่สร้างขึ้นในสกาลา !

ในการพูดคุยเรื่องการทดลองของสกาล่าที่ Google มาร์ตินโอเดสกี้อธิบายว่าเขาเชื่อว่าทั้งสองแนวคิด - OO และ FP - เป็นมุมฉากซึ่งกันและกันและวิธีการที่สกาล่ารวมสองกระบวนทัศน์อย่างสง่างามและต่อเนื่องเป็นกระบวนทัศน์ใหม่ กระบวนทัศน์เชิงวัตถุ ต้องดูการพูดคุยกับคุณ :-)


ตัวอย่างอื่น ๆ ของภาษาวัตถุทำงาน: OCaml , F # , Nemerle


1
"หมายความว่าทั้งสองแนวคิดไม่มีความคิดที่ขัดแย้งกันหรือไม่ขัดกัน" - จริง แต่ฉันคิดว่าฉันจะพูดบางอย่างเช่น " ชัดเจนแต่ไม่เข้ากัน" ตัวอย่างเช่นหากมีส่วนย่อยของอีกส่วนหนึ่งพวกเขาจะไม่เข้ากัน แต่พวกเขาก็จะไม่เป็นแบบมุมฉาก
ทิมกู๊ดแมน

@Tim: นั่นคือความพยายาม [อาจล้มเหลว] ของฉันในการกำหนดคำศัพท์ ฉันไม่ใช่กูรูภาษาอังกฤษที่คุณเห็น : - |
missingfaktor

7

มุมฉากหมายถึง "อิสระ"

ดังนั้นถ้า FP และ OO เป็นมุมฉากนั่นหมายความว่าคุณสามารถใช้ความไม่เปลี่ยนแปลงไม่ว่าคุณจะใช้วัตถุหรือไม่และคุณสามารถใช้วัตถุไม่ว่าจะไม่เปลี่ยนรูปหรือไม่ก็ตาม


2
"อิสระ" เป็นวิธีที่ดีที่จะวางไว้ ไม่ใช่ว่าพวกมันตรงข้าม แต่ไม่ว่าโค้ดของคุณจะเป็นสไตล์การเขียนโปรแกรมที่ใช้งานได้หรือสไตล์การเขียนโปรแกรมเชิงวัตถุเป็นสองสิ่งที่แยกจากกัน คิดว่าพวกเขาชอบแกน x และ y บนกราฟ - คุณสามารถเลื่อนขึ้นและลงหนึ่งในขณะที่คงที่ในอีก (ในความหมายทางคณิตศาสตร์เวกเตอร์ในทิศทาง x และเวกเตอร์ในทิศทาง y นั้นเป็นฉากฉากที่แท้จริง - นิยามของ CS เกี่ยวข้องกัน)
Tim Goodman

@ TimGoodman: ฉันชอบแกน x, y บนกราฟที่คุณเปรียบเทียบ นี้สามารถแมปไปผลสุดท้ายเกิดขึ้นได้เมื่อหนึ่งย้ายในทิศทางเดียวเทียบกับอีก (ผมหมายถึงในที่สุดทั้งสองเป้าหมายกระบวนทัศน์การเขียนโปรแกรมคือการมีรหัสได้ง่ายขึ้นและการบำรุงรักษาที่ไม่ได้?)
rahulaga_dev

0

* ฉันได้ยินมาหลายครั้งแล้วและฉันพยายามที่จะเข้าใจและตรวจสอบความคิดที่ว่า FP และ OO นั้นเป็นมุมฉาก * * * *

ประการแรกมันหมายความว่าอย่างไรสำหรับ 2 แนวคิดที่จะเป็นมุมฉาก

เครื่องหมายคำพูดของวิกิพีเดีย: "Orthogonality รับรองว่าการแก้ไขผลกระทบทางเทคนิคที่เกิดจากส่วนประกอบของระบบจะไม่สร้างหรือเผยแพร่ผลข้างเคียงกับส่วนประกอบอื่น ๆ ของระบบ"

เพียงหมายความว่าการเปลี่ยนแปลงระบบหนึ่งไม่ได้และไม่มีผลต่อการเปลี่ยนแปลงในระบบอื่น

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

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

พวกเขาดูเหมือนตรงกันข้าม นั่นหมายความว่าพวกเขาเป็นมุมฉาก?

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

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