Single Responsibility And Loosely Coupling Principles

Geliştirdiğimiz uygulamalar farklı sorumlulukları yerine getiren bileşenlerin bir arada çalışmasından meydana gelir. Geliştirme, bakım ve güncelleme süreçlerinde karşılaşılacak zorlukları en aza indirmek için, uygulama mimarisi bileşenler tek bir iş yapacak ve birbirleri ili gevşek ilişkide haberleşecek şekilde tasarlanmalıdır. Her bileşenin tek bir işi olması Single Responsibility Principle, bileşenler arasındaki bağların gevşek olması Loosely Copling Principle olarak adlandırılır.

public class UserService
{
    public void Register(string email, string name)
    {
        try
        {
            //Save User

            //Send Mail
            _smtpClient.SendMail("success")
        }
        catch (Exception ex)
        {
            //Error Log
            File.Write(ex.Message)
        }
    }
} 

Yukarıdaki örnekte UserService sınıfı kullanıcı kaydetme işleminin yanında mail gönderme, hata loglama sorumluluklarını da üstlenmiş durumdadır. Bu durum tek sorumluluk ilkesini ihlal eder, sorumluklardan herhangi biri değiştiğinde uygulamanın tekrar derlenmesi gerekir. Olması gereken sorumlulukların ayrı ayrı ve yeniden kullanılabilir şekilde bölünmesidir.

public class FileLoger{
    public static void WriteLog(string log) {}   
}

public class MessageSender{
    public static void Send(string message){}
}

public class UserService
{
    public void Register(string email, string name)
    {
        try
        {
            //Save User

            MessageSender.Send("Success");
        }
        catch (Exception ex)
        {
            FileLoger.WriteLog(ex.Message);
        }    
    }
}   

Bu şekilde UserService sınıfının sorumlulukları başka sınıflara devredilerek single responsibility sağlanmıştır. Ancak UserService sınıfı MessageSender ve FileLoger sınıflarına bağımlı durumdadır. Bu durum Tightly Coupled – Sıkı Bağlılık olarak adlandırılmaktadır. Bu sorunuda Interface kullanarak çözebiliriz.

public interface ILoger
{
    void Write(string Exception);
}

public interface IMessageSender
{
    void Send(string Message);
}

public class FileLoger : ILoger
{
    public void Write(string Exception)
    {
        Console.WriteLine("File Log = " +Exception);
    }
}

public class DbLoger : ILoger
{
    public void Write(string Exception)
    {
        Console.WriteLine("Db Log = " + Exception);
    }
}

public class MailSender : IMessageSender
{
    public void Send(string Message)
    {
        Console.WriteLine("Email Message = " + Message);
    }
}

public class SmsSender : IMessageSender
{
    public void Send(string Message)
    {
        Console.WriteLine("Sms Message = " + Message);
    }
}


public class UserService
{
    private ILoger _loger;
    private IMessageSender _messageSender;

    public UserService(ILoger loger, IMessageSender messageSender)
    {
        _loger = loger;
        _messageSender = messageSender;
    }

    public void Register(string email, string name)
    {
        try
        {
            //Save User

            //Send Mail
            _messageSender.Send("success");

        }
        catch (Exception ex)
        {
            //Error Log
            _loger.Write(ex.Message);
        }
    }
}

static Main (string [] args){

    var mailSender = new MailSender();
    var smsSender = new SmsSender();

    var fileLoger = new FileLoger();
    var dbLoger = new DbLoger();

    var userService = new UserService(fileLoger, mailSender);
    userService.Register("mail1@google.com","password1");

    userService = new UserService(dbLoger, smsSender);
    userService.Register("mail2@google.com", "password2");
} 

Görüleceği üzere UserService sınıfı bağımlılıklarını interface üzerinden bildiği için daha alt düzeydeki sınıflarla bağımlığı kalmamıştır. Ancak uygulamayı oluşturan bileşenlerden birinde bir değişiklik olduğunda uygulamanın tekrar derlenmesi gerekmektedir. Bu sorunun çözümünü bir sonraki makalede inceliyor olacağız

Sağlıklı ve huzurlu günler dilerim

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

w

Connecting to %s