İşlevsel Programlamaya Karşı OOP [kapalı]


93

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?


27
Biri diğerini reddetmez.
mbq

1
@mbq bunların birbirini dışlayan olmadıklarını anlıyorum, ancak sadece iki yaklaşımın farkını daha iyi anlamaya çalışmak istedim.
GSto

Harika soru Ben de bunu merak ediyordum.
JohnFx

İşlevsel programlama ve nesne yönelimli programlama birbirine diktir. Her ikisini de aynı dilde kullanabilirsiniz. Örnekler: Scala, F #, OCaml vs. Jonas'ın önerdiği gibi , belki de zorunlu ve işlevsel olmak istedin ?
missingfaktor

4
Asıl cevap - aralarında "karşı" yok. Check out StackOverflow bu soruyu .
missingfaktor

Yanıtlar:


67

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.


12
İşlevsel sürümün özyinelemeli olduğunu ve böylece yığın taşmalarını önlemek için optimize edildiğini belirtmelisiniz. (Bazı insanlar özyinelemeyi görebilir ve işlevsel programlamanın bu nedenle kötü olduğunu düşünebilir)
alternatif

3
Emir kuvveti ve işlevselliğin en önemli yönünü tanımlamak için +1: veri akışı ve kontrol akışı. Ben eklemek zorunda olan bir şey fonksiyonel paradigma ve OO paradigma olmasıdır değil birbirini dışlayan; Nesnenin (verilerin) nasıl etkileşime girdiğini modellemek için OO paradigmasını ve bu nesneyi dönüştürmek (manipüle etmek) için fonksiyonel paradigmayı kullanabilirsiniz.
Lie Ryan,

1
İlginçtir ki, kontrol olarak veri ve veri olarak kontrol veri karışımını modelleyebilirsiniz. FP kontrol akışını dolaştırmak ve veriler gibi işlemek için Oklar ve birinci derece fonksiyonları kullanabilir. OOP, kontrol akışını değiştirmek için nesneleri kullanmak için çeşitli tasarım desenlerini kullanır.
CodexArcanum

Bence asıl farkın aynı programı yazdığınız değil, döngülerinizi özyinelemeli yöntem çağrıları yaptığınıza dikkat etmeniz gerekiyor. bundan çok daha büyük
sara

İşlevsel örneğiniz, parametre deseni eşleştirmesini kullanır. Fonksiyonel programlamaya münhasır değildir, benzer şekilde fonksiyonel programlar her yinelemeli algoritmayı özyinelemeli bir algoritma olarak formüle etmeye gerek kalmadan monadları ve hatta zorunlu yapıları kullanabilir.
Dai

16

İş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.


2
Açık olmak gerekirse, Şema hiçbir şekilde saf bir işlevsel dil değildir.
Jonathan Sterling

5
İkinci son paragrafınız tamamen bs. OO okuyuculukta herhangi bir sorun yaratmaz, değişkenlik yapar. Zorunlu programlamayı nesne yönelimli programlamayla karıştırıyor gibi görünüyorsunuz. Bu böyle mi?
missingfaktor

5
@missingfaktor: Hayır Kavramları karıştırmıyorum. Bir nesne tipik olarak erişimcilere, değiştiricilere, veri üyelerine ve üye işlevlerine sahiptir. Evet, tüm nesnelerin değiştiricilere sahip olması gerekmez ve bunları değişmez olarak uygulayabilirsiniz. Ancak herhangi bir isteğe bağlı OO programına bakarsanız, neredeyse kesinlikle değiştiricileri olan ve hala çoklu iş parçacıkları tarafından kullanılan birkaç nesneye sahip olacaktır. Yani bir OOP paradigmasında, her şeyin değişmez olması oldukça nadirdir.
Brian R. Bondy,


Ayrıca burada, Frank Shearar cevabını kontrol edin: programmers.stackexchange.com/questions/12423/...
missingfaktor

8

(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.


Cevabını seviyorum, burada bilgelik sözleri. Birkaç ay önce tanıştım ve yer imi koymadığım için özellikle 30 dakika boyunca aradım. Teknikler yerine kavramları anlama avantajını anlayanlar için OOP-FP ile ilgili en iyi açıklama İfade sorunuyla ilgili makale de harika. Görüşünüzü paylaştığınız için teşekkür ederiz, cevabınız bence çok az.
tobiak777

4

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.


2

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 .


güzel benzetme, thx !! (bu mümkünse) bu analojiyi bu iki yaklaşımda artılar ve eksilerle genişletir misiniz?
Rahul Agarwal
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.