2010-12-14 16 views
19

Clojure, Endişelerin Ayrılmasında Nasıl Bir Yaklaşım Sağlıyor? Kod veri olduğundan, işlevler parametre olarak iletilebilir ve geri dönüş olarak kullanılabilir ...Clojure, Endişelerin Ayrılmasında Nasıl Bir Yaklaşım Sağlıyor?

Ve bu ilke "100 veri yapısında 100'den fazla veri yapısında çalışan 1 veri yapısında çalışan daha iyi 1000 işlevler" (veya bunun gibi bir şey).

Yani, her şeyi bir haritayı topla, anahtar olarak bir anahtar kelime ver, ve hepsi bu mu? fonksiyonlar, skalerler, koleksiyonları, her şey ... Endişeler Ayrılması

fikri Yönleri vasıtasıyla (boy yönelimli programlama) ve ek açıklamalar ile, Java, uygulanmaktadır. Bu benim konseptle ilgili görüşüm ve biraz kısıtlanmış olabilir, bu yüzden bunu kabul edilmeyin. dost programcılar _ işlevsel bir dille

+3

Ne soruyor olursanız biraz daha spesifik olabilir misiniz? Endişelerin ayrılması, 100 farklı şey anlamına gelmek için kullanılan bir terimdir. – Sami

+1

Yönler, kaynağa erişimi olmayan mevcut kod davranışını değiştirmenin bir yoludur. Clojure ve diğer Lisps, kendi yığınları ile temelde globals olan dinamik değişkenlerle benzer bir şey sağlar. Üst düzey işlevler (defn ile oluşturulanlar) dinamik değişkenlerdir ve 'binding' ile bağlanabilirler. 'Bağlama' sözdizimi, tıpkı 'izin' gibi görünür, ancak ciltleme, ciltleme biçimindeki çağrılar içinde kullanılır. – Zak

cevap

60

ait WTF'lerinizi önlemek için, Clojure yaklaşık gitmek için doğru yolu (deyimsel yolu) nedir

, endişeleri ayrılması işlemek için en iyi yolu herhangi bir programlama sorunu dönüştürmek olduğunu Bir veri yapısında bir dizi dönüşüm içine. Örneğin, bir web uygulaması yazarsanız, genel amaç bir istek almak ve bunu yanıt verisine dönüştürmek olarak düşünülebilecek bir yanıt haline dönüştürmektir. (Önemsiz bir web uygulamasında, başlangıç ​​verileri muhtemelen yalnızca isteği değil, oturum ve veritabanı bilgilerini de içerecektir) Çoğu programlama görevi bu şekilde düşünülebilir.

Her "endişe", dönüşümü mümkün kılan bir "boru hattındaki" bir işlev olabilir. Bu şekilde, her işlev diğer adımlardan tamamen ayrılır.

Bu, verilerinizin, bu dönüşümlerden geçtiği için, yapısında zengin olması gerektiği anlamına gelir. Esas olarak, programımızın tüm "zekâsını" kodda değil, veri içerisine koymak istiyoruz. Karmaşık bir işlevsel programda, farklı seviyelerdeki veriler, kendi başına bir programlama dili gibi görünmesi gereken kadar karmaşık olabilir. Bu, “alana özgü diller” fikrinin devreye girdiği yerdir.

Clojure Kulağa daha bu daha az külfetli hale karmaşık heterojen veri yapılarını manipüle etmek için mükemmel destek vardır

Ayrıca

, tembel veri yapıları için Clojure desteği bu izin verir (sağ yapılırsa yani hiç de hantal değil) ara veri yapıları, aslında (kavramsal olarak) sonsuz boyutta olacak şekilde, bu dekuplajı çoğu senaryoda mümkün kılar. Bu durumda sonsuz veri yapılarının neden bu kadar değerli olduğunu öğrenmek için aşağıdaki makaleye bakın: http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

Bu "boru hattı" yaklaşımı, endişelerinizi ayırmak için gereksinimlerinizin% 90'ını işleyebilir. Kalan% 10 için, yüksek bir seviyede, yön odaklı programlama için çok güçlü bir araç olarak düşünülebilecek olan Clojure makrolarını kullanabilirsiniz.

Ben de bunu en iyi "nesneler" veya "yönleri" Gerçekten bu yaklaşımda gerekli kavramlar olmadığını Clojure- Not kaygıları decouple inanıyoruz nasıl.

+0

İyi dedi!Ek not olarak, işlevlerinizin çoğu saf ise, bunları bağımsız olarak kolayca test edebilirsiniz. –

+0

Yani, Nesneler yerine (OO dillerinde), yapıları (fonksiyonel dillerde) alırsınız. Bu, Kapsülleme için ("yüksek", "yüksek bağlanma, düşük bağlanma, kara kutular, modülerlik") karşılık gelen "konsept" dir? Bir adı var mı ? – Belun

+0

(Python'da da olsa) benzer bir boru hattı yaklaşımı hakkında konuşulan iyi bir okuma: http://www.dabeaz.com/generators/Generators.pdf – szx