Hesaplamayı yan etkilerden ayırdığımızda “dünyayı sorma” kodunu nereye koyacağız?


10

Göre Komut Sorgu Ayırma ilkesi yanı sıra Veri Düşünce ve Clojure ile DDD biri, hesaplamalar ve kararlarından (dünyanın değiştirme) yan etkileri ayırmak gerekir sunumlar yüzden her iki bölümü anlamak ve test etmek daha kolay olacağını.

Bu cevaplanmamış bir soru bırakıyor: "dünyayı sormayı" sınır olarak göreceli olarak nereye koymalıyız? Bir yandan, harici sistemlerden (veritabanı, extental servis API'leri vb.) Veri istemek referans olarak şeffaf değildir ve bu nedenle saf hesaplama ve karar verme koduyla birlikte oturmamalıdır. Öte yandan, bunları hesaplama kısmından ayırmak ve bir argüman olarak iletmek problemli veya belki de imkansızdır, çünkü hangi verileri talep etmemiz gerektiğini önceden bilmeyebiliriz.


1
Geri arama kavramları burada devreye giriyor. Hangi verilerin gerekli olabileceğini önceden bilmiyorsanız, hangi koda ihtiyaç duyduğunu belirleyebileceği hesaplama koduna bir geri çağrı sağlayın ve diğer katmanların gerçek getirme ve sağlama işlemlerini gerçekleştirmesini sağlayın . Eşzamansız olması gerekiyorsa, geri arama, kullanılabilir olduğunda getirilen verilerle çağrılacak başka bir işlev bile belirtebilir.
Marjan Venema

1
@MarjanVenema, aklıma gelen tek seçenek bu. Sadece teorik bakış açısından: aksi takdirde yan etki içermeyen yöntem, yan etkili geri aramayı çağırırsa, yan etkili olur. Muhtemelen buradaki sorunum, hesaplamanın yan etkilerden ayrılmasının, hesaplamanın referans olarak şeffaf olmasını gerektirdiğini varsayıyorum. Gerçi bu doğru değil.
Alexey

1
Endişeniz buysa, hesaplamanız yeterince ince değildir. Başka hangi verilerin / adımların gerekli olduğuna ilişkin karar vermeyi özetlemeniz gerekir. Dolayısıyla, tam hesaplamayı hangi verilerin gerekli olduğuna ilişkin kararların alındığı yere göre adımlara bölün. Ardından, tam hesaplama için iş akışını yöneten bir tür "yönetmen" bulun: her adıma başlama, her adımdan bilgi geri alma, bir sonraki adıma ve gerekli verilere karar vermek için bunu kullanma, almak için bir getirme işlemine başlama ve ardından geçme veriler hesaplamada bir sonraki adıma getirilir.
Marjan Venema

Yanıtlar:


1

Öte yandan, bunları hesaplama kısmından ayırmak ve bir argüman olarak iletmek problemli veya belki de imkansızdır, çünkü hangi verileri talep etmemiz gerektiğini önceden bilmeyebiliriz.

Bu, yorumlarda belirtildiği gibi, veri alma yeteneğini (ör. Birinci sınıf işlev, bir arabirim uygulayan bir nesne, vb.) Geçirerek yan etkileri izole etmek için uygun bir mekanizma sağladığı bir örnektir.

Gövdesi saf olan daha üst düzey bir fonksiyonun saflığı yoktur: http://books.google.com/books?id=Yb8azEfnDYgC&pg=PA143#v=onepage&q&f=false

Bu tür bir işlevi potansiyel olarak saf bir işlev olarak adlandırarak yazdım: http://adamjonrichardson.com/2014/01/13/potentially-pure-functions/

Potansiyel olarak saf bir işlevi (dallanma yapılarından yoksun olan ve mümkün olduğunca az iş yapan) düşme işlevleriyle birleştirirseniz, yalıtım kümeleri olarak adlandırdığım bir kombinasyon, yan etkileri oldukça etkili bir şekilde izole edebilir ve çok test edilebilir bir kod oluşturabilirsiniz: http: // adamjonrichardson.com/2014/01/15/isolating-side-effects-using-isolation-sets/


0

Sonucu sınıfta saklarsınız, bu başlangıçta biraz garip görünür, ancak daha basit kodla sonuçlanır. örneğin arayanda geçici değişken yok.

class database_querier
    feature -- queries
        was_previous_query_ok : boolean is
            do
                Result = …
            end

        previous_query_result : string is 
            requires
                was_previous_query_ok
            do
                Result = query_result
            end

    feature -- commands
        query_db (…) is
            do
                …
                query_result = bla
            end

    feature {none} --data
        query_result : string

1
Eyfel vahşi doğada görmeyi seviyorum.
SBI

@sbi sadece sözde kod. :-)
ctrl-alt-delor

Beni mutlu edecek kadar yakın;)
SBI
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.