Fonksiyonel programlama için bir yazılım mühendisliği metodolojisi var mı? [kapalı]


203

Yazılım Mühendisliği bugün öğretildiği şekliyle, tamamen nesne yönelimli programlamaya ve dünyanın 'doğal' nesne yönelimli görünümüne odaklanmaktadır. Bir etki alanı modelinin çeşitli adımlarla bir sınıf modeline nasıl dönüştürüleceğini ve kullanım-durum diyagramları veya sınıf diyagramları gibi çok sayıda (UML) yapay nesneyi nasıl açıklayacağınızı açıklayan ayrıntılı bir yöntem vardır. Birçok programcı bu yaklaşımı içselleştirmiştir ve sıfırdan nesne yönelimli bir uygulamanın nasıl tasarlanacağı konusunda iyi bir fikre sahiptir.

Yeni hype, birçok kitap ve öğreticide öğretilen fonksiyonel programlamadır. Peki ya fonksiyonel yazılım mühendisliği? Lisp ve Clojure hakkında okurken, iki ilginç ifade geldi:

  1. Fonksiyonel programlar genellikle yukarıdan aşağıya yerine aşağıdan yukarıya doğru geliştirilir ('On Lisp', Paul Graham)

  2. Fonksiyonel Programcılar, OO-Programmerlerin nesneleri / sınıfları ('Java Programcılar için Clojure', Rich Hickley tarafından konuşulur) kullandığı Haritalar'ı kullanır.

Peki işlevsel bir uygulamanın sistematik (model tabanlı?) Tasarımının metodolojisi nedir, örneğin Lisp veya Clojure? Ortak adımlar nelerdir, hangi eserleri kullanıyorum, bunları problem alanından çözüm alanına nasıl eşlerim?


3
Burada bir yorumum var: birçok program yukarıdan aşağıya yazılmıştır, işlevsel bir dilde yazılım geliştirme sürecine pratik bir açıklama "Eşzamanlı Temizlikte Fonksiyonel Programlama" (dilin kendisi çok akademik, rağmen).
Artyom Shalkhakov

4
1. Parnas, çoğu programın aşağıdan yukarıya doğru ve sonra yukarıdan aşağıya gibi görünmesi için sahte olduğunu savunur, bu nedenle bu yaklaşımlar karıştırılmalıdır, doğru cevap yoktur.
Gabriel Ščerbák

2
2. Nesneler kapsüllenmiş yapılandırılmış durumlarına bağlı olarak davranış sağlar, FP'de tüm durum ve yapı açıktır ve davranış (işlevler) yapıdan ayrılır. Bu nedenle, veri modelleme için nesneler için haritalar kullanırsınız, ancak uygulamaları tasarlarken nesneler işlevlerle değiştirilemez - FP, boru hatları aracılığıyla oluşturulan ve değerlendirilen büyük bir ifadedir, OOP, modeli oluşturmak ve nesneler arasında mesaj göndermekle ilgilidir.
Gabriel Ščerbák

1
Bir zamanlar ilgili bir soru sordum: " Clojure'daki ilişkisel veritabanlarından bir model veri nasıl ?" stackoverflow.com/questions/3067261/…
Sandeep

4
Hehe, SICP derslerinde Hal Abelson, yarısında jestle, "Ünlü bir metodoloji var mı, yoksa mitoloji demeliyim ki, karmaşık mühendislik ve gereksinimler yapan ve ... onlarla birlikte sistemleri, bu insanlar çok fazla programlamamışlar ". Yaşları boyunca UML ve eserler ve şeyler öğrettiğimiz bir "Java Okulu" ndan geliyorum ve biraz iyi olsa da, çok fazla planlama ve şema (pun amaçlı) faydalı olmaktan daha zararlı: yazılım aslında kod almak kadar olacak.
lfborjas

Yanıtlar:


165

