it-swarm.dev

Fonksiyonel Programlama vs. OOP

Son zamanlarda Haskell gibi fonksiyonel dillerin kullanımı hakkında çok fazla konuşma duydum. Fonksiyonel programlamanın nesne yönelimli programlamaya karşı büyük farkları, artıları ve eksileri nelerdir?

95
GSto

Daha fazla olduğunu söyleyebilirim Fonksiyonel Programlama vs Zorunlu Programlama.

En büyük fark, Zorunlu programlama yaklaşık Kontrol akışı iken Fonksiyonel programlama yaklaşık Veri akışı . Bunu söylemenin bir başka yolu da fonksiyonel programlamanın zorunlu olarak programlamada sadece ifadeler kullanmasıdır ifadeler ve ifadeler kullanılır.

Örneğin, zorunlu programlama değişkenleri ve döngüleri durum işlenirken yaygındır, fonksiyonel durumun programlanması, yan etkilerden ve atamalardan kaçınan parametre geçişi ile gerçekleştirilir.

Bir listenin toplamını hesaplamak için bir işlev için zorunlu sahte kod (toplam bir değişkente tutulur):

int sumList(List<int> list) {
    int sum = 0;
    for(int n = 0; n < list.size(); n++) {
        sum = sum + list.get(n);
    }

    return sum;
}

Aynı işlev için işlevsel sözde kod (toplam parametre olarak iletilir):

fun sumList([], sum) = sum
 |  sumList(v::lst, sum) = sumList(lst, v+sum)

Sunumu öneririm Fonksiyonel Programlama ile Efekt Etkileri by Simon Peyton-Jones fonksiyonel kavramlara iyi bir giriş için.

69
Jonas

Fonksiyonel programlama, tanımlayıcı bir modele dayanır ve kökleri lambda analizinden oluşur. C++ ve C # gibi daha zorunlu dillerden ödünç alınabilecek birçok harika kavram sunar.

Bazı örnekler, referans şeffaflığı, lambda fonksiyonları, birinci sınıf fonksiyonlar, tembel ve istekli değerlendirme ve değişmezliktir.

Başka hiçbir şey için fonksiyonel programlamanın öğrenilmesi içerdiği kavramlar için faydalıysa. Programlama şeklinizi değiştirecek ve programlama hakkında düşünecektir. Ve gelecekte fonksiyonel programlamanın nesne yönelimli programlama kadar önemli olacağını tahmin ediyorum.

Başlamak için Haskell gibi saf bir işlevsel dil kullanmayı ya da F # gibi karma bir dil kullanmayı tercih edebilirsiniz.

Çoğu iyi üniversite fonksiyonel programlamayı kapsayacaktır ve okula giderseniz bu kursu almanızı şiddetle tavsiye ederim.


Fonksiyonel programlamanın nesne yönelimli programlamaya karşı büyük farkları, artıları ve eksileri nelerdir?

Nesneye yönelik programlama güzeldir çünkü karmaşık probleminizi hiyerarşilere göre modelleyebilmenizi sağlar, böylece sorunu basitleştirebilirsiniz. Ancak değiştirilebilir nesneleri kullanırken çok iş parçacıklı programlamayı düşünmeye başladığınızda çok zorlaşır. Bu gibi durumlarda, senkronizasyon nesnelerini yoğun bir şekilde kullanmanız gerekir ve büyük bir uygulamayı mükemmelleştirmek neredeyse imkansızdır.

Fonksiyonel programlama devreye giriyor. Değişkenlik gibi şeyler yüzünden fonksiyonel programlama çok iş parçacıklı programları gerçekten basitleştiriyor. Bir işleve X girişi verildiğinde her zaman Y çıktısı olacağını bildiğinizde, bir şeyi paralel hale getirmeyi neredeyse çok kolay hale getirir. Ayrıca, bir değişkenin (veya fonksiyonel programlamadaki bir değerin) başka bir iş parçacığından ortadaki kullanımı değiştiremeyeceğini de bilirsiniz.

16
Brian R. Bondy

(Bu cevap StackOverflow'daki kapalı bir soruya verilen cevap 'den uyarlanmıştır.)

İşlevsel programlama ile nesne yönelimli programlama arasındaki en büyük farklardan biri, her birinin farklı bir yazılım gelişiminde daha iyi olmasıdır:

  • Nesne yönelimli diller, sabit bir işlemleri on şeyler kümeniz olduğunda iyidir ve kodunuz geliştikçe öncelikle yeni şeyler eklersiniz. Bu, mevcut yöntemleri uygulayan yeni sınıflar eklenerek gerçekleştirilebilir ve mevcut sınıflar tek başına bırakılır.

  • İşlevsel diller, sabit bir işler kümeniz olduğunda iyidir ve kodunuz geliştikçe, mevcut şeylere öncelikle yeni işlemler eklersiniz. Bu, mevcut veri türleriyle hesaplanan yeni işlevler eklenerek gerçekleştirilebilir ve mevcut işlevler tek başına bırakılır.

Evrim yanlış yola girdiğinde sorunlarınız olur:

  • Nesneye yönelik bir programa yeni bir işlem eklemek, yeni bir yöntem eklemek için birçok sınıf tanımının düzenlenmesini gerektirebilir.

  • İşlevsel bir programa yeni bir tür şey eklemek, yeni bir vaka eklemek için birçok işlev tanımının düzenlenmesini gerektirebilir.

Bu sorun yıllardır iyi bilinmektedir; 1998'de Phil Wadler "ifade sorunu" olarak adlandırdı . Bazı araştırmacılar, ifade sorununun mixins gibi dil özellikleriyle ele alınabileceğini düşünmesine rağmen, geniş çapta kabul gören bir çözüm henüz ana akımdan etkilenmedi.

10
Norman Ramsey

Buna karşı gerçek yok. Tamamen tamamlayıcı olabilirler. FP OOP'yi destekleyen diller vardır, ancak topluluklar modülerliği ele alma biçimleri bakımından farklılık gösterir.

FP dillerinin kullanıcıları, matematiksel yasalar yoluyla modülerliğe ulaşma eğilimindedir ve yasalarına uygunluk gösteren kanıtları tercih etmektedir.

Emir kipinde OOP kullanıcılar test senaryolarında nesnenin davranışını yakalama eğilimindedirler;.

Bu sadece küçük bir özellik, ama bahsetmeye değer olduğunu düşünüyorum.

5
Edgar Klerks

Bir benzetme:

Bir iş başvurusu yaptınız. Adınızı, iletişim bilgilerinizi ve çalışma geçmişinizi girersiniz. İşiniz bittiğinde artık boş bir uygulamanız yok.

Şimdi bunun yerine yazmadan önce net bir selofan tabakası ile kaplandığını hayal edin. Adını yaz. Başka bir selofan sayfası eklersiniz. İletişim bilgilerinizi yazıyorsunuz. Daha fazla selofan. Çalışma geçmişinizi yazıyorsunuz. İşiniz bittiğinde boş uygulamaya dokunulmaz. Ayrıca, her biri tek, ayrı bir değişikliğin etkisini yakalayan üç sayfa selofan var.

Birincisi (OOP), şeyleri yerinde değiştirme fikrini benimserken, ikincisi (FP) onu kapatır. Her ikisi de devlet yönetimi paradigmalarıdır. Her ikisi de farklı stratejiler kullanarak bir iş başvurusunu tamamlamanın etkisini yakalayabilir. OOP başlangıç ​​cihazını doğrudan değiştirirken FP daha önce gelenleri kaplar --- değişikliğin görünümünü etkilemek için .

2
Mario T. Lanza