-- Tasarım Kalıpları ve Prensipleri

Tek Sorumluluk Prensibi – Single Responsibility Principle (SRP)

Nesne yönelimli programlamanın en temel prensiplerinden biri olan Tek Sorumluluk(Single Responsibility) prensibine göre bir sınıfa hatta bir metota bile tek bir sorumluluk yüklenmeli, bir nesne sadece bir iş yapmalıdır.Bir diğer söylemle; bir sınıfa yazdığımız kodu değiştirmemize sadece tek bir şey sebep olmalıdır.Bu açıyla aşağıdaki Dergi sınıfına bakıldığında YaziEkle ve YaziSil olarak iki metot görülüyor ve bunlar dergi dediğimiz şeyin bir işlevi olduğu için tek sorumluluk prensibine bir aykırılık görülmüyor.

using System;
using System.Collections.Generic;
 
namespace DesignPatternsTutorial
{
    public class Dergi
    {
 
        private readonly List<string> Yazilar = new List<string>();
        public int YaziSayisi { getset; }
 
        public int YaziEkle(string eklenecekYazi)
        {
            Yazilar.Add($"{++YaziSayisi} - {eklenecekYazi}");
            return YaziSayisi;
        }
 
        public void YaziSil(int silinecekYazi)
        {
            Yazilar.RemoveAt(silinecekYazi);
        }
 
        public override string ToString()
        {
            return string.Join(Environment.NewLine, Yazilar);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var dergi = new Dergi();
 
            dergi.YaziEkle("Nesne Yönelimli Programlama");
            dergi.YaziEkle("Tasarım Kalıpları");
 
            Console.WriteLine(dergi.ToString());
 
            Console.ReadKey();
        }
    }
}

Peki biz bu yazıların kalıcı olması istenildiğinde  DosyayaKaydet gibi bir metot bu sınıfa mı eklenmelidir? Hayır, bir yazının kaydedilmesi, kalıcığı derginin sorumluluklarından olmadığı gibi tek sorumluluk prensibine de terstir. Bunun için ayrı bir Kaydedici sınıfı oluşturulmalı ve kalıcılıkla(persistence) ilgili sorumluluklar bu sınıfa yüklenmelidir.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
 
namespace DesignPatternsTutorial
{
    public class Dergi
    {
 
        private readonly List<string> Yazilar = new List<string>();
        public int YaziSayisi { getset; }
 
        public int YaziEkle(string eklenecekYazi)
        {
            Yazilar.Add($"{++YaziSayisi} - {eklenecekYazi}");
            return YaziSayisi;
        }
 
        public void YaziSil(int silinecekYazi)
        {
            Yazilar.RemoveAt(silinecekYazi);
        }
 
        public override string ToString()
        {
            return string.Join(Environment.NewLine, Yazilar);
        }
    }
 
    public class Kaydedici
    {
        public void DosyayaKaydet(Dergi dergi, string dosyaAdi, bool uzerineYaz = false)
        {
            if(uzerineYaz || !File.Exists(dosyaAdi))
            {
                File.WriteAllText(dosyaAdi, dergi.ToString());
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var dergi = new Dergi();
 
            dergi.YaziEkle("Nesne Yönelimli Programlama");
            dergi.YaziEkle("Tasarım Kalıpları");
 
            Console.WriteLine(dergi.ToString());
 
            var kaydedici = new Kaydedici();
            var dosyaAdi = @"C:\dergi\yazilar.txt";
            kaydedici.DosyayaKaydet(dergi, dosyaAdi);
 
            Console.ReadKey();
        }
    }
}

Böylece derginin kendisini ve yazıları kaydetme işlevini ilgili sınıflara dağıtarak prensibe uyduk.

Bunu paylaş :

Yorum bırak

Yorum