“Bir yöntemin bir değer döndürmesi veya yan etkileri olması gerekir, ancak her ikisi birden değil” kaynağı


12

Bir yöntemin ya bir dönüş değeri (ve referans olarak saydam) olması ya da yan etkileri olması gerektiğini, ancak her ikisini birden okumadığını bir kez okudum. Bu kurala ilişkin herhangi bir referans bulamıyorum, ancak bu kural hakkında daha fazla bilgi edinmek istiyorum.

Bu tavsiyenin kaynağı nedir? Hangi kişi veya topluluktan ortaya çıktı?

Ekstra kredi: Bu tavsiyeye uymanın iddia edilen faydası nedir?


1
@gnat Evet, öncelikle tarihle ilgili. Ekstra kredi kısmının kendi başına duramayacak kadar öznel olduğundan ve tarihin kapanıştan kaçma şansının arttığından korktum. Etiketi ekleyeceğim.
Wayne Conrad

Yığındaki bazı cevaplar bana bu tavsiyenin bir yazarı tarafından talep edilen faydaları mı yoksa hiç talep edebileceğiniz tüm faydaların bir listesini mi soracağınızı merak etti mi?
gnat

@gnat Yazarın iddia ettiği faydayı soruyorum (yine, kapanma korkusu), ama eminim kazık nedenleri umursamıyorum - aslında sormak istediğim soruyu cevaplıyorlar . Eğer konuyla ilgili soruları yanıtlayarak "iddia edilen" kelimemi kaldıracak olsaydım, bu soru sübjektifin çok ötesine geçebilir mi?
Wayne Conrad

“yığın nedenleri”, sorunun çok geniş olarak kapatılmasını zorlamaktadır . "Açık tarafta kalmayı" tercih ederseniz, yazarın iddia ettiği fayda için onu daraltmanın daha güvenli olacağını düşünüyorum
gnat

Bunun bir avantajı, kod hacmine göre ödeme alırsanız, bunun fazladan üretmesidir. "doSomething; GetResultOfSomething; HandleErrorsFromSomething;"
ღ uі

Yanıtlar:


13

Greg Young'a göre, bu fikir Bertrand Meyer'den geldi : Komut-Sorgu ayrımı .

Her yöntemin bir eylem gerçekleştiren bir komut olması veya arayana veri döndüren ancak her ikisini birden vermeyen bir sorgu olması gerektiğini belirtir. Başka bir deyişle, bir soru sormak cevabı değiştirmemelidir . 1 Daha resmi olarak, yöntemler yalnızca referans olarak saydam ve dolayısıyla hiçbir yan etkisi yoksa bir değer döndürmelidir.

1: Eiffel: yazılım mühendisliği için bir dil 43-48

Etki Alanına Dayalı Tasarım'da bu, Greg Young tarafından adlandırıldığı gibi Komut-Sorgu-Okuma Ayrımı / Ayrımı (CQRS) ile benzerdir.

Greg Young bu CQRS makalesinde Martin Fowler tarafından belirtildiği gibi CQS fikrini Bertrand'dan CQRS olarak adlandırdı.

Yararları

  • Okuma (Sorgu) bölümü, Yazma (komut) bölümünden farklı şekilde ölçeklendirilebilir / değiştirilebilir. İkisini ayırmak, optimizasyon / performans önemli olduğunda birbirlerinin önüne geçmelerini engelleyecektir.

Daha fazla bilgi için Martin Fowler bağlantısındaki makaleyi okuyun .


1
Doğal olarak, birçok durumda yararlı bir sonuç üretmek ve aynı anda bazı değişiklikler yapmak, ikisini daha da ayrı yapmaktan daha pahalı değildir.
Tekilleştirici

1
@Deduplicator InterlockedCompareExchange olan bir klişe örneği mi?
ღ uі

1
Bu tavsiye, dönüş komutta neler yapıldığı hakkında bazı bilgiler olduğunda açık değildir, ancak - veri kümesindeki satırları kaldırma yöntemi, veri kümesinin durumunu hemen hemen değiştirebilir, belirtilen satırları belirli bir ölçütlere göre kaldırabilir ve daha sonra kaldırılan satır sayısını veya söz konusu satırları içeren bir listeyi döndürün.
T. Sar

4

Nereden geldiğini bilmiyorum, ama iyi bir tavsiye ve anlamak oldukça basit.

Herhangi bir sade tasarımlı program çeşitli bölümlere ayrılacak, çeşitli şekillerde birleştirilecek ve oluşturulacaktır. Herhangi bir parçanın ne yaptığı konusunda mantık ne kadar zor olursa, programınızın öngörülebilir bir şekilde tepki vereceğinden emin olmak o kadar zor olacaktır.

Yan etki üreten parçaların izole edilmesi, gerisini mantık yürütmeyi, test etmeyi ve hata ayıklamayı kolaylaştırır. Her bir yan etki oluşturan yan etki sayısının azaltılması, o parçanın aynı şekilde çalışmasını kolaylaştıracaktır.

Daha da ayrışırsanız, bir dönüş değeri bir etkidir. Yan etkiler bir etkidir. Bir işlev yalnızca 1 etki (mümkünse) üretmelidir, çünkü bir işlevin çok sayıda girişi ve etkisi varsa, gerçekte ne yaptığına dair muhakeme zorluğu artar.


bu, sorulan soruyu ele almaya bile kalkışmaz, bkz. Nasıl Cevap
Verilir

@gnat Sorumum iki bölümden oluştu: Ana soru ("kim") ve ekstra kredi ("neden) Bu ekstra kredi kısmına
Wayne Conrad

okuduğuma göre (" talep edilen fayda") neden kısmın alıntı yazarı tarafından önerilen bir bölüm olması bekleniyor. Soru, olası tüm faydaların bir listesini istiyor gibi görünmüyor
gnat

2
@gnat Soruyu, bu tavsiyeyi, hem arkasındaki nedeni hem de verildiği bağlamı anlama çabası olarak anladım. Sorunun sadece bir kısmına değinmenin uygunsuz olduğuna inanmıyorum.
Morgen

1

Ekstra kredi: Bu tavsiyeyi izlemenin asıl iddia edilen faydası nedir?

Dönüş değerini yan etkilerden ayırmanın faydalarından biri, kısa devre değerlendirmesinden kaynaklanabilecek potansiyel bir sorunu ortadan kaldırmasıdır .

bool FooWithSideEffect() {
    // do query
    // do side effect
    return resultOfQuery;
}

bool BarWithSideEffect() {
    // do query
    // do side effect
    return resultOfQuery;
}

void BadShortCircuitEvaluation()
{
    // the programmer's intent is to have side effects of both functions
    if (FooWithSideEffect() && BarWithSideEffect() ) {
        // do something
    }

    // in case FooWithSideEffect() returns true, 
    // then BarWithSideEffect() is not called at all
    // because of short-circuit evaluation
}

bu tavsiye yazarın iddia ettiği bir fayda mıdır?
gnat

@gnat Tarihsel ve pratikleri karıştırdım, korkuyorum.
Nick Alexeev

1
yorum ve kod uyuşmuyorsa, FooWithSideEffects false
jk
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.