Her kuralda olduğu gibi, buradaki önemli şeyin kuralın amacını, ruhunu göz önünde bulundurmak ve kuralın bazı ders kitaplarında nasıl ifade edildiğini ve bu davaya nasıl uygulanacağını analiz etmekten rahatsız olmamak olduğunu düşünüyorum. Buna avukat gibi yaklaşmamıza gerek yok. Kuralların amacı, daha iyi programlar yazmamıza yardımcı olmaktır. Program yazmanın amacı kurallara uymamaktır.
Tek sorumluluk kuralının amacı, her bir işlevin kendine yeten, tutarlı bir şey yapmasını sağlayarak programların anlaşılmasını ve sürdürülmesini kolaylaştırmaktır.
Örneğin, bir keresinde "checkOrderStatus" gibi bir şey çağırdığım ve bir emrin beklemekte, gönderilmekte, geri sipariş edilmek, ne olursa olsun ve hangisini belirten bir kod döndürdüğünü belirleyen bir işlev yazdım. Sonra başka bir programlayıcı geldi ve sipariş gönderildiğinde eldeki miktarı da güncellemek için bu işlevi değiştirdi. Bu, tek sorumluluk ilkesini ciddi şekilde ihlal etti. Bu kodu daha sonra okuyan başka bir programcı işlev adını görecek, dönüş değerinin nasıl kullanıldığını görecek ve bir veritabanı güncellemesi yaptığından asla şüphelenmeyecektir. Eldeki miktarı güncellemeden sipariş durumunu almak için gereken kişi garip bir pozisyonda olurdu: sipariş durumu bölümünü kopyalayan yeni bir fonksiyon yazmalı mı? DB güncellemesi yapılıp yapılmayacağını söylemek için bir bayrak ekle? Vb.
Öte yandan, "iki şeyi" neyin oluşturduğunu nitelemiyorum. Kısa süre önce, müşteri bilgilerini sistemimizden müşterinin sistemine gönderen bir işlev yazdım. Bu işlev, gereksinimlerini karşılamak için verilerin bazı biçimlendirmelerini yapar. Örneğin, veritabanımızda boş olabilecek bazı alanlarımız var, ancak boş değerlere izin vermiyorlar, bu yüzden "belirtilmemiş" gibi bazı sahte metinleri doldurmamız gerekiyor ya da tam kelimeleri unutuyorum. Muhtemelen bu işlev iki şey yapıyor: verileri yeniden biçimlendirmek VE göndermek. Fakat bunu “kasıtlı” ve “gönder” den ziyade bunu kasıtlı olarak tek bir işleve koydum çünkü hiçbir zaman, yeniden biçimlendirmeden göndermeyi istemiyorum. Birinin yeni bir arama yazmasını istemiyorum ve reformat çağırması ve sonra göndermesi gerektiğini fark etmiyorum.
Senin durumunda, veritabanını güncelle ve yazılan kaydın bir görüntüsünü döndür, mantıksal ve kaçınılmaz olarak bir araya gelebilecek iki şey gibi görünüyor. Uygulamanızın ayrıntılarını bilmiyorum, bu yüzden bu iyi bir fikirse de olmasa da kesin olarak söyleyemem ama mantıklı geliyor.
Kayıt için tüm verileri tutan bellekte bir nesne oluşturuyorsanız, veritabanında bunu yapmak için arama yaparsanız ve ardından nesneyi döndürürseniz, bu çok mantıklı olur. Nesnenin elinde var. Neden sadece geri vermiyorsun? Nesneyi geri getirmeseydin, arayan onu nasıl elde ederdi? Yeni yazdığınız nesneyi almak için veritabanını okumak zorunda kalacak mıydı? Bu oldukça verimsiz görünüyor. Rekoru nasıl bulur? Birincil anahtarı biliyor musunuz? Birisi, yazma işlevinin kaydı yeniden okuyabilmeniz için birincil anahtarı geri getirmesinin "yasal" olduğunu beyan ederse, neden sadece kaydı geri almak zorunda değilsiniz? Fark ne?
Öte yandan, nesneyi oluşturmak, veritabanı kaydını yazmaktan oldukça farklı bir grup iş ise ve arayan bir kişi yazmayı iyi yapmak isteyebilir, ancak nesneyi oluşturmak istemeyebilir, o zaman bu israf olabilir. Arayan bir nesneyi isteyebilir ancak yazma işlemini yapmıyorsa, o zaman nesneyi elde etmek için başka bir yol sağlamanız gerekir; bu, gereksiz kod yazmak anlamına gelebilir.
Ancak, senaryo 1'in daha muhtemel olduğunu düşünüyorum, o yüzden şunu söyleyebilirim ki, muhtemelen sorun değil.