Tek Sorumluluk Prensibi

Merhabalar,

Bugünkü yazımda sizlere Tek Sorumluluk Prensibinden bahsedeceğim. Vakit kaybetmeden haydi öğrenmeye başlayalım


Tasarımın en önemli ilkesi olarak kabul edilen yaklaşımdır. Bu yaklaşımda her sorumluluk bir neden-sonuç ilişkisi içisinde düşünülür. Değişiklikleri en aza indirmek için her sınıf yalnızca bir sorumluluk üstlenecek şekilde tasarım yapılır. Gelecekte yapılacak bir değişiklik yapılacaksa onu işleyen sınıfta bir değişiklik yapmamız gerekecektir. Daha fazla iş yapan sınıfta bir değişiklik yapmamız gerektiğinde, değişim, sınıfın diğer sorumluluğu ile ilgili diğer işlevselliği etkileyebilir. Bu sebeple her sınıfın yalnızca bir sorumluluğu olması gerekir. Tek Sorumluluk Prensibi  basit ve sezgisel bir ilkedir ancak uygulamada bazen doğru yapmak çok zor olmaktadır. Örneğin yapılacak olan çarpma ya da bitiştirme işlemlerinin bu ilkeyi bozmayacağına dikkatli bir şekilde yapıp karar vermek gerekir.


Örnek

Bir e-posta mesajı tutmak için bir nesnemiz olduğunu varsayalım. Örnekteki gibi IEPosta interface’i kullanılarak bir tasarım yapılmıştır. Aşağıdaki kullanım tek sorumluluk ilkesinin yanlış bir örneğidir.

public interface IEPosta {
    
    public void setGonderen(String gonderen);
    
    public void setAlan(String alici);
    
    public void setIcerik(String icerigi);
}

İlk bakışta her şey yolunda görünmektedir. Daha yakından baktığımızda IEPosta Interface’in ve E-posta sınıfımızın sorumlulukları iki tanedir. Birincisi, POP3 veya IMAP gibi bazı e-posta protokollerinde sınıfın kullanımıdır. Diğer ise başka protokollerin de desteklenmesi gerekiyorsa, nesneler başka bir şekilde serileştirilmeli ve yeni protokolleri desteklemek için kodlar eklenmelidir. Diğer değişiklik olacak kısım ise içerik alanı için olacaktır. İçerik bir metin ise bile gelecekte HTML veya diğer biçimleri desteklemek için değişiklik yapılması gerekir. Tek sınıftan devam edilirse, her sorumluluk değişikliğinde diğerleride etkilenebilir. Yeni bir protokol ekleme, içeriğin her alan türü için ayrıştırılması ve seri hale getirilmesi için kod ekleme gereksinimine yol açacaktır. Yeni bir içerik türü eklenirse, uygulanan her bir protokol için kod eklemek gerekir.


public class EPosta implements IEPosta{

    public void setGonderen(String gonderen){

        // gönderme işlemleri
    }

    public void setAlan(String alici){

        // alma işlemleri
    }

    public void setIcerik(String icerigi){

        // içerik işlemleri

    }
}

Sorumlulukları bölmek için IIcerik adlı yeni bir arayüz ve sınıf oluşturulmuştur. Her sınıfın yalnızca bir sorumluluğu olması daha esnek bir tasarım sunmaktadır. Bu sayede yeni bir protokol eklemek için sadece E-Posta sınıfında değişiklik yapılır. Desteklenen yeni içerik türünün eklenmesi yalnızca IIcerik yapısında değişikliğe neden olur. 

public interface IIcerik {
    
    String getAsString();
}
public class BinaryIcerik implements IIcerik{
 
    private byte[] content;
    
    @Override
    public String getAsString() {
        return content.toString();
    }
}
public class TextIcerik implements IIcerik{

    private String text;

    @Override
    public String getAsString() {
        return text;
    }
}

Tek Sorumluluk İlkesi, bir uygulamanın tasarım aşamasında sınıfları tanımlamanın iyi yoludur ve bizi sınıfın gelişebileceği tüm yolları düşünmeye zorlar. Sorumlulukların iyi bir şekilde ayrılması ancak uygulamaların nasıl çalışması gerektiğinin tam resmi anlaşıldığında yapılabilir.

Evet Arkadaşlar Tek Sorumluluk Prensibini öğrenip, örnek yaptık. Sizlerde dahada farklı örnekler yaparak bu prensibe alışabilirsiniz. Görüşmek üzere kendinize iyi davranın 🙂

Not : Bu blog yazısı Yahya Şirin‘in ders notlarından yararlanılarak yazılmıştır.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir