Saya baru-baru ini refactoring metode yang merupakan perintah dan metode permintaan.
Setelah memisahkannya menjadi metode satu perintah dan satu metode kueri, saya menemukan bahwa sekarang ada beberapa tempat dalam kode tempat saya memanggil perintah lalu mendapatkan nilai dari kueri, yang sepertinya merupakan pelanggaran prinsip KERING.
Tetapi jika saya harus membungkus kode umum itu ke dalam suatu metode, metode itu akan menjadi perintah dan permintaan. Apakah ini dapat diterima?
language-agnostic
refactoring
dry
cqrs
Kris Welsh
sumber
sumber
Jawaban:
Selalu ada trade off untuk dipertimbangkan antara prinsip-prinsip desain yang saling bertentangan. Cara mengatasinya adalah dengan melihat alasan yang mendasari di balik prinsip-prinsip tersebut. Dalam kasus ini, tidak dapat menjalankan kueri tanpa menjalankan perintah bermasalah, tetapi tidak dapat menjalankan perintah tanpa menjalankan kueri umumnya tidak berbahaya. Selama ada cara untuk menjalankan kueri mandiri, saya tidak melihat alasan untuk tidak menambahkan hasil kueri ke perintah, terutama jika melakukan sesuatu seperti ini:
sumber
Saya belum pernah mendengar Command-Query-Separation (CQS) sebelumnya, tetapi tampaknya itu berhubungan dengan Prinsip Tanggung Jawab Tunggal (SRP), yang menyatakan bahwa fungsi / kelas idealnya harus bertanggung jawab untuk melakukan satu hal dan satu hal saja .
Jika kode perintah Anda adalah 20 baris kode dan kode kueri adalah 30 baris lainnya dan semuanya berada dalam satu fungsi, jelas Anda melanggar SRP dan saya akan menganggap CQS juga dan kedua potongan logika tersebut harus dipisahkan satu sama lain .
Namun, sesuai dengan contoh hipotetis Anda, saya kemungkinan besar akan membuat metode pembungkus yang akan menggabungkan perintah dan permintaan Anda sehingga KERING tidak dilanggar di banyak tempat dalam kode. Saya juga tidak akan menganggap ini sebagai pelanggaran SRP (dan mungkin CQS), karena pembungkus masih hanya memiliki satu tanggung jawab: untuk menggabungkan perintah dengan kueri dan membuat abstraksi tingkat yang lebih tinggi yang lebih mudah dikonsumsi.
Saya pikir metode pembungkus adalah solusi yang dapat diterima dan untuk menggambarkan itu, mari kita ambil contoh Anda selangkah lebih maju. Bagaimana jika Anda harus menjalankan 2 kueri alih-alih 1 dan kemudian melakukan tindakan perintah berdasarkan itu. Jadi 2 baris kode Anda akan menjadi 6 atau 8. Bagaimana jika ada beberapa validasi data / memeriksa antara satu dan yang lain, jadi sekarang Anda memiliki 15 baris kode. Apakah Anda berpikir dua kali tentang membuat pembungkus yang melakukan semua itu, daripada menaburkan 15 baris dalam beberapa file?
sumber
KERING lebih penting, karena itu memecahkan kebutuhan yang jauh lebih mendasar - menghindari upaya yang sia-sia dan sia-sia. Ini adalah hal mendasar - seseorang tidak perlu menjadi programmer untuk memahaminya.
CQS merupakan respons terhadap kesulitan, dalam bahasa yang tidak mendukung efek pelacakan, untuk memahami kode yang dieksekusi baik untuk hasil maupun dampaknya. Namun:
Perlunya mengeksekusi kode untuk hasilnya tidak dapat dihindari, karena ini adalah dasar untuk menyusun program besar dari unit kecil.
Perlunya mengeksekusi kode untuk efeknya tidak dapat dihindari, karena, di luar matematika dan ilmu komputer teoretis, nilai menjalankan sebuah program terletak pada apa yang diamati dapat dilakukan untuk kita.
Perlunya menimbulkan efek dan menghasilkan hasil dalam kode yang sama tidak dapat dihindari, karena, dalam praktiknya, kita membutuhkan efek dan komposisionalitas, bukan hanya satu atau yang lain.
Solusi aktual untuk masalah pelacakan efek yang terlalu sulit bagi manusia tanpa bantuan, tentu saja, memiliki komputer yang membantu kita manusia ! Hal serupa dapat dikatakan tentang melacak hubungan rumit antara nilai runtime (seperti validitas indeks array), yang pengecualian dan kontrak yang dijalankan runtime merupakan solusi (non-).
Kesimpulannya, "solusi" seperti CQS hanya menghalangi cara merancang program sesuai dengan prinsip-prinsip yang kuat berdasarkan kenyataan. Pergi untuk KERING.
sumber