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?
sumber
Jawaban:
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
sumber
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.
sumber
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 :)
sumber