Şükürler olsun ki, yazılım mühendisliği insanları henüz fonksiyonel programlamayı keşfetmediler. İşte bazı paralellikler:

  • Birçok OO "tasarım deseni" daha üst düzey işlevler olarak yakalanır. Örneğin, Ziyaretçi modeli işlevsel dünyada "kıvrım" olarak bilinir (ya da sivri başlı bir teorisyenseniz, bir "katamorfizm"). İşlevsel dillerde, veri türleri çoğunlukla ağaç veya tuple'dir ve her ağaç türünün kendisiyle ilişkili doğal bir katamorfizması vardır.

    Bu üst düzey işlevler genellikle "serbest teoremler" gibi belirli programlama yasalarıyla birlikte gelir.

  • Fonksiyonel programcılar diyagramları OO programcılarına göre çok daha az kullanırlar. OO diyagramlarında ifade edilenlerin çoğu bunun yerine türlerde veya "modül türleri" olarak düşünmeniz gereken "imzalarda" ifade edilir . Haskell ayrıca bir arayüz tipine benzeyen "tip sınıflarına" sahiptir.

    Türleri kullanan işlevsel programcılar genellikle "türler doğru olduğunda; kod pratikte kendini yazar" diye düşünür.

    Tüm işlevsel diller açık türleri kullanmaz, ancak Scheme / Lisp / Clojure öğrenmek için mükemmel bir kitap olan Nasıl Yapılır Programları kitabı, türlerle yakından ilişkili olan "veri açıklamalarına" dayanır.

Peki işlevsel bir uygulamanın sistematik (model tabanlı?) Tasarımının metodolojisi nedir, örneğin Lisp veya Clojure?

Veri soyutlamaya dayanan herhangi bir tasarım yöntemi iyi çalışır. Dilin açık türleri olduğunda bunun daha kolay olduğunu düşünüyorum, ama onsuz da çalışıyor. Fonksiyonel programlamaya kolayca adapte edilebilen soyut veri türleri için tasarım yöntemleri hakkında iyi bir kitap , ilk baskı Barbara Liskov ve John Guttag tarafından Program Geliştirmede Soyutlama ve Spesifikasyon'dur . Liskov kısmen bu iş için Turing ödülünü kazandı.

Lisp'e özgü bir başka tasarım metodolojisi, çalıştığınız sorun alanında hangi dil uzantılarının yararlı olacağına karar vermek ve daha sonra bu yapıları dilinize eklemek için hijyenik makrolar kullanmaktır. Bu tür bir tasarım hakkında okumak için iyi bir yer, Matthew Flatt'un Rakette Dil Oluşturma makalesidir . Makale bir ödeme duvarının arkasında olabilir. "Etki alanına özgü gömülü dil" terimini arayarak bu tür tasarım hakkında daha genel materyaller de bulabilirsiniz; Matthew Flatt'un kapsadığı şeyin ötesinde özel tavsiyeler ve örnekler için, muhtemelen Graham'ın On Lisp veya belki de ANSI Ortak Lisp ile başlayacağım .

Ortak adımlar nelerdir, hangi eserleri kullanıyorum?

Ortak adımlar:

  1. Programınızdaki verileri ve üzerindeki işlemleri belirleyin ve bu verileri temsil eden soyut bir veri türü tanımlayın.

  2. Sık kullanılan eylemleri veya hesaplama modellerini tanımlayın ve bunları üst düzey işlevler veya makrolar olarak ifade edin. Yeniden düzenleme sürecinin bir parçası olarak bu adımı atmayı bekleyin.

  3. Yazılı bir işlevsel dil kullanıyorsanız, tür denetleyicisini erken ve sık kullanın. Lisp veya Clojure kullanıyorsanız, en iyi uygulama önce birim testleri de dahil olmak üzere işlev sözleşmeleri yazmaktır - bu test maks. Ve QuickCheck'in platformunuza taşınan herhangi bir sürümünü kullanmak isteyeceksiniz, ki bu durumda ClojureCheck olarak adlandırılıyor . Üst düzey işlevleri kullanan rastgele kod testleri oluşturmak için son derece güçlü bir kitaplıktır.


2
IMO ziyaretçisi katlanmamış - katlama ziyaretçinin bir alt kümesidir. Çoklu gönderim (doğrudan) katlama tarafından yakalanmaz.
Michael Ekstrand

6
@Michael - aslında çeşitli yüksek dereceli katamorfizmlerle çok sayıda gönderiyi çok düzgün bir şekilde yakalayabilirsiniz. Jeremy Gibbons'ın çalışması bunu aramak için bir yer, ama genel olarak veri tipi-jenerik programlama üzerinde çalışmanızı tavsiye ederim - özellikle kompozit kağıda düşkünüm.
sclv

6
Fonksiyonel tasarımları tanımlamak için diyagramların daha az kullanıldığını kabul ediyorum ve bence bu bir utanç. Çok fazla HOF kullanılırken bir dizi diyagramının eşdeğerini temsil etmek kuşkusuz zordur. Ama keşke fonksiyonel tasarımların resimlerle nasıl tanımlanacağı alanı daha iyi araştırılıyordu. UML'den (spesifikasyon olarak) nefret ettiğim kadar, UML'nin (çizim olarak) Java'da oldukça yararlı olduğunu ve eşdeğerini nasıl yapacağınıza dair en iyi uygulamalar olmasını diliyorum. Clojure protokolleri ve kayıtları ile bunu biraz deniyorum, ama gerçekten sevdiğim bir şey yok.
Alex Miller

