FP ve OO dik mi?


13

Bu defa tekrar duydum ve FP ve OO'nun dik olduğu fikrini anlamaya ve doğrulamaya çalışıyorum.

Her şeyden önce, 2 kavramın dik olması ne anlama geliyor?

FP değişmezliği ve saflığı mümkün olduğunca teşvik eder. ve OO, durum ve mutasyon için inşa edilmiş bir şey gibi görünüyor (zorunlu programlamanın biraz organize bir versiyonu?). Ve nesnelerin değişmez olabileceğinin farkındayım. Ama OO bana devlet / değişim demek gibi görünüyor.

Zıt gibi görünüyorlar. Bu dikey oldukları anlamına mı geliyor?

Scala gibi bir dil hem OO hem de FP yapmayı kolaylaştırır, bu iki yöntemin dikliğini etkiler mi?


5
Nesne yönelimi, nesnelerin durumunu değiştirmesini gerektirmez. Yöntemler yeni nesneleri sonuç olarak döndürebilir. Bir kişinin durumunu değiştirebilmesi ve sıklıkla değiştirebilmesi, olması gerektiği veya iyi bir fikir olduğu anlamına gelmez. OO ve FP karşıt değiller.
Huperniketes

4
Stackoverflow yinelenen: FP ve OO dik?
sepp2k

Yanıtlar:


22

"Dik" terimi, eş anlamlı olduğu matematikten gelir: "dik". Bu bağlamda, bunu "iki şeyin birbiriyle hiçbir ilgisi yok" olarak anlayabilirsiniz.

İnsanlar FP ve OO'yu karşılaştırdıklarında genellikle iki ayrı ekseni karıştırırlar.

Bir yandan, zorunlu programlamaya karşı işlevsel programlamaya sahipsiniz. Jonas ikisi arasında iyi bir karşılaştırma yapar . Tek cümlelik sürüm "veri akışına karşı kontrol akışını" belirtir.

Diğer eksen veri soyutlamasıdır. Haskell gibi diller soyut verilere soyut veri türlerini kullanır. Smalltalk, verileri ve bu veriler üzerindeki işlemleri tek bir birime birleştiren nesneler kullanır. William Cook, Veri Özetini Anlama, Revisited makalesinde yapabileceğimden daha iyi açıklıyor .

Çoğu insanın FP ve OO'nun karşıt olduğunu düşünmesi son derece anlaşılabilir: çoğu OO dili zorunludur, bu nedenle Haskell ve Java'yı karşılaştırırsanız, veri akışı + ADT'ye karşı kontrol akışı + nesneye sahip olursunuz. Ama başka olasılıklar da var! Matthias Felleisen, Fonksiyonel Objeler konuşmasında FP ve OO ile nasıl mutlu bir şekilde evleneceğini açıklıyor .


+1, harika cevap. Yine de cevabınız Haskell tiplerini özlüyor.
missingfaktor

Kesinlikle. Az önce Haskell öğrenmeye başladım.
Frank Shearar

Bu Fonksiyonel Nesneler sunumunun herhangi bir kaydı olup olmadığını merak ediyorum ... Gerçekten ilgileniyorum, ama slaytlar tek başına gerçekten adalet yapma.
Rei Miyasaka

9

Her şeyden önce, 2 kavramın dik olması ne anlama geliyor?

Bu, iki kavramın zıt fikirlere sahip olmadığı veya birbiriyle uyumsuz olmadığı anlamına gelir.

FP değişmezliği ve saflığı mümkün olduğunca teşvik eder. ve OO, durum ve mutasyon için inşa edilmiş bir şey gibi görünüyor (zorunlu programlamanın biraz organize bir versiyonu?). Ve nesnelerin değişmez olabileceğinin farkındayım. Ama OO bana devlet / değişim demek gibi görünüyor.

Zıt gibi görünüyorlar. Dikliklerini nasıl etkiler?

Scala gibi bir dil hem OO hem de FP yapmayı kolaylaştırır, bu iki yöntemin dikliğini etkiler mi?

