İşlevsel programlama tam bir kurumsal uygulama geliştirmek için kullanılabilir mi?


19

Fonksiyonel programlama (FP) öğrenmeye başladım. Her şeyin nesne olduğu ve çoğunun değiştirilebilir olduğu bir OOP dünyasından geliyorum. İşlevlerin yan etkileri olmadığı kavramını sarmakta zorlanıyorum.

Bir şey değiştirilebilir değilse, Çalışan veya Kişi gibi nesneler FP'de nasıl temsil edilir.

FP tam teşekküllü bir kurumsal uygulama oluşturmak için kullanılabilir mi?


5
Neden bir çalışanın temsilinin değişebilir olması gerekir? Muhtemelen devleti var, ama bu tamamen başka bir soru.

1
Değişken veriler kullanılan şeyleri temsil eder. Aksine değişmez veriler, belirli bir zamandaki bir şeyin değerine sahiptir (ancak bu tek kullanım durumu değildir). Her biri aynı şeyi temsil eden iki değişken nesneye sahip olduğunuz bir hataya sahipseniz, şeyleri temsil etmek için nesneleri kullanmanın bir durum olduğunu bilirsiniz.
dan_waterworth

2
Fonksiyonel programlama vardır aksi takdirde herhangi bir şey yazdırmak mümkün asla yan etkileri.

1
@ Thorbjørn Ravn Andersen: Zorunlu (yordamsal, nesne yönelimli) programlamada, hem dış dünyayla (IO) iletişim kurmak hem de programınızdaki veri dönüşümlerini hesaplamak için yan etkiler kullanırsınız. FP'de iki dünyayı net bir şekilde ayırırsınız: yan etkileri sadece IO için kullanırsınız (IO'suz bir program normalde işe yaramaz), ancak dahili veri dönüşümlerini hesaplamak için saf işlevleri kullanırsınız. Yan etkilerden tamamen kaçınılamaz, ancak yerel olmadıkları için akıl yürütmeleri daha zordur, bu nedenle kullanımlarını mümkün olduğunca kısıtlamak iyidir.
Giorgio

"Kişi" nesnesi gibi bir şeyin değişebilir olması gerekmez. Bunun yerine, neredeyse aynı (ama biraz farklı) tamamen yeni bir "kişi" nesnesi oluşturursunuz. Bir yerde "kişi" nesnesine bir referansınız olur ve bunu eski kopya yerine yeni kopyaya başvuracak şekilde değiştirirsiniz. Elbette bu referans bir çeşit koleksiyonda olabilir, bu yüzden koleksiyonun neredeyse aynı olan bir kopyasını oluşturun. Eski koleksiyonun yeni koleksiyon için değiştirilebilmesi için bir yerde koleksiyona referans olması gerekir!
Brendan

Yanıtlar:


17

Asıl soru İşletme'de FP kullanılabilir mi? ama Enteprise'da FP kullanmalı mıyız?

Tabi ki yapabilirsin. Herhangi bir programlama dili ile her türlü uygulamayı geliştirebilirsiniz, bu yüzden bunlara "Turing tamamlandı" denir.

Şimdi, "İşletmede kullanılmalı mı?" Bu size veya işverenlerinize bağlıdır, FP bazı uygulamalarda gerçekten yararlı olabilir ve aslında oldukça fazla kullanılır: Sektörde Haskell

Şimdi, "Peki neden daha fazla kullanılmıyor?" temel olarak diğer Emir / OO dilleri daha yaygındır ve şirketler Java veya C ++ için kullanıldıkları için daha "egzotik" bir dile geçmeyi reddederler.


7
You can develop any kind of application with any kind of programming languageBu çok zayıf bir argüman, Turing brandalarına dikkat edin ...
yannis

5
@YannisRizos Bence sorunun her tanjantını keşfetmek yerine tam bir cevap uğruna genelleme yapıyordu.
Johnny Rotten

2
@YannisRizos !=isteyebilir

