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?
Jawaban:
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 .
sumber
Ini berarti bahwa kedua konsep tersebut tidak memiliki ide yang bertolak belakang atau tidak kompatibel satu sama lain.
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 .
sumber
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.
sumber
* 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.
sumber