OO, kapsülleme, nesne kompozisyonu, veri soyutlama, alt tipleme yoluyla polimorfizm ve gerektiğinde kontrollü mutasyon ile ilgilidir (OO'da da değişmezlik teşvik edilir). FP, fonksiyon kompozisyonu, kontrol soyutlaması ve kısıtlı polimorfizm (diğer bir deyişle parametrik polimorfizm) ile ilgilidir. Dolayısıyla iki fikir çelişkili değildir. Her ikisi de size farklı dillerde güçler ve soyutlama mekanizmaları sağlar, bu da tek bir dilde olması mümkündür. Aslında, bu Scala'nın üzerine inşa edildiği tez !

Onun içinde Scala Deney OO ve FP - - Google'da konuşma, Martin Odersky çok iyi o iki kavram inandığı nasıl açıklıyor birbirlerine diktir ve Scala halk olarak Scala toplumda bilinen yeni paradigma haline zarif ve sorunsuz bir şekilde iki paradigmaları nasıl birleştirdiği nesne işlevsel paradigması. Senin için konuşmalıyım. :-)


Nesne işlevsel dillerin diğer örnekleri: OCaml , F # , Nemerle .


1
"Bu, iki kavramın zıt fikirlere sahip olmadığı veya birbiriyle uyumsuz olmadığı anlamına gelir." - Bu doğru, ama bence " farklı ama uyumsuz" gibi bir şey söyleyebilirim . Örneğin, biri diğerinin bir altkümesi olsaydı, uyumsuz olmazlardı, ama aynı zamanda dik olamazlardı.
Tim Goodman

@Tim: Bu terimi tanımlamak için [belki başarısız olabilir] girişimimdi. Ben gördüğünüz İngiliz gurusu değilim. : - |
missingfaktor

7

Ortogonal kabaca "bağımsız" anlamına gelir.

FP ve OO dikey ise, bu, ister nesneleri kullanın ister kullanmayın, değişmezliği kullanabileceğiniz ve değişmez olsun veya olmasın, nesneleri kullanabileceğiniz anlamına gelir.


2
"Bağımsız" koymak için iyi bir yoldur. Karşıt olmaları değil, kodunuzun işlevsel bir programlama stili mi yoksa nesne yönelimli bir programlama stili mi olduğu iki ayrı şeydir. Bunları bir grafikteki x ve y eksenleri gibi düşünün - diğerinde sabit kalırken bir yukarı ve aşağı hareket edebilirsiniz. (Matematiksel anlamda, x-yönündeki bir vektör ve y-yönündeki bir vektör tam anlamıyla diktir - CS tanımı ilişkilidir.)
Tim Goodman

@TimGoodman: Yaptığınız grafik benzeşimindeki x, y eksenini gerçekten beğendim. Bu, bir yönde bir yönde diğerine karşı bir hamle elde edildiğinde elde edilen nihai sonuca eşleştirilebilir mi (sonuçta her iki programlama paradigması hedefi daha kolay ve sürdürülebilir bir koda sahip olmak değil mi?)
rahulaga_dev

0

* Bu defa tekrar duydum ve FP ve OO'nun dik olduğu fikrini anlamaya ve doğrulamaya çalışıyorum. *

Her şeyden önce, 2 kavramın dik olması ne anlama geliyor?

Wikipedia alıntısı: "Diklik, bir sistemin bir bileşeni tarafından üretilen teknik etkiyi değiştirmenin, sistemin diğer bileşenleri için ne yan etki yarattığını ne de bunların yayılmasını garanti eder."

Basitçe, bu sadece bir sistemdeki değişikliğin diğer sistemdeki bir değişikliği etkilemeyeceği ve etkileyemeyeceği anlamına gelir.

Örneğin, bir otomobilin dikey bileşenleri ve kontrolleri vardır (örneğin, aracın hızlandırılması, yalnızca hızlandırma işleviyle ilgili bileşenler dışında hiçbir şeyi etkilemez. Örneğin radyoyu etkilemez (CD çalmayı etkileyip etkilemediğinden emin olmasam da, çünkü benimki bazen atlıyor)).

FP değişmezliği ve saflığı mümkün olduğunca teşvik eder. ve OO, durum ve mutasyon için inşa edilmiş bir şey gibi görünüyor (zorunlu programlamanın biraz organize bir versiyonu?). Ve nesnelerin değişmez olabileceğinin farkındayım. Ama OO bana devlet / değişim demek gibi görünüyor.

Zıt gibi görünüyorlar. Bu dikey oldukları anlamına mı geliyor?

Tür. Sorun şu ki, bu kavramların hiçbiri gerçekten çok zor tanımlanmamış. Ama evet, bunun özünü aldın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.