Saya menulis banyak kode yang melibatkan tiga langkah dasar.
- Dapatkan data dari suatu tempat.
- Ubah data itu.
- Letakkan data itu di suatu tempat.
Saya biasanya menggunakan tiga jenis kelas - terinspirasi oleh pola desain masing-masing.
- Pabrik - untuk membangun objek dari sumber daya tertentu.
- Mediator - untuk menggunakan pabrik, melakukan transformasi, lalu menggunakan komandan.
- Komandan - untuk meletakkan data itu di tempat lain.
Kelas saya cenderung sangat kecil, seringkali metode tunggal (publik), misalnya mendapatkan data, mengubah data, melakukan pekerjaan, menyimpan data. Ini mengarah pada proliferasi kelas, tetapi secara umum bekerja dengan baik.
Di mana saya berjuang adalah ketika saya datang ke pengujian, saya akhirnya akan erat dengan tes. Sebagai contoh;
- Factory - membaca file dari disk.
- Commander - menulis file ke disk.
Saya tidak bisa menguji satu tanpa yang lain. Saya bisa menulis kode 'test' tambahan untuk melakukan baca / tulis disk, tetapi kemudian saya mengulangi sendiri.
Melihat. Net, kelas File mengambil pendekatan yang berbeda, menggabungkan tanggung jawab (dari saya) pabrik dan komandan bersama. Ini memiliki fungsi untuk Buat, Hapus, Ada, dan Baca semua di satu tempat.
Haruskah saya melihat untuk mengikuti contoh. Net dan menggabungkan - terutama ketika berhadapan dengan sumber daya eksternal - kelas saya bersama? Kode itu masih digabungkan, tetapi lebih disengaja - itu terjadi pada implementasi asli, bukan dalam tes.
Apakah masalah saya di sini bahwa saya telah menerapkan Prinsip Tanggung Jawab Tunggal agak terlalu bersemangat? Saya memiliki kelas terpisah yang bertanggung jawab untuk membaca dan menulis. Ketika saya dapat memiliki kelas gabungan yang bertanggung jawab untuk berurusan dengan sumber daya tertentu, misalnya disk sistem.
Looking at .Net, the File class takes a different approach, it combines the responsibilities (of my) factory and commander together. It has functions for Create, Delete, Exists, and Read all in one place.
- Perhatikan bahwa Anda menyatukan "tanggung jawab" dengan "hal yang harus dilakukan." Tanggung jawab lebih seperti "bidang perhatian". Tanggung jawab kelas File adalah melakukan operasi file.
File
pustaka Anda dari C # adalah, untuk semua yang kita tahu File
kelas hanya bisa menjadi fasad, menempatkan semua operasi file ke satu tempat - ke dalam kelas, tetapi bisa secara internal menggunakan kelas baca / tulis yang sama dengan Anda yang akan sebenarnya mengandung logika yang lebih rumit untuk penanganan file. Kelas semacam itu (the File
) masih akan mematuhi SRP, karena proses benar-benar bekerja dengan sistem berkas akan diabstraksi di belakang lapisan lain - kemungkinan besar dengan antarmuka pemersatu. Bukan mengatakan itu masalahnya, tapi bisa jadi begitu. :)