Bu tasarım prensibi, her işten tek sınıfın sorumlu olmasını benimsemektedir. Yani bir sınıfta değişiklik yapmak için iki nedeniniz varsa, bu sınıfı ikiye bölmeniz gerekir. Böylece her bir sınıf, ayrı bir sorumluluğu üstlenmiş olur. Eğer bir sınıfa birden fazla sorumluluk yüklersek, sınıftaki değişiklikler sırasında işleyişi bozabiliriz.
Örnek uygulama ile devam edelim.
public class EmailService: IEmailService { public void sendEmail(string email) { if(isUserAuthorized()) { // email gönder } } private bool isUserAuthorized() { // veritabanına git // query user // user varsa ve yetkiliyse return true; } }
Yukarıdaki EmailService sınıfı, hem Email gönderme işlemini yapmaktan hem de kullanıcının veritabanında olup olmadığını kontrol etmekle sorumludur. Yani kullanıcı kontrolü ve Email gönderme işlemleri farklı işlemler. Bu durumda sınıfta değişiklik yapmak için iki nedenimiz var. Bunu şu şeklide Single Responsibility Prensibine uygun hale dönüştürebiliriz:
public class EmailService: IEmailService { public void sendEmail(string email) { if(MembershipService.IsUserAuthorized("bayram")) { // email gönder } } } public class MembershipService { public static bool IsUserAuthorized(string user) { // veritabanına git // query user // user varsa ve yetkiliyse return true; } }
Bu durumda her sınıf kendi sorumluluğunu yerine getirmiş oldu.
Gayet sade va anlaşılır bir örnek oluş elinize sağlık.
Bence Singel responsibility principle ilkesi olmazsa olmazlardan biri. Karmaşadan kurtarıyor insanı.
Merhabalar,
Hocam ilk önce yazınız için teşekkür ederim, Burada kafama takılan bir soru var. IsUserAuthorized metodunun içerisindeki veri tabanına git yazılı yorum satırına farklı bir class’ın içerisindeki veritabanı işlemleri ile ilgili bir birimin çağrılması olarak anlayabilir miyiz? Yoksa veritabanı işlemlerini ayırmaya gerek olmadan burada gerçekleştirebilir miyiz? Sizin bu konudaki görüşünüzü almak istiyorum.
Teşekkür ederim.
@caner: yorum satırındaki işlem sürecini, veri tabanına bağlanıp işlem yapmakla sorumlu olan bir sınıf yürütmeli. Çünkü onun sorumluluğu da veritabanı ile çalışmak. Bu soruyla beraber bir sorumluluğu daha ayırmış oldunuz 🙂
Vermiş olduğunuz örnekle hatamı buldum teşekkür ederim.