Tidak ada jawaban yang jelas untuk itu. Meskipun pertanyaannya sempit, penjelasannya tidak.
Bagi saya, itu adalah sesuatu seperti Occam's Razor jika Anda mau. Ini adalah ideal di mana saya mencoba mengukur kode saya saat ini. Sulit untuk memakukannya dengan kata-kata yang sederhana dan sederhana. Metafora lain adalah »satu topik« yang abstrak, yaitu sulit dipahami, sebagai »tanggung jawab tunggal«. Deskripsi ketiga akan »berurusan dengan satu tingkat abstraksi«.
Apa artinya itu secara praktis?
Akhir-akhir ini saya menggunakan gaya pengkodean yang sebagian besar terdiri dari dua fase:
Fase I paling baik digambarkan sebagai kekacauan kreatif. Pada fase ini saya menuliskan kode ketika pikiran mengalir - yaitu mentah dan jelek.
Fase II adalah kebalikan total. Itu seperti membersihkan setelah badai. Ini membutuhkan kerja dan disiplin paling banyak. Dan kemudian saya melihat kode dari sudut pandang seorang desainer.
Saya bekerja sebagian besar di Python sekarang, yang memungkinkan saya untuk memikirkan objek dan kelas nanti. Pertama Tahap I - saya menulis hanya fungsi dan menyebarkannya hampir secara acak dalam modul yang berbeda. Pada Fase II , setelah saya mulai bekerja, saya melihat lebih dekat pada modul apa yang berhubungan dengan bagian mana dari solusi. Dan ketika membaca sekilas modul, topik muncul kepada saya. Beberapa fungsi terkait secara tematis. Ini adalah kandidat yang bagus untuk kelas . Dan setelah saya mengubah fungsi menjadi kelas - yang hampir dilakukan dengan lekukan dan menambahkan self
ke daftar parameter dengan python;) - Saya menggunakan SRP
seperti Occam's Razor untuk menghapus fungsionalitas ke modul dan kelas lainnya.
Contoh saat ini mungkin menulis fungsionalitas ekspor kecil beberapa hari yang lalu.
Ada kebutuhan untuk csv , excel , dan gabungan excel sheet di dalam zip.
Fungsionalitas polos masing-masing dilakukan dalam tiga tampilan (= fungsi). Setiap fungsi menggunakan metode umum untuk menentukan filter dan metode kedua untuk mengambil data. Kemudian di setiap fungsi persiapan ekspor berlangsung dan dikirim sebagai Respons dari server.
Ada terlalu banyak level abstraksi yang tercampur:
I) berurusan dengan permintaan / respons masuk / keluar
II) menentukan filter
III) mengambil data
IV) transformasi data
Langkah mudah adalah dengan menggunakan satu abstraksi ( exporter
) untuk menangani lapisan II-IV pada langkah pertama.
Yang tersisa hanyalah topik yang berhubungan dengan permintaan / tanggapan . Pada tingkat abstraksi yang sama mengekstraksi parameter permintaan yang tidak apa-apa. Jadi saya punya pandangan ini satu "tanggung jawab".
Kedua, saya harus memecah eksportir, yang seperti yang kita lihat terdiri dari setidaknya tiga lapisan abstraksi.
Menentukan kriteria filter dan retrival sebenarnya hampir pada tingkat abstraksi yang sama (filter diperlukan untuk mendapatkan subset data yang tepat). Level-level ini dimasukkan ke dalam sesuatu seperti lapisan akses data .
Pada langkah berikutnya saya memecah mekanisme ekspor yang sebenarnya terpisah: Di mana menulis ke file temporal diperlukan, saya membagi itu menjadi dua "tanggung jawab": satu untuk penulisan data aktual ke disk dan bagian lain yang berhubungan dengan format aktual.
Seiring pembentukan kelas dan modul, segalanya menjadi lebih jelas, apa yang menjadi milik di mana. Dan selalu pertanyaan laten, apakah kelasnya melakukan terlalu banyak .
Bagaimana Anda menentukan tanggung jawab mana yang harus dimiliki setiap kelas, dan bagaimana Anda mendefinisikan tanggung jawab dalam konteks SRP?
Sulit untuk memberikan resep untuk diikuti. Tentu saja saya bisa mengulangi cryptic »satu level abstraksi« - aturan jika itu membantu.
Bagi saya ini adalah "intuisi artistik" yang mengarah pada desain saat ini; Saya memodelkan kode seperti seniman yang bisa memahat tanah liat atau melukis.
Bayangkan saya sebagai Coding Bob Ross ;)