22
+1, şükürler olsun ki, yazılım mühendisliği insanları henüz işlevsel programlamayı keşfetmediler. ;)
Aky

1
OO, türlerle programlamaya çalışmanın bir yoludur, bu yüzden yaklaşımlar çok farklı değildir. OO tasarımlarıyla ilgili sorun genellikle ne yaptığını bilmeyen insanlardan kaynaklanıyor gibi görünüyor.
Marcin

46

Clojure için eski iyi ilişkisel modellemeye geri dönmenizi tavsiye ederim. Tarpit dışında ilham verici bir okuma.


Bu harika bir makale, tüm bu kavramlar bugünün rönesansına kadar hayatta kaldığında, Bilgisayar Bilimi'nde eski güzel zamanların gerçekten etkileyici derecede iyi olması gerekiyordu. Muhtemelen matematikteki güçlü temellerden kaynaklanmaktadır.
Thorsten

1
Bu. BU. BU! Bu makaleyi okuyorum ve minimum kontrol edilebilir bir şekilde minimum değiştirilebilir durumu korurken, gerçek sistemler oluşturmak için gereken tüm temelleri nasıl kapsadığı gerçekten ilginç. Bir FRelP tarzında Pong ve Tetris oluşturmakla oynuyorum (garip başlangıççılığın bahane, ama daha popüler bir FRP: Fonksiyonel Reaktif Programlama var).
John Cromartie

Makaleyi okuduktan sonra, clojure'un FR (el) P için, en azından gerekli mantık , kazara durum ve kontrol ve diğer bileşenler için mükemmel bir dil olacağını düşünüyorum . Ben (kusurları olmadan) sql yeniden icat etmeden clojure temel durum ilişkisel bir tanım yapmak nasıl acaba ? Yoksa sadece iyi bir ilişkisel (sql) DB kullanma ve OOP tarafından getirilen kavramsal uyumsuzluk olmadan üzerine fonksiyonel bir program inşa etmek fikri mi?
Thorsten

1
@ Temel fikir ayarlandı = tablo, harita = dizin. Zor bölüm dizinleri ve tabloları senkronize tutmak ama bu sorun daha iyi ayarlanmış tiplerle çözülebilir. Uyguladığım basit bir set tipi, tekliği test etmek için bir anahtar fonksiyon kullanan bir set olan anahtarlı settir. Bu, birincil anahtar alanlarıyla get çağrılması çağrıldığında bir değer ekleme veya güncellemenin konulması tüm satırı döndüreceği anlamına gelir.
cgrand


38

Kişisel olarak, OO geliştirmenin tüm olağan iyi uygulamalarının fonksiyonel programlamada da geçerli olduğunu görüyorum - sadece fonksiyonel dünya görüşünü dikkate almak için birkaç küçük değişiklikle. Metodoloji açısından bakıldığında, temelde farklı bir şey yapmanıza gerek yoktur.

Deneyimlerim son yıllarda Java'dan Clojure'a geçmekten geliyor.

Bazı örnekler:

  • İş etki alanınızı / veri modelinizi anlayın - bir nesne modeli tasarlayacak veya iç içe haritalarla işlevsel bir veri yapısı oluşturacak olmanız aynı derecede önemlidir. Bazı açılardan, FP daha kolay olabilir çünkü veri modelini fonksiyonlardan / süreçlerden ayrı düşünmeye teşvik eder, ancak yine de her ikisini de yapmanız gerekir.

  • Tasarımda servis yönelimi - aslında bir FP perspektifinden çok iyi çalışır, çünkü tipik bir hizmet gerçekten sadece bazı yan etkilere sahip bir işlevdir. Ben Lisp dünyasında bazen benimsenen yazılım geliştirme "aşağıdan yukarıya" görüş aslında başka bir kisvede sadece iyi hizmet odaklı API tasarım ilkeleri olduğunu düşünüyorum.

  • Test Odaklı Geliştirme - FP dillerinde iyi çalışır, aslında bazen daha da iyidir, çünkü saf işlevler, durumlu bir ortam kurmaya gerek kalmadan net, tekrarlanabilir testler yazmak için kendilerini çok iyi bir şekilde verir. Ayrıca veri bütünlüğünü kontrol etmek için ayrı testler de yapmak isteyebilirsiniz (örneğin, bu haritada beklediğim tüm anahtarlar var mı, OO dilinde sınıf tanımının bunu derleme zamanında sizin için zorlayacağı gerçeğini dengelemek için).

  • Prototipleme / yineleme - FP ile de çalışır. Araçlar / DSL oluşturma ve bunları REPL'de kullanma konusunda son derece iyi olursanız, kullanıcılarla canlı prototip oluşturabilirsiniz.


