Single Responsibility adalah IMHO konsep yang tidak mudah untuk dipecahkan.
Aturan praktis yang sederhana adalah:
Ketika saya harus menjelaskan, apa yang dilakukan oleh metode / kelas, dan harus menggunakan kata »dan«, itu adalah indikator, bahwa sesuatu yang berbau mungkin sedang terjadi .
Di satu sisi, itu hanya indikator dan di sisi lain itu bekerja lebih baik terbalik: Jika dua hal terjadi, Anda tidak dapat menghindari menggunakan kata »dan« dan karena Anda melakukan dua hal, Anda melanggar SRP .
Tetapi, apakah itu berarti di sisi lain, jika Anda melakukan lebih dari satu hal, Anda melanggar SRP ? Tidak. Karena jika tidak, Anda terbatas pada kode sepele dan masalah sepele untuk dipecahkan. Anda akan melukai diri sendiri jika interpretasi Anda terlalu ketat.
Perspektif lain tentang SRP adalah: satu tingkat abstraksi . Selama Anda berurusan dengan satu tingkat abstraksi, Anda sebagian besar baik-baik saja.
Apa arti semua itu untuk pertanyaan Anda:
Saya percaya UpdateGroupBilling tidak boleh dipanggil di dalam metode save karena melanggar prinsip tanggung jawab tunggal. Namun, ia mengatakan bahwa setiap kali pembayaran dilakukan, tagihan harus diperbarui. Karenanya inilah pendekatan yang tepat.
Untuk memutuskan, apakah ini merupakan pelanggaran terhadap SRP , perlu diketahui, apa yang terjadi di save()
-Metode. Jika metode ini -seperti nama-menyarankan bertanggung jawab untuk bertahan model untuk database, panggilan untuk UpdateGroupBilling
adalah IMHO pelanggaran SRP , karena Anda memperluas konteks »menghemat pembayaran«. Anda akan memparafrasekannya dengan »Saya menyimpan pembayaran dan memperbarui tagihan grup«, yang - seperti yang saya katakan sebelumnya - merupakan indikator (kemungkinan) pelanggaran SRP .
Di sisi lain, jika metode ini menggambarkan "resep-pembayaran" -yaitu langkah-langkah apa yang harus diambil dalam proses- dan memutuskan: setiap kali pembayaran selesai, itu harus disimpan (ditangani di tempat lain) dan kemudian penagihan grup harus diperbarui (ditangani di tempat lain), itu bukan pelanggaran SRP, karena Anda tidak meninggalkan abstraksi "resep": Anda membedakan antara apa yang harus dilakukan (dalam resep) dan di mana itu dilakukan (di kelas / metode / modul yang sesuai). Tetapi jika itu yang dilakukan oleh save()
-metode Anda (menjelaskan langkah mana yang harus diambil), Anda harus mengganti nama.
Tanpa konteks lebih lanjut, sulit untuk mengatakan sesuatu yang konkret.
Edit: Anda memperbarui pos inital Anda. Saya akan mengatakan, bahwa metode ini melanggar SRP dan harus di refactored. The pengambilan data harus menjadi faktor keluar (itu harus menjadi parameter dari metode ini). The penambahan data (updateBy / On) harus dilakukan di tempat lain. The penghematan harus dilakukan di tempat lain. Maka akan baik-baik saja untuk pergi UpdateGroupBilling([Parameters])
apa adanya.