Seperti halnya aturan apa pun, saya pikir yang penting di sini adalah mempertimbangkan tujuan aturan, semangat, dan tidak terperosok dalam menganalisis dengan tepat bagaimana aturan itu ditulis dalam beberapa buku teks dan bagaimana menerapkannya pada kasus ini. Kami tidak perlu mendekati ini seperti pengacara. Tujuan peraturan ini adalah untuk membantu kami menulis program yang lebih baik. Bukannya tujuan program menulis adalah untuk menegakkan aturan.
Tujuan dari aturan tanggung jawab tunggal adalah untuk membuat program lebih mudah dipahami dan dipelihara dengan membuat setiap fungsi melakukan satu hal yang koheren dan mandiri.
Sebagai contoh, saya pernah menulis sebuah fungsi yang saya sebut sesuatu seperti "checkOrderStatus", yang menentukan apakah pesanan tertunda, dikirimkan, dipesan kembali, apa pun, dan mengembalikan kode yang menunjukkan. Kemudian programmer lain datang dan memodifikasi fungsi ini untuk juga memperbarui kuantitas saat pesanan dikirim. Ini sangat melanggar prinsip tanggung jawab tunggal. Programmer lain yang membaca kode itu nanti akan melihat nama fungsinya, melihat bagaimana nilai pengembalian digunakan, dan mungkin tidak pernah menduga bahwa ia melakukan pembaruan basis data. Seseorang yang perlu mendapatkan status pesanan tanpa memperbarui kuantitas yang ada akan berada dalam posisi yang canggung: haruskah ia menulis fungsi baru yang menggandakan bagian status pesanan? Tambahkan bendera untuk memberi tahu apakah akan melakukan pembaruan db? Dll
Di sisi lain, saya tidak akan menganggap apa yang merupakan "dua hal". Saya baru-baru ini menulis sebuah fungsi yang mengirimkan informasi pelanggan dari sistem kami ke sistem klien kami. Fungsi itu melakukan beberapa pemformatan ulang data untuk memenuhi persyaratan mereka. Misalnya, kami memiliki beberapa bidang yang mungkin nol pada basis data kami, tetapi tidak mengizinkan nol sehingga kami harus mengisi beberapa teks dummy, "tidak ditentukan" atau saya lupa kata-kata yang tepat. Bisa dibilang fungsi ini melakukan dua hal: memformat ulang data DAN mengirimkannya. Tapi saya sengaja menempatkan ini dalam satu fungsi daripada memiliki "memformat ulang" dan "mengirim" karena saya tidak ingin pernah, pernah mengirim tanpa memformat ulang. Saya tidak ingin seseorang menulis panggilan baru dan tidak menyadari bahwa ia harus memanggil reformat dan kemudian mengirim.
Dalam kasus Anda, perbarui basis data dan kembalikan gambar catatan yang dituliskan tampak seperti dua hal yang mungkin berjalan secara logis dan tak terelakkan. Saya tidak tahu detail aplikasi Anda, jadi saya tidak bisa mengatakan dengan pasti apakah ini ide yang bagus atau tidak, tetapi kedengarannya masuk akal.
Jika Anda membuat objek dalam memori yang menyimpan semua data untuk catatan, melakukan panggilan database untuk menulis ini, dan kemudian mengembalikan objek, ini sangat masuk akal. Anda memiliki benda di tangan Anda. Mengapa tidak mengembalikannya saja? Jika Anda tidak mengembalikan objek, bagaimana penelepon mendapatkannya? Apakah dia harus membaca database untuk mendapatkan objek yang baru saja Anda tulis? Tampaknya agak tidak efisien. Bagaimana dia menemukan catatan itu? Apakah Anda tahu kunci utama? Jika seseorang menyatakan bahwa itu "sah" untuk fungsi tulis untuk mengembalikan kunci utama sehingga Anda dapat membaca kembali catatan, mengapa tidak hanya mengembalikan seluruh catatan sehingga Anda tidak perlu melakukannya? Apa bedanya?
Di sisi lain, jika membuat objek adalah kumpulan pekerjaan yang sangat berbeda dari menulis catatan database, dan penelepon mungkin ingin melakukan penulisan tetapi tidak membuat objek, maka ini bisa menjadi pemborosan. Jika seorang penelepon mungkin menginginkan objek tetapi tidak melakukan penulisan, maka Anda harus memberikan cara lain untuk mendapatkan objek, yang bisa berarti menulis kode yang berlebihan.
Tapi saya pikir skenario 1 lebih mungkin, jadi saya katakan, mungkin tidak ada masalah.