3
Bu uygulamalar bana oldukça tanıdık geliyor. Ben hala birisinin altıncı "Clojure'da Programlama" kitabı yerine Bruegge / Dutoit tarafından "UML, Desenler ve Java kullanarak Nesneye Yönelik Yazılım Mühendisliği" nin işlevsel eşdeğerini yazması gerektiğini düşünüyorum. "Clojure kullanarak Fonksiyonel Yazılım Mühendisliği ve ?? ne ??" olarak adlandırılabilir. FP'de UML ve kalıp kullanıyorlar mı? Paul Graham'ın desenlerin Lisp'te yeni makroların getirilmesiyle giderilmesi gereken soyutlama eksikliğinin bir işareti olduğunu yazdığını hatırlıyorum.
Thorsten

3
Ancak kalıpları en iyi uygulamalar olarak çevirirseniz, FP dünyasında da başlatılmamışlarla paylaşılmaya değer kalıplar olabilir.
Thorsten

2
PAIP kitabında bazı ilgi çekici ilke tasarımı var. norvig.com/paip.html
mathk

1
ayrıca fonksiyonel programlama modelleri (özyineleme şemaları vb.) vardır
Gabriel Ščerbák

13

OO programlama, verileri davranışla sıkıca birleştirir. Fonksiyonel programlama ikisini birbirinden ayırır. Sınıf diyagramlarınız yok, ancak veri yapılarınız var ve özellikle cebirsel veri türleriniz var. Bu türler, inşaat yoluyla imkansız değerlerin ortadan kaldırılması da dahil olmak üzere alan adınıza çok sıkı uyması için yazılabilir.

Yani üzerinde kitap ve kitap yok, ama deyişle, imkansız değerleri temsil edilemez kılmak için iyi kurulmuş bir yaklaşım var.

Bunu yaparken, belirli veri türlerini işlevler olarak temsil etme ve bunun yerine belirli işlevleri veri türleri birliği olarak temsil etme hakkında bir dizi seçenek yapabilirsiniz, böylece seri hale getirme, daha sıkı belirtim, optimizasyon vb. .

Daha sonra, bir tür cebir oluşturacak şekilde reklamlarınız üzerine işlevler yazarsınız - yani bu işlevler için sabit yasalar vardır. Bazıları belki idempotenttir - birden fazla uygulamadan sonra aynı. Bazıları çağrışımsaldır. Bazıları geçişlidir, vb.

Artık, üzerinde iyi davranmış yasalara göre oluşturulan işlevlere sahip olduğunuz bir alanınız var. Basit bir gömülü DSL!

Oh, ve verilen özellikler, elbette bunların otomatik rastgele testlerini yazabilirsiniz (ala QuickCheck) .. ve bu sadece başlangıç.


1
İmkansız değerleri temsil edilemez hale getirme yaklaşımı, Clojure ve Scheme gibi dinamik yazımı olan diller için Haskell ve ML gibi statik yazımı olan diller için daha az uygulanabilirdir.
Zak

@Zak - Eh, temsil edilemez olduklarını statik olarak kontrol edemezsiniz, ancak veri yapılarınızı yine de aynı şekilde oluşturabilirsiniz.
sclv

7

Nesneye Dayalı tasarım, yazılım mühendisliğiyle aynı şey değildir. Yazılım mühendisliği, gereksinimlerden çalışan bir sisteme zamanında ve düşük hata oranına nasıl geçtiğimizle ilgili tüm süreçle ilgilidir. İşlevsel programlama OO'dan farklı olabilir, ancak gereksinimler, üst düzey ve ayrıntılı tasarımlar, doğrulama ve test, yazılım metrikleri, tahmin ve diğer tüm "yazılım mühendisliği" leri ortadan kaldırmaz.

Ayrıca, fonksiyonel programlar modülerlik ve diğer yapılar sergiler. Detaylı tasarımlarınız bu yapıdaki kavramlar cinsinden ifade edilmelidir.


