SORU
29 Kasım 2008, CUMARTESİ


Fonksiyonel Programlama GoF Tasarım Desenleri Yerini Tutar Mı?

F öğrenmeye başladığımdan beri# ve geçen sene Bunun, tasarım desenleri (Java, özellikle zorunlu dilde eksik özellikler için geçici çözümler olduğu konusunda ısrar eden makaleler çok sayıda okudum. Bir makale makes a fairly strong claim buldu

Tanıdığım çoğu kişi okumuş Tasarım Desenleri Çete tarafından kitabın Dört. Herhangi bir öz saygı programcı kitabı olduğunu söyleyecektir dil agnostik ve desenleri yazılım mühendisliği için geçerli ne olursa olsun, hangi dili genel kullanın. Bu asil bir iddiadır. Ne yazık ki çok kaldırılır gerçeği.

Fonksiyonel diller son derece etkileyici.Fonksiyonel bir dilde bir tasarım desenleri gerekmez dili olasılığı çok yüksek olduğu için seviye, program sonu tasarım ortadan kaldıran kavramlar desenler hep birlikte.

Fonksiyonel programlamanın temel özellikleri birinci sınıf değerleri, tımar, sabit değerler, vb gibi fonksiyonları vardır. OO tasarım desenleri bu özellikleri değerlendirip bu bana pek açık görünmüyor.

Ayrıca, fonksiyonel dil desteği olan OOP (gibi F# ve Bunun), öyle görünüyor ki ortada beni programcılar kullanarak bu dilleri kullanmak istiyorsunuz aynı tasarım desenleri bulunan mevcut tüm diğer OOP bir dil. Aslında, şu an kullandığım F# ben yazarken ve Bunun günlük ve desenler arasında çarpıcı farklar vardır Hayır bu dillerde kullanmak desenleri Java ben vs.

Fonksiyonel programlama OOP tasarım desenleri ihtiyacını ortadan kaldıran bu iddia doğru mu? Eğer öyleyse, ya da tipik OOP tasarım deseni ve işlevsel eşdeğer bir örnek için bağlantı sonrası misiniz?

CEVAP
29 Kasım 2008, CUMARTESİ


Alıntı blog yazısı iddiasını biraz abartır. FP yokortadan kaldırmaktasarım desenleri gerek. Terim "tasarım desenleri" sadece yaygın olarak FP dilde aynı şeyi tanımlamak için kullanılan değil. Ama onların var. Fonksiyonel diller formun en iyi uygulama bir sürü kural var "ne zaman, problem X, Y gibi bir kod kullanın karşılaşma bir tasarım deseni temel olarak.",

Ancak, çoğu OOP-özel tasarım desenleri oldukça işlevsel dillerde alakasız olduğu doğru.

Özellikle tartışmalı tasarım desenleri söylemek gerektiğini sanmıyorumgenel olaraksadece mevcut kullanılan dili eksiklikleri yama. Ve eğer başka bir dilde aynı sorun basit çözebilirsek, diğer dil için bir tasarım deseni ihtiyacı olmayacaktır. Bu dili konuşanların bile sorunun farkında olmayabilirvarçünkü, o dilde bir sorun değil.

"Dörtlü Çete" bu konu hakkında şunları söyler:

Programlama diline bakış noktasında etkiler, çünkü bu önemlidir. Bizim desen/C Smalltalk düzey dil özellikleri, ve bu seçimi rahatça uygulanabilir olamaz ne belirler varsayalım. Eğer prosedürel dil olarak kabul edersek, tasarım desenleri adı dahil olabilir"", "Saklama" ve "". Polimorfizmi Miras Benzer şekilde, kalıpları biraz daha az doğrudan ortak nesne yönelimli diller tarafından desteklenir. CLOS ihtiyacı azaltmak hangi yöntemleri çok Ziyaretçi gibi bir model için, örneğin, vardır. Aslında, yeterince Smalltalk ve bazı desenler daha kolay olduğu için başka bir dilde ifade edilebilir demek C arasında farklılıklar vardır. (Örneğin Yineleyici bakın.)

(Yukarıdaki Tasarım Desenleri kitap Tanıtımı, Sayfa 4, paragraf 3) ' dan bir alıntı

Fonksiyonel ana özellikleri programlama gibi işlevleri vardır birinci sınıf değerleri, tımar, sabit değerler, vb. Görünmüyor bariz tasarım desenleri OO bana o herhangi bir giriş ve çıkışı var özellikleri.

Komut desen, değil birinci sınıf fonksiyonları yaklaşık olarak nedir? :) FP bir dil, sadece başka bir işleve argüman olarak bir fonksiyon geçersin. OOP bir dil, oluşturmak için bir sınıf işlevi, şal ve diğer işlev nesne geçirin. Etkisi aynı, ama OOP tasarım deseni deniyor, ve bir sürü daha fazla kod alır. Ve tımar yoksa soyut fabrika deseni nedir? Sonunda onu aramak zaman, dışarı tükürür ne yapılandırmak için bir işlevi bir bit parametreleri geçirmek.

