Komut / sorgu ayırma, bir nesne oluşturan ve kimliğini döndüren bir yöntem için geçerli mi?


12

Bir iş sürecini çağıran bir hizmetimiz olduğunu varsayalım. Bu işlem, veri katmanını veritabanında A tipi bir nesne oluşturmak için çağırır.

Daha sonra veritabanında B tipi bir örnek oluşturmak için veri katmanının başka bir sınıfını tekrar çağırmamız gerekir. Yabancı anahtar için A hakkında bazı bilgiler vermemiz gerekiyor.

İlk yöntemde, bir nesne (durumu değiştir) oluşturur ve bu nesnenin kimliğini (sorgu) tek bir yöntemle döndürürüz.

İkinci yöntemde, biri kaydetme için diğeri (getId) ve sorgu için iki yöntem bulunur.

    public void FirstMethod(Info info)
    {
        var id = firstRepository.createA(info);           
        secondRepository.createB(id);
    }

    public void SecondMethod(Info info)
    {
        firstRepository.createA(info);
        var key = firstRepository.getID(info);
        secondRepository.createB(key);
    }

Anladığım kadarıyla, ikinci yöntem komut sorgusu ayırmayı daha tam olarak izler. Ama yeni oluşturduğumuz nesneyi almak için veritabanını sorgulamak için savurgan ve karşı-sezgisel buluyorum.

CQS ile böyle bir senaryoyu nasıl uzlaştırıyorsunuz?

Sadece ikinci yöntem CQS'yi takip ediyor mu ve eğer öyleyse bu durumda kullanılması tercih edilir mi?


2
A ve B herhangi bir frekansla birlikte oluşturulmuşsa, muhtemelen bir kerede bir saklı yordamın her ikisini de oluşturmasını sağlarım ve daha sonra ilk önce bir B'nin yaratılması veya sorun olması durumunda B olmadan A'nın oluşturulma potansiyelini kestiniz.
Ryathal

Oyunda geç adım atmak için bir çıkış parametresi kullanma seçeneği sunar. Teknik olarak bir dönüş değeri değil! ;)

Yanıtlar:


13

CQS mutlak bir kuraldan ziyade bir kılavuzdur. Katı CQS altında imkansız olan etkinlik örnekleri için wiki makalesine bakın .

Ancak, bu durumda, CQS'yi korumak istiyorsanız, istemci tarafında (GUID gibi) bir kimlik oluşturabilirsiniz veya istemci herhangi bir nesne oluşturmadan önce sistemden bir kimlik isteyebilir; bana nesneyi oluşturmaktan daha sonra sorguyu sormaktan daha iyidir (ancak sadece bir kimlik sütunu kullanmaktan daha zordur).

Şahsen sadece kimliği iade edip CQS'nin iyi olmadığı durumlardan biri olarak adlandırırım.

Örneklerle bir başka güzel makale: Martin Fowler


3

Bir metodolojiyi takip ederseniz ve sizi kötü yollardan aşağı indiriyor gibi görünüyorsa, yeniden değerlendirmelisiniz.

Yeni oluşturulmuş bir nesnenin tanımlayıcısının dönüş parametresi olarak geçerli bir şey olduğunu görüyorum - sadece uygun değil, aynı zamanda "iyi" - kodun ne zaman daha iyi olduğunu görebiliyorsunuz.

Her durumda, "komut sorgusu ayırma" aşina değilim ama çok komutları komut yürütme hakkında bilgi döndürmesini engeller şüpheliyim ve eğer öyleyse, sadece çöp - başarı / başarısızlık her zaman orada ve ben "nesneniz TAMAM oluşturuldu" dan "nesneniz TAMAM oluşturuldu ve kimliği xxx" olduğunu düşünmeyin.


-1

Sadece ikinci yöntem CQS'yi takip eder.

CQS'yi iyi kodlama uygulamalarını teşvik etmek için bir rehber olarak görüyorum. Geliştirme sırasında iyi kodlama uygulamalarından yararlanın ve daha sonra bu yöntemin kaynak açısından kritik kod içerdiğini öğrenirseniz, yine de optimize edebilirsiniz.

Erken optimizasyon tüm kötülüklerin köküdür :)


İkinci yöntemde özellikle iyi olan nedir?
CheatEx

İkinci yöntemin 'iyi' olduğunu söylemedim. CQS paradigmasını izlediğini söyledim. CQS'yi takip etmezseniz, ikinci yöntemin sizin için iyi olmadığını düşünüyorum. Bazı insanların neden CQS'yi takip etmeye çalıştığını öğrenmek istiyorsanız, bkz. Http://en.wikipedia.org/wiki/Command-query_separation
cheesus

CQS'nin iyi kodlama uygulamalarını teşvik ettiğini söylediniz, eğer doğruysa, ikinci yöntemde bir çeşit "iyilik" gözlemlemeliyiz. Nerede?
CheatEx

Görünüşe göre sağladığım bağlantıyı okumadınız. CQS catch-expression: Bir soru sormak cevabı değiştirmemelidir . İlk yönteminizde, bir 'yanıt' sağlayan bir yönteme ('createA') sahip olursunuz, ancak her sorduğunuzda cevabı değiştirir. İkinci yöntemde buna sahip değilsiniz, bu içindeki 'iyilik'. Açık olmak gerekirse: Ben CQS sadakati değilim, her seferinde takip etmiyorum.
cheesus
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.