5

Bir yaklaşım, seçilen işlevsel programlama dilinde dahili bir DSL oluşturmaktır. Bu durumda "model" DSL'de ifade edilen iş kuralları kümesidir.


1
Kodda artık tekrar eden kalıpların oluşmadığından soyutlama düzeyine ulaşılıncaya kadar problem alanına doğru dili inşa etme yaklaşımını anlıyorum, bu soyutlamalarla ilgili sorunu çözmek yerine.
Thorsten

1
Ancak "model DSL'de ifade edilen bir dizi iş kuralı olduğunda" nasıl görünür? Bir Java EE uygulamasında, model POJO-Entities olarak yazılır, bunlar da kontrolör-EJB'lerden çağrılır ve bu da view-JSP'leri günceller - örneğin. FP'de benzer mimari desenler var mı (MVC kalıbı gibi)? Bu nasıl görünüyor?
Thorsten

2
FP'de tam olarak böyle bir MVC kalıbına sahip olmanız için hiçbir neden yoktur. FP hala zengin veri yapıları oluşturmanıza izin verir ve tartışmalı olarak ADT'ler ve desen eşleşmesi ile çok daha zengin yapılar oluşturmanızı sağlar . FP veri ve davranışı birbirinden ayırdığı için MVC tipi sistemler çok daha doğal bir şekilde ortaya çıkar.
sclv

5

Başka bir gönderiye verdiğim cevaba bakın:

Clojure Endişelerin Ayrılmasını Nasıl Yaklaştırıyor?

Bir FP yaklaşımı kullanan büyük uygulamaların nasıl yapılandırılacağı konusunda daha fazla konu yazılması gerektiğine katılıyorum.


3
% 90 boru hattını ve% 10 makro yaklaşımını seviyorum. İşlevsel bir programı değişmez verilerdeki dönüşümlerin bir boru hattı olarak düşünmek oldukça doğal görünmektedir. "Tüm zekayı koda değil veriye koy" ile ne demek istediğimi anladığımdan emin değilim, çünkü 1 veri yapısı üzerinde (10 veri yapısında 10 işlev yerine) 100 işleve sahip olma yaklaşımının ima ettiği anlaşılıyor tersi. OOP'taki veri yapıları, kendi davranışlarına sahip oldukları için FP'den daha akıllı değil mi?
Thorsten

3

Bu naif ve basit kabul edilebilir olsa da, "tasarım tarifleri" (Felleisen ve arkadaşları tarafından HtDP kitabında savunulduğu gibi programlamaya uygulanan problem çözme için sistematik bir yaklaşım ) aradığınıza yakın olacaktır.

İşte birkaç bağlantı:

http://www.northeastern.edu/magazine/0301/programming.html

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.86.8371


Kuzeydoğu sayfasının bağlantısı ölü gibi görünüyor.
James Kingsbery

