Apakah pemisahan perintah / kueri berlaku untuk metode yang membuat objek dan mengembalikan ID-nya?

12

Mari kita berpura-pura memiliki layanan yang memanggil proses bisnis. Proses ini akan memanggil lapisan data untuk membuat objek tipe A dalam database.

Setelah itu kita perlu memanggil lagi pada kelas lain dari lapisan data untuk membuat turunan dari tipe B dalam database. Kami perlu menyampaikan beberapa informasi tentang A untuk kunci asing.

Pada metode pertama kita membuat objek (mengubah keadaan) dan mengembalikan ID (kueri) dalam satu metode.

Dalam metode kedua kami memiliki dua metode, satu (createA) untuk menyimpan dan yang lainnya (getId) untuk kueri.

    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);
    }

Dari pemahaman saya metode kedua mengikuti pemisahan permintaan perintah lebih lengkap. Tapi saya merasa boros dan kontra-intuitif untuk meminta database untuk mendapatkan objek yang baru saja kita buat.

Bagaimana Anda mendamaikan CQS dengan skenario seperti itu?

Apakah hanya metode kedua yang mengikuti CQS dan jika demikian, apakah lebih baik untuk menggunakannya dalam kasus ini?

Gilles
sumber
2
jika A dan B dibuat bersama dengan frekuensi apa pun, saya mungkin akan membuat prosedur tersimpan membuat keduanya sekaligus, dan kemudian Anda memotong potensi memiliki B yang dibuat pertama atau A yang dibuat tanpa B jika itu adalah masalah.
Ryathal
Melangkah terlambat di gim untuk menawarkan opsi menggunakan parameter keluar. Secara teknis bukan nilai kembali! ;)

Jawaban:

13

CQS adalah pedoman dan bukan aturan absolut. Lihat artikel wiki untuk contoh kegiatan yang tidak mungkin dilakukan di bawah CQS yang ketat.

Namun, dalam hal ini, jika Anda ingin mempertahankan CQS, Anda dapat membuat ID di sisi klien (seperti GUID), atau klien dapat meminta ID dari sistem sebelum membuat objek apa pun, yang terasa lebih bersih untuk saya daripada membuat objek kemudian meminta untuk itu (tetapi lebih sulit daripada hanya menggunakan kolom identitas).

Secara pribadi saya hanya mengembalikan ID dan menyebutnya salah satu situasi di mana CQS tidak cocok.

Artikel bagus lainnya dengan contoh: Martin Fowler

Misko
sumber
3

Jika Anda mengikuti metodologi dan sepertinya membawa Anda ke jalan yang buruk, Anda harus mengevaluasi kembali itu.

Saya melihat bahwa pengidentifikasi objek yang baru dibuat adalah hal yang valid untuk memiliki sebagai parameter kembali - itu tidak hanya nyaman, tetapi juga "baik" - karena Anda dapat melihat kode lebih baik ketika itu.

Bagaimanapun, saya tidak akrab dengan "pemisahan permintaan perintah" tetapi saya sangat ragu bahwa perintah tidak dapat mengembalikan informasi tentang eksekusi perintah, dan jika ya, buang saja - keberhasilan / kegagalan selalu ada, dan saya lakukan tidak berpikir bahwa "objek Anda dibuat OK" dari "objek Anda dibuat OK dan id-nya adalah xxx" menjadi jauh berbeda.

alex
sumber
-1

Hanya metode kedua yang mengikuti CQS.

Saya menganggap CQS sebagai pedoman untuk mendorong praktik pengkodean yang baik. Manfaatkan praktik pengkodean yang baik selama pengembangan, dan jika Anda mengetahui nanti bahwa metode ini mengandung kode sumber daya-kritis, Anda masih bisa mengoptimalkannya.

Optimalisasi prematur adalah akar dari semua kejahatan :)

cheesus mengatakan berhenti menembakkan mod
sumber
Apa yang paling bagus dalam metode kedua?
CheatEx
Saya tidak mengatakan metode kedua adalah 'baik'. Saya mengatakan ini mengikuti paradigma CQS. Jika Anda tidak mengikuti CQS, saya kira metode kedua tidak baik untuk Anda. Jika Anda ingin tahu mengapa beberapa orang mencoba mengikuti CQS, lihat http://en.wikipedia.org/wiki/Command-query_separation
cheesus mengatakan berhenti menembakkan mod
Anda mengatakan bahwa CQS mendorong praktik pengkodean yang baik, jika itu benar maka kita harus mengamati semacam "kebaikan" dalam metode kedua. Dimana itu?
CheatEx
Tampaknya Anda tidak membaca tautan yang saya berikan. CQS catch-phrase: Mengajukan pertanyaan seharusnya tidak mengubah jawabannya . Dalam metode pertama Anda, Anda memiliki metode ('createA') yang memberikan 'jawaban', tetapi itu mengubah jawaban setiap kali Anda bertanya. Pada metode kedua Anda tidak memilikinya, ini adalah 'kebaikan' di dalamnya. Untuk lebih jelasnya: Saya bukan puritan CQS, saya tidak mengikutinya setiap waktu.
cheesus mengatakan berhenti menembakkan mod