Yani Evet, birkaç GoF tasarım desenleri daha güçlü ve mevcut alternatifler kullanmak daha kolay çünkü FP dilde gereksiz hale.

Ama tabii ki yine de hangi tasarım desenleri vardırdeğilFP diller tarafından çözüldü. Tek FP karşılığı nedir? (Bir an için tekiz genel kullanım için kötü bir model olduğunu göz ardı ederek)

Ve her iki yönde de çalışır. FP de tasarım desenleri var dediğim gibi, insanlar genellikle gibi onları düşünme.

Ama monadlar rastlamak olabilir. Onlar olmasa bir tasarım deseni için "genel durumu ile ilgili"? Hiçbir eşdeğer bir desen var olduğunu OOP dillerde çok basit bir sorun.

Bir tasarım deseni ihtiyacımız yok "artırma statik bir değişken", ya da "yuva okumak sadece buydu." ^em>yapın.

(Saf) dil, yan etkileri ve değişken devlet işlevsel monad ile geçici sürece imkansız, "desen", ya da diğer yöntemlerden birini aynı şeyi izin verdiği için.

Ayrıca, fonksiyonel dillerde hangi destek OOP (F# Bunun) benim için çok açık görünüyor programcılar bu dilleri kullanarak aynı tasarım desenleri kullanmak istiyorsunuz her diğer OOP için kullanılabilir bulundu dil. Aslında, şu an kullandığım F# ve Bunun her gün, ve yok arasında çarpıcı farklılıklar ben bu dilleri vs kullanmak desenleri kalıpları ben yazdığımda kullanın Java.

Hala zorunlu olarak düşündüğünü, çünkü belki de? Bir sürü insan, zorunlu diller tüm hayatları ile uğraştıktan sonra, zor bir zaman işlevsel bir dil çalıştıklarında bu alışkanlık vazgeçmek zorunda. (F Oldukça komik bazı girişimlerde gördüm# burada, kelimenin tam anlamıylaherfonksiyon sadece bir dizi olduğunu, if C programı alsaydın olarak, temelde, ve tüm noktalı yerine''. hadi bakalım :))

Ama başka bir olasılık sadece bir dil OOP tasarım desenleri gerektirecek sorunları çözme basit olduğunu fark etmemiş olabilir.

Tımar kullanın, ya da başka bir işlevi argüman olarak geçirmek, durdurmak ve OOP bir dil bunu nasıl yapardın bir düşün.

Orada iddia eden herhangi bir gerçektir fonksiyonel programlama ortadan kaldırır OOP tasarım desenleri için ihtiyacınız var?

Evet. :) FP bir dilde çalışırken, artık OOP özel tasarım desenler gerekiyor. Ama yine de bazı genel tasarım desenleri veya diğer non-OOP belirli şeyler ve yeni birkaç özel FP "tasarım desenleri" yerine ihtiyacın var. MVC gibi ihtiyaç Tüm dillerde eksiklikler var, ve tasarım desenleri çevrelerindeki bizim çalışma tarzımız vardır.

Neyse, bulabilirsiniz bu ilginç deneyin elinizi de "temiz" FP gibi dillerde ML (benim kişisel favorim, en azından öğrenme amaçlı), veya Haskell, nerede yok OOP koltuk değneği geri düşmek zaman sen karşı karşıya olan yeni bir şey.

Edit: Beklendiği gibi, bir kaç kişi tasarım desenleri olarak tanımlamama itiraz "bir dil yama kadar eksiklikleri", işte benim gerekçesi: Zaten çoğu tasarım desenleri bir programlama için belirli bir paradigma, ya da bazen belirli bir dil olduğunu söyledi. Sık sık, onlar sadece sorunları çözmekvarbu paradigma (OOP için FP, ya da soyut fabrikalar için monadlar Bakınız). Neden soyut fabrika deseni FP var değil mi? Çözmeye çalışır sorun yok çünkü. Eğer bir sorun FP dilde var olmayan OOP dilleri, varsa, o zaman açıkça bu OOP dillerin bir eksikliktir. Sorun çözülür, ama dilleri yok, ama senden demirbaş kodu bir sürü etrafında çalışmak gerekir. İdeal olarak, büyülü bir şekilde programlama dili yapmak istiyoruztümsorunlar git. O hala orada herhangi bir sorun prensipte dilinin bir eksikliktir. ;)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Matt Steffanina

    Matt Steffan

    1 EYLÜL 2011
  • MrDevin521

    MrDevin521

    18 Temmuz 2010
  • Ty Moss

    Ty Moss

    20 Kasım 2007