Harun Özer


Proje veya dijital katalog yaptırmak için
iletişim formu doldurabilirsiniz..

<< Open Closed Principle -Açık Kapalı Prensibi | Liskov Substitution Principle - Liskov Yerdeğiştirme Prensibi>>

Single Responsibility Principle

Yazar harunozer 30 October 2013

Single Responsibility Principle Single Responsibility Principle (Tek Sorumluluk Prensibi) bir sınıfın bir sorumluluğunun olması gerektiği prensibidir.

Bir sınıfın birden fazla sorumluluğu yerine getirmesi o sınıfta ki kodun uzamasına neden olur.  Bu da genişletilebilirliği, yeniden kullanılabilirliği ve bakımı zorlaştırıp kod karmaşasına neden olur.

Örneğin kullanıcı özelliklerini tutan ve kullanıcı işlemleri yapan bir sınıfımız var. Bu sınıfta kullanıcı ekleme, silme, değiştirme, login olmak, mail gönderimi işlemlerini yaptığını düşünelim. Bu sınıfta uzun kod blokları olur, anlaşılması ve bakımı zorlaşır, geliştirme yapılacağında open closed prensibinin “kodun değiştirilmeye kapalı olması” kuralına da uyulmamış olunur. Single Responsibility prensibine uymayan örneğimiz aşağıdaki gibidir.

namespace KullaniciLib
{
    public class BusinessKullanici
    {
        public string Ad { get; set; }
        public string Soyad { get; set; }
 
        public void Ekle()
        {
            Console.WriteLine("Kullanıcı Eklendi");
        }
 
        public void Login()
        {
            Console.WriteLine("Kullanıcı Login Oldu");
        }
 
        public void MailSend()
        {
            Console.WriteLine("Kullanıcı Mail Gönderildi");
        }
    }
}
namespace Mailing
{
    class Program
    {
        static void Main(string[] args)
        {
            BusinessKullanici bk = new BusinessKullanici();
            bk.Ad = "ahmet";
            bk.Soyad = "duru";
            bk.MailSend();
        }
    }
}
namespace SRSample
{
    class Program
    {
        static void Main(string[] args)
        {
            BtnEkleClick();
            BtnLoginClick();
        }
 
        static void BtnEkleClick()
        {
            BusinessKullanici bk = new BusinessKullanici();
            bk.Ad = "ahmet";
            bk.Soyad = "duru";
 
            bk.Ekle();
        }
 
        static void BtnLoginClick()
        {
            BusinessKullanici bk = new BusinessKullanici();
            bk.Ad = "ahmet";
            bk.Soyad = "duru";
 
            bk.Login();
        }
    }
}
 
Yukarıdaki metotların içinde işlemleri gerçekten yapan kodlar bulunmadığı için kod blokları o kadar uzun değil. Fakat gerçekten işlemleri yerine getirecek kodlar olsaydı karmaşık ve uzun bir sınıfımız olmuş olacaktı. Performans açısından da gereksiz özelliklerin üretilmesini istemeyiz. Örneğin mail gönderiminde ki bir değişiklikte open closed prensibinin “kodun değiştirilmeye kapalı olması” ilkesine uyulmamış olunur. Şimdi de Single Responsibility Prensibine göre uygulamamızı düzenleyelim.
 
namespace SRP_KullaniciLib
{
    public class Kullanici
    {
        public string Ad { get; set; }
        public string Soyad { get; set; }
    }
}
 
namespace SRP_KullaniciLib
{
    public interface IKullaniciDb
    {
        void Ekle(Kullanici k);
    }
 
    public interface IKullaniciLogin
    {
        void Login(Kullanici k);
    }
 
    public interface IKullaniciMail
    {
        void MailSend(Kullanici k);
    }
    public class KullaniciDb:IKullaniciDb
    {
        public void Ekle(Kullanici k)
        {
            Console.WriteLine("Kullanıcı Eklendi.");
        }
    }
    public class KullaniciLogin:IKullaniciLogin
    {
        public void Login(Kullanici k)
        {
            Console.WriteLine("Kullanıcı Login.");
        }
    }
    public class KullaniciMail:IKullaniciMail
    {
        public void MailSend(Kullanici k)
        {
            Console.WriteLine("Kullanıcı Send Mail.");
        }
    }
}
namespace SPR_View
{
    class Program
    {
        static void Main(string[] args)
        {
            BtnEkleClick();
            BtnLoginClick();
        }
 
        static void BtnEkleClick()
        {
            Kullanici k = new Kullanici() { Ad = "ahmet", Soyad = "duru" };
            IKullaniciDb kDb = new KullaniciDb();
            kDb.Ekle(k);
        }
 
        static void BtnLoginClick()
        {
            Kullanici k = new Kullanici() { Ad = "ahmet", Soyad = "duru" };
            IKullaniciLogin kLogin = new KullaniciLogin();
            kLogin.Login(k);
        }
    }
}
namespace SRP_Mailing
{
    class Program
    {
        static void Main(string[] args)
        {
            Kullanici k = new Kullanici() { Ad = "ahmet", Soyad = "duru" };
            IKullaniciMail kMail = new KullaniciMail();
            kMail.MailSend(k);
            Console.ReadKey();
        }
    }
}
 

Single Responsibility prensibine uygun olan geliştirmemizde her sınıfa bir sorumluluk yüklenmiştir. Yeni sorumluluklar ekleneceği zaman yeni sınıflar oluşturulup mevcut yapının değiştirilmesine gerek kalmayacaktır. Sınıflardaki kod blokları gereğinden fazla uzamayacak böylece kod karmaşası olmayıp kodun bakımını ve yeniden kullanılabilirliğini kolaylaştırmış olduk.

Örnek uygulama kodlarını aşağıdaki linkden indirebilirsiniz.

SingleResponsibilityPrinciple.rar

Tam Sayfa
Tags Tasarım Prensipleri,
Kategoriler Tasarım Prensipleri
İşlemler
Bu Makale 1  Kez Beğenildi.
İsim :    
e-Mail :    
Web Site :  
İmage :  
Güvenlik Kodu :  

Güvenlik Resmi
Resmi Yenile
    
Yorum :  
Tasarım Desenleri ve Mimarileri