FP dan OO ortogonal?

13

Saya telah mendengar ini berulang kali dan saya mencoba untuk memahami dan memvalidasi gagasan bahwa FP dan OO adalah ortogonal.

Pertama-tama, apa artinya 2 konsep menjadi ortogonal?

FP mendorong kekekalan dan kemurnian sebanyak mungkin. dan OO tampaknya seperti sesuatu yang dibangun untuk keadaan dan mutasi (versi pemrograman imperatif yang sedikit terorganisir?). Dan saya benar-benar menyadari bahwa objek dapat berubah. Tapi OO sepertinya menyatakan / mengubah saya.

Mereka tampak seperti berseberangan. Apakah itu berarti mereka orthogonal?

Bahasa seperti Scala membuatnya mudah untuk melakukan OO dan FP keduanya, apakah ini mempengaruhi ortogonalitas dari 2 metode?

letronje
sumber
5
Orientasi objek tidak memerlukan objek untuk memanipulasi kondisinya. Metode dapat mengembalikan objek baru sebagai hasilnya. Fakta bahwa seseorang dapat, dan sering kali, memodifikasi keadaan objek tidak berarti mereka harus atau bahwa itu adalah ide yang baik. OO dan FP tidak bertentangan.
Huperniketes
4
Gandakan pada stackoverflow: FP dan OO orthogonal?
sepp2k

Jawaban:

22

Istilah "orthogonal" berasal dari matematika, di mana ia memiliki sinonim: "tegak lurus". Dalam konteks ini, Anda bisa memahaminya sebagai "dua hal tidak ada hubungannya dengan satu sama lain."

Ketika orang membandingkan FP dan OO mereka sering membingungkan dua sumbu terpisah.

Di satu sisi Anda memiliki pemrograman fungsional versus pemrograman imperatif. Jonas memberikan perbandingan yang baik dari keduanya. Versi satu kalimat mengatakan bahwa "aliran data versus aliran kontrol".

Sumbu lainnya adalah abstraksi data. Bahasa seperti Haskell menggunakan tipe data abstrak untuk, well, data abstrak. Smalltalk menggunakan objek, yang menggabungkan data dan operasi pada data tersebut menjadi satu unit. William Cook menjelaskan lebih baik daripada yang saya bisa dalam makalahnya On Understanding Data Abstraction, Revisited .

Sangat bisa dimengerti bahwa kebanyakan orang akhirnya berpikir bahwa FP dan OO adalah berlawanan: kebanyakan bahasa OO sangat penting, jadi jika Anda membandingkan, katakanlah, Haskell dan Java, Anda memiliki aliran data + ADT versus aliran kontrol + objek. Tetapi ada kemungkinan lain! Matthias Felleisen menjelaskan bagaimana dengan bahagia menikahi FP dan OO dalam ceramahnya Objects Fungsional .

Frank Shearar
sumber
+1, jawaban yang bagus. Namun jawaban Anda ketinggalan pada kacamata Haskell.
missingfaktor
Tentunya. Saya baru saja mulai mempelajari Haskell.
Frank Shearar
Saya ingin tahu apakah ada rekaman presentasi Objek Fungsional itu ... Saya benar-benar tertarik, tetapi slide saja tidak benar-benar melakukannya dengan adil.
Rei Miyasaka
9

Pertama-tama, apa artinya 2 konsep menjadi ortogonal?

Ini berarti bahwa kedua konsep tersebut tidak memiliki ide yang bertolak belakang atau tidak kompatibel satu sama lain.

FP mendorong kekekalan dan kemurnian sebanyak mungkin. dan OO tampaknya seperti sesuatu yang dibangun untuk keadaan dan mutasi (versi pemrograman imperatif yang sedikit terorganisir?). Dan saya benar-benar menyadari bahwa objek dapat berubah. Tapi OO sepertinya menyatakan / mengubah saya.

Mereka tampak seperti berseberangan. Bagaimana pengaruhnya terhadap ortogonalitas mereka?

Bahasa seperti Scala membuatnya mudah untuk melakukan OO dan FP keduanya, apakah ini mempengaruhi ortogonalitas dari 2 metode?