1
Bazen bana, dilin bazı Kurumsal çözümler için Turing'i tamamlamaması gerektiğini hissediyorum ...
shabunc

2
Bu, işverenlerinize göre değil, diller söz konusu olduğunda, teknik bakış açımızdan en iyi gördüğümüz şeyi ileri sürmenin mühendislerin kendilerine bağlı olduğunu iddia ediyorum.
shmish111

11

FP dillerini birkaç yıl önce (Haskell, Scala, Scheme) öğrenmeye başladım ve uzman olmaktan uzak olmamamla birlikte, C ++ veya Java'dan daha fazla belirli görevler için beni son derece üretken hale getirebileceklerini öğrendim .

IMO, FP dillerinin bazı güçlü yanları:

  • Çok özlü olma eğilimindedirler, ancak açık bir semantiği korurlar.
  • Bildirici bir stil kullanabilir ve uygulama ayrıntıları hakkında çok fazla düşünmenize gerek yoktur.
  • Haskell's gibi zengin bir tür sistemi çok mantıklı hataları çok erken yakalayabilir (derleme zamanında). Bildiğim kadarıyla (aslında değil), SML ve Ocaml benzer avantajlar sunuyor.

Şimdiye kadar, FP paradigmasına geçişi oldukça heyecan verici buldum ve üzerinde yeterince zaman harcadığınızda çok zor değil. (Ama C veya C ++ öğrenmek için ne kadar zaman harcadım?

Bu yüzden teknik açıdan bakıldığında, işlevsel bir programlama dili kullanarak tam bir kurumsal uygulama geliştirmenin çok mantıklı olduğunu düşünüyorum.

Ne yazık ki bu paradigma ana akım değildir: çoğu şirket sadece iyi test edilmiş teknolojileri benimseme eğilimindedir, bu yüzden aslında işe yaradığına, yeterli geliştirici, araç, kütüphane, çerçeve olduğuna dair yeterli kanıt elde edene kadar FP'den uzak kalacaktır. Bu nedenle, FP programlamasını tam olarak yapabileceğiniz bir iş bulmak çok daha zordur.

Çok çekirdekli işlemcilerin artan kullanımı, eşzamanlı yazılım yazmak için oldukça güçlü görünen FP dillerine daha fazla yatırım yapılmasını teşvik ederse, mevcut durum değişecektir.

Ayrıca, programcıların tam bir paradigma anahtarına ihtiyaç duymadan bazı FP'leri kullanabilmeleri için C #, C ++ gibi ana akım, işlevsel olmayan dillere bazı FP özelliklerini ekleme eğilimi vardır. Belki on yıl sonra bu diller, tamamen işlevsel bir dile geçişin çok daha kolay olacağı kadar FP özelliklerini kapsayacak.


10

Mutlaka en iyi fikir olduğunu sanmıyorum. Ancak, belirli uygulamanın niteliğine bağlıdır.

Eric Evans'ın felsefesinde, Domain-Driven Design adlı kitabında anlatıldığı gibi , probleminizi çözmenize yardımcı olabilecek sorunu temsil eden bir etki alanı modeli yapmanız gerektiğine inanıyorum. Evans, elindeki belirli problemle birlikte uyan bir programlama dili bulmanızı önerir, örneğin Fortran'dan matematiksel nitelikteki problemleri çözmenin bir yolu olarak bahseder. Ya da eldeki sorun için özel Alana Özel Diller oluşturabilirsiniz.

İyi bir etki alanı modeli oluşturmayı başardığınızda, sunum kodunun etki alanı katmanının üstünde ince bir kabuk olduğunu görürsünüz.

Artık kurumsal uygulama ile ilgili olan şey, bu tür bir uygulamanın (kurumsal uygulamalar hakkında genelleme yapabiliyorsanız) genellikle kimliğinin önemli olduğu varlıkların durumunu değiştirmeyi ve değiştirilen varlıkları bir veritabanında ısrar etmeyi içermesidir. Bu çok genelleştirilmiş problem, işlevsel bir modelden ziyade nesneye yönelik model kullanılarak daha iyi çözülmüş IMHO'dur.

Bu, bir kurumsal uygulamanın işlevsel bir paradigma tarafından daha iyi çözülemeyen alanları olduğu anlamına gelmez. Örneğin, bir bankacılık uygulamasının bir risk analizi modülü veya bir gönderim uygulamasındaki bir rota planlama modülü. Ve belki de bazı kurumsal uygulamalar tamamen işlevsel bir paradigma kullanılarak uygulanabilir.

Ancak genel olarak, nesne yönelimli paradigmanın kurumsal uygulamaların çoğu için daha yararlı etki alanı modelleri oluşturmaya izin verdiğini düşünüyorum.

Düzenle

Bazı artışlar nedeniyle, dikkatim bu cevaba çekildi - ve yazdığımdan beri FP hakkında çok daha fazla şey öğrendim - ve artık kendi cevabımı kabul ettiğimden tam olarak emin değilim. Bazı işlevsel diller kullanım durumlarını çok güzel bir şekilde tanımlayabilir. Ama tamamen farklı bir zihin seti öğrenmelisin.


2
+1: Çok iyi ve teşvik edici bir cevap. FP hakkındaki sınırlı bilgim nedeniyle bunun doğru olup olmadığından emin değilim, ancak kalıcı nesnelerin monadlar veya benzersiz tipler (Temiz) içinde modellenebileceğini düşünüyorum: bu şekilde bir değer bir kimlik alabilir, programınızın etrafından geçirilebilir ve farklı işlevlerle dönüştürülmüş. Ama bunu desteklemek için gerçekten bir FP uzmanının görüşüne ihtiyacım var.
Giorgio

3

Evet yapabilir. Google biraz ve saf fonksiyonel dillerde kodlanmış gerçek yazılım bulacaksınız.

İş nesneleriyle ilgili sorunuza gelince, asıl sorununuz değişmezlikle ilgili. Bu durumda, zorunlu bir dil kullanıyorsanız her değiştirdiğinizde yeni bir "Kişi" döndürdüğünüzü düşünün.

Bu tekniğin zorunlu diller kullanılarak da uygulanabileceğini unutmayın!


3

Nesne Tabanlı Programlama (OOP) gibi Fonksiyon Programlama (FP) paradigmalardır. Programlama problemlerine farklı kalıpları veya yaklaşımları temsil ederler. Bu farklı yaklaşımlar ölçeklenebilir, bakımı ve genişletilebilir yazılım üretme yeteneğini ortadan kaldırmaz. Bu, yaklaşımların tüm problem türleri için eşdeğer olduğu anlamına gelmez; değiller. Bazı problemler kendilerini belirli paradigmalarla daha iyi (veya daha kötü) hizalar, örneğin FP, yan etkileri olan bağımlı bir işlem dizisine sahip bir program için ilk tercihim olmazdı. Ancak bu tür programlar yazılabilir ve iyi yazılabilir.


3

Evet, FP kurumsal uygulamalarda kullanılabilir. Clojure, kuruluşta başarılı olan bir FP diline bir örnektir: http://cognitect.com/clojure#successstories

Devleti temsil etmek FP'de bir zorluk olabilir ve FP'ye uyacak paradigmaları değiştirmek biraz zihinsel bir çözgü olabilir. Bazı FP dilleri, yan etkilere ve değişebilir duruma tamamen izin vermez. Clojure, bu paradigmaları hem caydırır hem de izole eder.

Kısacası, devlet temsili OO'ya çok benzer olabilir. Çok farklı olan durum değişikliği. Örneğin, FP durumunda listeler ve haritalar ile temsil edilebilir. Çalışanların listesi şöyle görünebilir:

[[name: "James Brown" address: "Barnwell, SC"]
 [name: "Elvis Presley" address: "Tupelo, MS"]]

FP'de durum değişikliğini ele almanın iki yolu var. Bunlardan biri işlevsel reaktif programlama gibi bir şey. Bu paradigmada tüm durum yalnızca en üst düzeyde ele alınır ... örneğin, uygulamanızın HTML görünümünde görünümde durum vardır (kişinin adı, adresi vb.). "Güncelleme adı" nı tıkladığınızda, aslında adı değiştirmek dışında bir ad güncellemesiyle ilgili her şeyi işleyen bir işlev çağrılır. Kulağa garip gelebilir ... ama bana katlan. Değiştirilen ad daha sonra işlev tarafından döndürülür ve görünüm (veya kalıcı veri deposu vb.) Yeni adı gösterir. Alternatif olarak, güncellenmiş ada sahip yeni bir yapının tamamı döndürülür. Peki fonksiyon ne yapıyor? Adı doğrular ve geçerliyse yeni adı, değilse bir hatayı döndürür, ve muhtemelen takip edilecek yeni bir görünüm veya gezinme bağlantısı. Bir isim değişikliğinden daha karmaşık bir şey için çok daha fazlasını yapabilir.

Bu nedenle, FRP için işlev tarafından döndürülen nesne yeni durumdur ve doğrudan görünüme veya yüksek düzeyde olan her şeye verilebilir. Bazı durumlarda FRP bütün durumu fonksiyona aktarır ve bütün durumu geri alır.

Bu paradigma ile, kapsayıcı veya çerçevenin ekranın, veritabanının veya yeni durumdan güncellenmesi gereken her şeyin güncellenmesi gerekir. Böylece uygulamayı ekrana çizen bir çerçeve hayal edebilirsiniz. Bir kullanıcı tıkladığında işlevler çağrılır ve yeni durum döndürülür. Çerçeve daha sonra her şeyi yeniden çizerek veya ekranın bazı bölümlerini akıllıca yeniden çizerek ekranı günceller. Bkz. Http://blog.getprismatic.com/om-sweet-om-high-functional-frontend-engineering-with-clojurescript-and-react/

Clojure, karşılaştığım ikinci paradigmayı kullanıyor ve bu da devlet değişikliklerini izole etmek, ancak onları en üst düzeyde sınırlamak zorunda değil. Clojure ile tüm değiştirilebilir durum bir atom, aracı veya referans tarafından "tutulmalıdır" (durum için Java nesneleri kullanmıyorsanız). Bunun çalışma şekli, atom / agent / ref tarafından tutulan veya gösterilen veya referans verilen (ancak çağırmak istediğiniz) nesnenin değişmez olmasıdır, ancak atom / agent / ref, yeni bir nesneyi gösterecek şekilde değişebilir. Bu durumda, atom / agent / ref üzerinde "nesneyi burada yaparak bunu güncelleyin ve atom / agent / ref'yi yeni bir nesneye yeniden atayarak" diyen özel yöntemler kullanırsınız.

Bu sorabileceğiniz neden faydalı? Bu Clojure yapıları tarafından başvurulan değişmez nesne, bir şey yapan bir işleve geçirilebileceğinden ve bu işlev çalışırken nesneye olan başvurusunun değişmemesi garanti edilir. Yani, atom / ajan / ref işleve geçirilmez, ancak işaret ettikleri değişmez nesne geçirilir. Atomlar, aracılar ve referanslar, güncellemeleri ve eşzamanlılığı güvenli ve dilin bir parçası olarak ele alan özel özelliklere sahiptir. Bkz. Http://clojure.org/state

Umarım bu yardımcı olur. Çalışanların ve kişilerin FP'de nasıl temsil edilebileceğinin daha iyi anlaşılması için Clojure durumu ve FRP hakkında daha fazla bilgi almanızı öneririm. Yine de, gerçek temsil nesne yönelimli programlamaya benzer olacaktır ... bu gerçekten farklı olan değişebilirliktir.

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.