1
James, haklısın, ve ne yazık ki düzeltmek için orada ne olduğunu hatırlamıyorum. Sadece HtDP yazarlarının Pyret dili yaratmaya devam ettiğini biliyorum (ve muhtemelen, daha önce PLT Şeması olan Racket yerine kullanmak için HtDP'nin 2. baskısını revize ediyorlar).
Artyom Shalkhakov

3

Bu kitabı yakın zamanda buldum: Fonksiyonel ve Reaktif Alan Modellemesi

Sorunuzla mükemmel bir şekilde uyumlu olduğunu düşünüyorum.

Kitap açıklamasından:

İşlevsel ve Reaktif Etki Alanı Modellemesi, etki alanı modelini saf işlevler açısından nasıl düşüneceğinizi ve daha büyük soyutlamalar oluşturmak için bunları nasıl oluşturacağınızı öğretir. Fonksiyonel programlamanın temelleri ile başlayacak ve karmaşık etki alanı modellerini uygulamak için bilmeniz gereken gelişmiş kavramlara ve kalıplara yavaş yavaş ilerleyeceksiniz. Kitap, cebirsel veri türleri, tip sınıfı tabanlı tasarım ve yan etkilerin izolasyonu gibi gelişmiş FP modellerinin modelinizi okunabilirlik ve doğrulanabilirlik için nasıl oluşturabileceğini göstermektedir.


2

Oxford Üniversitesi'nde (İngiltere) Prof. Richard Bird ve Programlama Cebiri grubuyla ilişkili "program hesaplaması" / "hesaplamaya göre tasarım" tarzı vardır, bunun bir metodoloji olduğunu düşünmek için çok fazla getirilmiş olduğunu düşünmüyorum.

Şahsen, AoP grubunun ürettiği işi sevdiğimde, tasarımı bu şekilde kendim uygulayacak disiplini yok. Ancak bu benim eksikliğim ve program hesaplamalarından biri değil.


2

Davranış Odaklı Geliştirme, Clojure ve SBCL'de hızla gelişen kod için doğal bir uyum olarak buldum. BDD'yi işlevsel bir dille kullanmanın asıl tersi, prosedürel dilleri kullanırken genellikle yaptığımdan çok daha ince tane birimi testleri yazma eğiliminde olduğumdur, çünkü problemi daha küçük işlevsellik parçalarına ayırmak için çok daha iyi bir iş yapıyorum.


clojure'da BDD yapmak için kullandığınız araçlar nelerdir?
murtaza52

Midje'yi seviyorum. Güncel ve çok etkileyici. Şuna
Marc

1

Dürüst olmak gerekirse, işlevsel programlar için tasarım tarifleri istiyorsanız, Haskell'in Prelude gibi standart işlev kitaplıklarına bakın. FP'de modeller genellikle daha yüksek dereceli prosedürlerle (işlevler üzerinde çalışan işlevler) kendileri tarafından yakalanır. Dolayısıyla, bir desen görülürse, genellikle bu deseni yakalamak için daha yüksek bir sıra işlevi oluşturulur.

İyi bir örnek fmap. Bu işlev bir işlevi bağımsız değişken olarak alır ve ikinci bağımsız değişkenin tüm "öğelerine" uygular. Functor türü sınıfının bir parçası olduğu için, herhangi bir Functor örneği (liste, grafik vb.) Bu işleve ikinci bir argüman olarak iletilebilir. Bir fonksiyonun ikinci argümanının her elemanına uygulanmasının genel davranışını yakalar.


-7

İyi,

Genellikle birçok Fonksiyonel Programlama Dili üniversitelerde "küçük oyuncak problemleri" için uzun süre kullanılmaktadır.

OOP, "durum" nedeniyle "paralel programlama" ile ilgili zorluklar yaşadığı için artık daha popüler hale geliyor ve Google MapReduce gibi sorun için bazen işlevsel tarz daha iyi.

Ben functioanl adamlar [1.000.000 satır kodundan daha büyük sistemleri uygulamaya çalışın] duvara çarptığında, bazılarının vızıltı kelimelerle yeni yazılım mühendisliği metodolojileri ile geleceğinden eminim :-). Eski soruyu cevaplamalıdırlar: Her bir parçayı birer birer "ısırmak" için sistemi parçalara nasıl bölebiliriz? İşlevsel Stili kullanarak [yinelemeli, inceremental ve evrimsel yolla çalışma].

Fonksiyonel Tarzın Nesneye Dayalı Tarzımızı etkileyeceğinden eminiz. Fonksiyonel Sistemlerden pek çok kavramı “hala” ve OOP dilimize uyarladık.

Ancak bu kadar büyük sistemler için fonksiyonel programlar kullanılacak mı? Soru bu .

Ve kimse böyle büyük sistemleri uygulamadan gerçekçi yöntemlerle gelemez, ellerini kirletmez. Önce ellerinizi kirletmeli sonra çözüm önermelisiniz. "Gerçek ağrı ve kir" olmadan Çözümler-Öneriler "fantezi" olacaktır.


Artık fonksiyonel dillerle yeteri kadar büyük ölçekli sistemler inşa edilmiştir. Olmasa bile, bu hiç bir tartışma değildir.
Svante

Peki, bazılarını adlandırın? Çok az sayıda "Erlang" sistemi biliyorum. [orta boy] Ama Haskel? Clojure? Lisp?
Hippias Minor

Ve bu [büyük sistemler yazmak] asıl argüman. Çünkü bu test vakası. Bu test örneği, eğer bu fonksiyonel tarzın yararlı olduğunu ve gerçek dünyada onunla pratik şeyler yapabileceğimizi göstermektedir.
Hippias Minor

2
Analitik olarak "OOP" olmayan diller hakkında komik olan şey, sık sık "tasarım metodolojileri" nden, kendiniz için düşünmek ve programınızı en uygun şekilde kesmek için, belirli bir modeli kör bir şekilde takip etmek ve onunla yaşamak yerine bürokratik kazan plakası. Üzgünüm, burada 10 puanlık 3 haftalık kurs yok.
Svante

1
İnanmayacağın şeyler gördüm.
Svante
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.