OO adalah tentang enkapsulasi, komposisi objek, abstraksi data, polimorfisme melalui subtyping, dan mutasi terkontrol bila perlu (immutabilitas juga didorong dalam OO). FP adalah tentang komposisi fungsi, abstraksi kontrol, dan polimorfisme terkendali (alias polimorfisme parametrik). Dengan demikian kedua gagasan itu tidak saling bertentangan. Mereka berdua memberi Anda berbagai jenis kekuatan dan mekanisme abstraksi, yang tentunya mungkin dimiliki dalam satu bahasa. Sebenarnya, ini adalah tesis yang menjadi dasar Scala dibangun!

Dalam ceramah Scala Eksperimennya di Google, Martin Odersky menjelaskan dengan sangat baik bagaimana ia percaya kedua konsep - OO dan FP - saling ortogonal satu sama lain dan bagaimana Scala menyatukan dua paradigma secara elegan dan mulus ke dalam paradigma baru yang dikenal di komunitas Scala sebagai paradigma objek-fungsional. Harus menonton pembicaraan untukmu. :-)


Contoh lain bahasa fungsi-fungsi: OCaml , F # , Nemerle .

missingfaktor
sumber
1
"Ini berarti bahwa kedua konsep tidak memiliki ide yang berlawanan atau tidak saling bertentangan." - Itu benar, tapi saya pikir saya akan mengatakan sesuatu seperti " berbeda tetapi tidak tidak kompatibel". Misalnya, jika satu adalah bagian dari yang lain maka mereka tidak akan tidak kompatibel, tetapi mereka juga tidak akan ortogonal.
Tim Goodman
@Tim: Itu adalah upaya saya [mungkin gagal] untuk mendefinisikan istilah. Saya bukan guru bahasa Inggris. : - |
missingfaktor
7

Orthogonal secara kasar berarti "independen."

Jadi jika FP dan OO bersifat ortogonal, itu berarti Anda dapat menggunakan kekekalan apakah Anda menggunakan objek atau tidak, dan Anda dapat menggunakan objek apakah itu tidak dapat diubah atau tidak.

Catatan untuk memikirkan nama
sumber
2
"Independen" adalah cara yang baik untuk menggambarkannya. Bukan karena mereka bertentangan, tetapi apakah kode Anda adalah gaya pemrograman fungsional atau gaya pemrograman berorientasi objek adalah dua hal yang terpisah. Pikirkan mereka seperti sumbu x dan y pada grafik - Anda dapat bergerak naik dan turun sambil tetap memperbaiki yang lain. (Dalam pengertian matematis, vektor dalam arah x dan vektor dalam arah y secara harfiah ortogonal - definisi CS terkait.)
Tim Goodman
@TimGoodman: Saya sangat menyukai sumbu x, y pada grafik analogi yang Anda buat. Bisakah ini dipetakan ke hasil akhir yang dicapai ketika satu bergerak dalam satu arah vs yang lain (maksud saya pada akhirnya kedua tujuan paradigma pemrograman adalah untuk memiliki kode yang lebih mudah dan dapat dipertahankan, bukan?)
rahulaga_dev
0

* Saya telah mendengar berulang kali dan saya mencoba untuk memahami dan memvalidasi gagasan bahwa FP dan OO adalah ortogonal. *

Pertama-tama, apa artinya 2 konsep menjadi ortogonal?

Kutipan Wikipedia: "Orthogonality menjamin bahwa memodifikasi efek teknis yang dihasilkan oleh komponen sistem tidak menciptakan atau menyebarkan efek samping ke komponen lain dari sistem."

Sederhananya, itu hanya berarti bahwa perubahan ke satu sistem tidak, dan tidak dapat memengaruhi perubahan di sistem lain.

Misalnya, mobil memiliki komponen dan kontrol ortogonal (mis. Akselerasi kendaraan tidak memengaruhi apa pun selain komponen yang terlibat secara eksklusif dengan fungsi akselerasi. Tidak memengaruhi radio misalnya (walaupun saya tidak yakin apakah itu memengaruhi pemutaran CD, karena saya kadang-kadang melewatkan)).

FP mendorong kekekalan dan kemurnian sebanyak mungkin. dan OO tampaknya seperti sesuatu yang dibangun untuk keadaan dan mutasi (versi pemrograman imperatif yang sedikit terorganisir?). Dan saya benar-benar menyadari bahwa objek dapat berubah. Tapi OO sepertinya menyatakan / mengubah saya.

Mereka tampak seperti berseberangan. Apakah itu berarti mereka orthogonal?

Agak. Masalahnya adalah bahwa tidak satu pun dari konsep-konsep ini benar-benar sulit didefinisikan. Tapi ya, Anda mendapatkan intinya.

Benteng
sumber