Son zamanlarda Haskell gibi fonksiyonel dilleri kullanma hakkında birçok konuşma duydum. Nesne yönelimli programlama ile işlevsel programlamanın büyük farkları, artıları ve eksileri nelerdir?
Son zamanlarda Haskell gibi fonksiyonel dilleri kullanma hakkında birçok konuşma duydum. Nesne yönelimli programlama ile işlevsel programlamanın büyük farkları, artıları ve eksileri nelerdir?
Yanıtlar:
Zorunlu Programlamaya Karşı İşlevsel Programlamanın daha fazla olduğunu söyleyebilirim .
En büyük fark, Emir Kademeli programlamanın Kontrol akışı ile ilgiliyken İşlevsel programlama Veri akışı ile ilgilidir . Bunu söylemek için başka bir yolu da işlevsel programlama sadece kullanmasıdır ifadeleri zorunlu programlamada hem süre ifadeler ve ifadeleri kullanılır.
Örneğin, zorunlu programlamada değişkenler ve ilmekler, hal kullanımı sırasında yaygındır; işlevsel programlamada ise, durum, yan etkiler ve atamaları önleyen parametre geçirme yoluyla ele alınır.
Bir listenin toplamını hesaplamak için bir fonksiyonun emirsel sözde kodu (toplamı değişkende 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)
Ben sunu tavsiye Fonksiyonel Programlama ile Ehlileştirilmesi Etkileri tarafından Simon Peyton-Jones fonksiyonel kavramlara iyi tanıtımı için.
İşlevsel programlama bildirimsel bir modele dayanır ve köklerini lambda matematiğinden alır. C ++ ve C # gibi zorunlu dillerden ödünç alınabilecek birçok harika konsept sunar.
Bazı örnekler referans saydamlığı, lambda fonksiyonları, birinci sınıf fonksiyonlar, tembel ve istekli değerlendirme ve değişmezliği içerir.
Başka hiçbir şey için işlevsel programlama öğrenmek, içerdiği kavramlar için faydalı ise. Programlama şeklinizi değiştirecek ve programlamayı düşünecek. Ve gelecekteki 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ı seçebilir ya da benzeri bir melez kullanabilirsiniz. F # .
En iyi üniversiteler fonksiyonel programlamayı kapsayacak ve okula giderseniz, o kursa katılmanızı şiddetle tavsiye ederim.
Nesne yönelimli programlama ile işlevsel programlamanın büyük farkları, artıları ve eksileri nelerdir?
Nesne yönelimli programlama güzeldir, çünkü karmaşık sorununuzu hiyerarşilere göre modellemenizi sağlar, böylece sorunu basitleştirebilirsiniz. Ancak değişken nesneler kullanırken çoklu dişli programlamayı düşünmeye başladığınızda çok zorlaşır. Bu gibi durumlarda, senkronizasyon nesnelerinin yoğun kullanımı gerekir ve büyük bir uygulamayı mükemmelleştirmek neredeyse imkansızdır.
İşlevsel programlamanın devreye girdiği yer burasıdır. Değişmezlik gibi şeyler yüzünden, işlevsel programlama gerçekten çok parçalı programları basitleştirir. X girişine bir işleve verilen her zaman Y çıkacağını bildiğinizde bir şeyi paralelleştirmek neredeyse hiç kolay olmuyor, ayrıca bir değişkenin (veya işlevsel programlamadaki değerin) başka bir iş parçacığından orta kullanımı değiştiremediğini biliyorsunuz.
(Bu cevap StackOverflow'taki cevaptan kapalı bir soruya uyarlanmıştır. .)
İşlevsel programlama ve nesne yönelimli programlama arasındaki en büyük farklardan biri, her birinin farklı türdeki bir yazılım gelişiminde daha iyi olduğudur:
Nesneye yönelik diller, nesneler üzerinde sabit bir işlem kümesi olduğunda iyidir ve kodunuz geliştikçe, öncelikle yeni şeyler eklersiniz. Bu, mevcut yöntemleri uygulayan yeni sınıflar ekleyerek gerçekleştirilebilir ve mevcut sınıflar yalnız bırakılır.
İşlevsel diller, sabit bir şeyler diziniz varsa iyidir ve kodunuz geliştikçe, öncelikle mevcut şeyler üzerine yeni işlemler eklersiniz . Bu, mevcut veri tipleriyle hesaplanan yeni fonksiyonlar eklenerek gerçekleştirilebilir ve mevcut fonksiyonlar yalnız bırakılır.
Evrim yanlış gittiğinde, sorunların var:
Nesne yönelimli 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 şey eklemek, yeni bir durum eklemek için birçok işlev tanımını düzenlemeyi gerektirebilir.
Bu problem uzun yıllardır iyi bilinmektedir; 1998 yılında Phil Wadler "ifade sorunu" olarak nitelendirdi . Bazı araştırmacılar, ifade probleminin karışımlar gibi dil özellikleriyle çözülebileceğini düşünmelerine rağmen, yaygın olarak kabul edilmiş bir çözüm henüz ana akıma girmedi.
Buna karşı bir gerçek yok. Mükemmel tamamlayıcı olabilirler. OOP'yi destekleyen FP dilleri vardır. Ancak topluluklar modülerliği idare etme şekilleri bakımından farklılık gösterir.
FP dilleri kullanıcıları matematiksel yasalarla modülerliği sağlama eğilimindedir. Ve yasalarına uyumu göstermek için deliller tercih edin.
Zorunlu OOP kullanıcıları, nesnelerin değişmesi ve modülerliği bu şekilde başarması durumunda tekrar test edilebilecek test vakalarında nesnenin davranışını yakalama eğilimindedir.
Bu sadece küçük bir boyut, ama bence değmeye değer.
Bir benzetme:
Bir iş başvurusu yaptınız. İsminizi, iletişim bilgilerinizi ve çalışma geçmişinizi girin. İşiniz bittiğinde artık boş bir uygulamanız olmayacak.
Şimdi, bunun yerine, yazmadan önce net bir selofan yaprağı ile kapladığınızı hayal edin. Sen adını yaz. Başka bir selofan yaprağı eklediniz. İletişim bilgilerinizi yazıyorsunuz. Daha fazla selofan. İş geçmişini yazıyorsun. İşiniz bittiğinde, hala boş uygulamaya dokunulmaz. Ayrıca, her biri ayrı ve tek bir değişikliğin etkisini yakalayan üç selefon selefonunuz var.
Birincisi (OOP), bir şeyleri değiştirme fikrini benimserken, ikincisi (FP) onu terk ediyor. Her ikisi de devlet yönetimi paradigmalarıdır. Her ikisi de, farklı stratejiler kullanarak, bir iş başvurusu tamamlamanın etkisini yakalayabilir. OOP başlangıç enstrümanını doğrudan değiştirirken, FP değişikliğin görünümünü etkilemek için daha önce gelenleri üst üste bindirir .