Published on

Single Responsible Prensibi Nedir ?

Authors
  • avatar
    Name
    Alperen Önal
    Twitter

Bu yazımızda, SOLID'in ilk ilkesi olan Single Responsibility(Tek Sorumluluk) prensibini ele alacağız.

Single Responsibility prensibi, bir sınıfın ve/veya bir metodun yalnızca bir sorumluluğu olmasını ve yalnızca bir nedenden dolayı değişebilmesi gerektiğini vurgular.

Mesela bir analoji örneği verecek olursak, bir oteldeki güvenlik personelini düşünelim. Bu personelin sorumluluğu yalnızca otelin güvenliğidir. Yani bu güvenlik personelinin sorumluluğu ; bavul taşımak, yemek pişirmek, odaları toplamak, havuzu temizlemek vs. değildir.

Kısaca sınıfınız isveç çakısı gibi olmamalı :)

Amaç :

  • Test : Sadece bir sorumluluğu olan sınıfın çok daha az test senaryosu olacaktır.
  • Daha Az Bağımlılık : Sadece bir sorumluluğu olan sınıf, genellikle daha az sayıda başka sınıf veya modüle bağımlı olur. Bu, kodun değişikliklere karşı daha dirençli olmasını sağlar çünkü sınıfın dışındaki değişiklikler doğrudan bu sınıfa etki etmez.
  • Organizasyon : Küçük ve iyi organize edilmiş sınıflar, kod tabanında belirli bir işlevselliği veya bir hata noktasını ararken daha kolay bulunabilir.

Single Responsibility prensibine uymayan bir kod örneği verecek olursak :

class Fatura
{
    int faturaID;
    DateTime faturaKesimTarihi;
    string faturaAciklamasi;
    public void FaturaOlustur()
    {

        //islemler

    }

    public void FaturayiKaydet()
    {
        //islemler
    }

    public void YazicidanFaturaYazdir()
    {
        //islemler

    }

    public void FaturaGonderSMS()
    {

        //islemler
    }

    public void FaturaGonderEmail()
    {
        //islemler

    }


}

Fatura sınıfının üstlendiği sorumluluklar :

  • Fatura oluşturma (FaturaOlustur)
  • Faturayı kaydetme (FaturayiKaydet)
  • Yazıcıdan fatura yazdırma (YazicidanFaturaYazdir)
  • Faturayı SMS ile gönderme (faturaGonderSMS)
  • Faturayı email ile gönderme (faturaGonderEmail)

Bu kodda, Fatura sınıfı birden fazla sorumluluğa sahip. yazicidanFaturaYazdir(), faturaGonderSMS(), faturaGonderEmail(), faturayiKaydet() methodlarının bu sınıfta olması Single Responsibility prensibini ihlal etmektedir.

Şöyle de düşünebiliriz :

FaturayiKaydet() methodunda şuanda ADO.NET kullanıyoruz diyelim. Ancak yarın bir güncelleme ile Entity Framework'e geçeceğiz. Bu değişim doğrudan Fatura sınıfının değişmesine yol açacağı için SRP prensibini ihlal ettiğini bu şekilde başka bir açıdan da görebiliriz.

Single Responsibility prensibi, bir sınıfın ve/veya bir metodun ... ve yalnızca bir nedenden dolayı değişebilmesi gerektiğini vurgular.

Bu yüzden, bu metotlar için ayrı sınıflar oluşturmalıyız. Ben bu işlemler için kendi yöntemimle adım adım yapıyorum tavsiye ederim.

1-)Hedef sınıfın yaptığı işleri listele.

  • Fatura oluşturma (FaturaOlustur)
  • Faturayı kaydetme (FaturayiKaydet)
  • Yazıcıdan fatura yazdırma (YazicidanFaturaYazdir)
  • Faturayı SMS ile gönderme (faturaGonderSMS)
  • Faturayı email ile gönderme (faturaGonderEmail)

2-)Sorumlulukları listele ve az önce bulduğun işler ile eşleştir.(Yaratılacak sınıfları belirlemek için.)

FaturaGonderimFaturaKaydetmeFaturafaturaYazdirma
faturaGonderSMSFaturayiKaydetFaturaOlusturYazicidanFaturaYazdir
faturaGonderEmail---

3-)Değişim nedenlerini belirle.(Yaratılacak sınıfların SRP'ye uygunluğunu son kez gözden geçirmek için.)

FaturaGonderimFaturaKaydetmeFaturafaturaYazdirma
Yeni bir fatura yollama işlevinin eklenmesi. Örneğin : Fax ile gönderim sağlama işlevini ekleyeceğiz.Yeni bir ortama kaydedilme işlevinin eklenmesi. Örneğin : Artık Cloud'a kaydetme işlevi ekleyeceğiz.Fatura silme veya düzeltme gibi yeni işlevlerin eklenmesi.Yazıcı yerine başka cihazlardan çıktı alma özelliklerinin eklenmesi.
Var olan fatura gönderim işlevinin kaldırılması. Örneğin : Artık SMS göndermeyeceğiz.

Aşağıda bu işlemler sonucunda düzenlediğimiz kodumuz var.

  • Her sınıfın sadece bir sorumluluğu var.(✓)
  • Her sınıf sadece bir nedenden dolayı değişime uğrayabilir.(✓)
class Fatura
{
    int faturaID;
    DateTime faturaKesimTarihi;
    string faturaAciklamasi;

    public void FaturaOlustur()
    {
        //islemler
    }
}

class FaturaKaydetmeServisi
{
    public void FaturayiKaydet(Fatura fatura)
    {
        //islemler
    }
}

class FaturaYazdirmaServisi
{
    public void YazicidanFaturaYazdir(Fatura fatura)
    {
        //islemler
    }
}

class FaturaGonderimServisi
{
    public void FaturaGonderSMS(Fatura fatura)
    {
        //islemler
    }

    public void FaturaGonderEmail(Fatura fatura)
    {
        //islemler
    }
}


Okuduğunuz için teşekkürler bir serinin kalanına devam etmeyi unutmayın :) Open Closed Prensibi Nedir ?