İşlevsel programlama tasarım kalıpları nerede? [kapalı]


75

OO programlama literatürü tasarım desenleriyle doludur. Nesne yönelimli programlamaya ilişkin kitapların çoğu, fabrikalar ve dekoratörler gibi kalıplar tasarlamak için bir ya da iki bölümü ayırır. Öyleyse, işlevsel dillerde eşdeğer kalıplar nelerdir ve neden onlar hakkında henüz bir kitap yazmadı? Tasarım kalıplarına olan ihtiyacı ortadan kaldıran işlevsel diller hakkında özel bir şey var mı?


6
Kesinlikle işlevsel tasarım desenleri var - örneğin hatıraları veya monadları almak - Merak ediyorum da birisinin onları bir yerde toplayıp
toplamadığını

2
FinnNk Monad, bir tasarım modelinden çok bir tür sınıftır ^ _ ^
alternatif



1
Harita azaltma birdir. İyi bir kalıp listesi olmadığını hayal kırıklığına
uğrattım

Yanıtlar:


47

OO ve fonksiyonel programlama iki farklı programlama paradigmasıdır ve tasarım kalıpları (DP) OO tasarım ve programlamasının önemli bir parçasıdır. DP'nin işlevsel programlamada böyle bir rolü yoktur.

Birisi, DP'nin fonksiyonel programlamada gerekli olmadığını söyleyebilir - DP'nin tedavi ettiği kaşıntı yoktur.


41
Tasarım modellerinin FP için geçerli olmadığını kabul edeceğime emin değilim. FP hala, özellikle ortak yollardan çözülen ortak problemleri sunar. OO'da çözülenlere göre farklı sorunlar, ancak yine de sorunlar. Sanırım FP şu anda ticari dünyada daha az yaygın olduğundan, muhtemelen OO'dan çok daha az dikkat edilen bir şey olduğunu düşünüyorum.
d11wtq

22
Tasarım modelinin işlevsel programlamada bulunmadığını iddia etmek yanlış bilgidir. En kolay karşı örnek, monad. Monad'ı işlevsel programlamada kullanmanız gerekmez, ancak insanların saf fonksiyon programlamanın uygulanmasını kolaylaştırmak için takip ettiği çok yaygın bir kalıptır. Bu, özünde tasarım modelinin tanımıdır.
voidvector

3
Tasarım desenleri ister programlama ister ev tasarımı olsun, tüm tasarım faaliyetlerine uygulanır. Aslında, kalıp dillerinin kavramları mimarlıktan gelir: en.wikipedia.org/wiki/A_Pattern_Language .
BobDalgleish

2
Hmm. Gözlemlenebilir akışlar, Demiryolu Doğrulama ve cehennem, hemen hemen her monad bir tasarım deseni, değil mi?
Chet

2
@voidvector Monad'ler sadece bir tasarım deseni değildir. FP'de monadlar tip sistemleri arasında işlevler olarak kullanılır ve kavramın kendisi bir matematik dalı olan Kategori Teorisinden gelir. Genel olarak cebirsel yapılar arasındaki belirli bir ilişkiyi tanımlamak için kullanılırlar. İşlevsel programlamanın matematikte programlamada kullanılmasını kolaylaştıran bir tasarım aracı olduğunu söylemek daha doğru olacaktır.
John Cramerus


13

Basit gerçek şu ki, birçok OO Paterninin işlevsel dillerde (özellikle orijinal GoF paternlerinde) Deyimler olarak kabul edilmesi gerekir. Örneğin, sıralı işleçleri olan bir Lisp ya da ML'de tekrarlayıcı deseni (şimdi C # gibi dillere yerleşik).

OO sistemlerinde kullandığımız kalıpların birçoğu, "gerekli olmayanları" ortadan kaldırmamıza yardımcı olmak için orada bulunuyor, böylece kodlama nesnelerine odaklanabiliyoruz. Başka bir deyişle, desenler uygulamanın ilginç olmayan kısımlarına yönelik çözümlerdir. Daha önce çözülmüş olan ortak ihtiyaçları karşılamak için kalıplardan faydalanmalıyız (veri tabanı aktarımı ya da ünite testinizi artırmak için xUnit Kalıpları gibi), birim değerinizi arttırmak için xUnit Kalıpları gibi. uygulama için.

GoF kalıplarının özelliklerinin ötesinde, işlevsel programlamaya da uygulanabilecek tasarım kalıpları olduğuna eminim. Mesele şu ki, OO baskın paradigmadır. İşlevsel geliştiricileri hedef alan bir desen kitabı yazmak ... açıkçası bir yayıncıdan yeşil bir ışık alamayacak. Bu aşağı kaynıyor. İşlevsel Desenler için konuyla ilgili çok sayıda kitabın olması için yeterli bir pazar bulunmamaktadır.


9

Stuart Sierra'nın bu konuyla ilgili iyi bir konuşma (~ 45 dk):

http://www.infoq.com/presentations/Clojure-Design-Patterns

Her zaman bağlayıcı ve yetkili değil, ancak veri analizi için FP kullanarak kendi deneyimlerimden birkaç örneğini tanıdım.

Clojure'da yazılmış, ancak muhtemelen herhangi bir FP diline uygulanabilir örnekler. Üstünü örttüğü kalıplara verdiği isimler:

  • Devlet / Etkinlik
  • sonuçlar
  • akümülatör
  • Kombine / azaltın
  • Özyinelemeli Genişleme
  • Boru hattı
  • sarıcı
  • Jeton
  • Gözlemci
  • strateji

6

Tasarım kalıplarını öğrenmekle gerçekten ilgileniyorsanız Haskell'den başkasına bakmayın. Eğer için zaman ayırın dilini zor yoldan öğrenmek içine çalıştırmak ve temel desen en rahat alırsınız - bunlar dile pişmiş ediyoruz.

Monadları atlamayın. Dışarıda bir sürü uzun soluklu açıklamalar var ve fikirlerin batması için bazı şeyler yapmak gerekiyor, ancak takılmaya devam ederseniz, sonunda size şafak verecek ve ne kadar tasarım deseninin olabileceğine şaşıracaksınız. Bu soyutlama / arabirim üzerine inşa.

Haskell'i yakaladığınızda, tehlikede olması için emrinizde yeterince FP cephaneliği olacak. Demek istediğim, elde edene kadar devam et. Kısayol yok.


-3

FP için tasarım metodolojisi, problem alanını doğru şekilde yansıtacak şekilde tiplerinizi tasarlamak ve uygulamanın otomatik olarak takip etmesi gerektiği için, tasarım desenleri üzerine bir kitabın FP eşdeğeri, Chris Okasaki'nin Tamamen İşlevsel Veri Yapıları gibi bir şeydir .


1
Okasaki'nin kitabı, çok sayıda veri yapısının veri yapısı kısmına eşdeğerdir ve genellikle yalnızca değişken veri yapısını göz önünde bulunduran algoritmalar kitaplarıdır.
AProgrammer

1
Veri yapılarını tasarım desenleriyle eşitlemek, tasarıya uygun olduğunu sanmıyorum. OO programcıları uygun sınıf tanımları ortaya çıkana kadar kollarını fırlatıyor gibi değil.
davidk01

Evet, Okasaki'nin kitabı tasarım modellerinden daha düşük bir seviyede.
FinnNk,
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.