Chain Of Responsibility

Chain Of Responsibility nedir? 🤔 ⛓️

Chain of Responsibility, bir dizi işlemi birbirinden bağımsız şekilde tanımlayabildiğimiz, bir iş bittiğinde bir sonraki nesneye özgü olan işi çalıştırmamızı ve bu sayede tüm işler bitene kadar devam eden bir sorumluluk zinciri oluşturmamızı sağlar. Ayrıca çoğu zaman bizi if-else karmaşasından kurtaran bir tasarım desenidir.

Bir senaryo üzerinden pratik yapalım. Bir banka hesabımız olsun. 3 aşamalı bir doğrulama işlemine tabi tutalım.

İlk olarak bir hesap numarasının var olup olmadığına bakalım.

Öncelikle banka hesabı tanımlayalım.

public class BankAccount
{
    public BankAccount(string account, string branchCode, DateTime expireTime)
    {
        Account = account;
        BranchCode = branchCode;
        ExpireTime = expireTime;

    }
    public string Account { get; set; }
    public string BranchCode { get; set; }
    public DateTime ExpireTime { get; set; }

}

Şimdi de tüm "rule" sınıflarının miras alacağı IRule abstract sınıfını tanımlayalım.

public abstract class IRule
{
    public abstract bool Run(BankAccount bankAccount);
    public IRule NextRule { get; set; }
}

Tüm "rule" sınıflarımızı yukarıda tanımladığımız IRule'dan miras alacağız.

public class AccountRule : IRule
{
    public AccountRule()
    {
        NextRule = new ExpireRule();
    }
    public override bool Run(BankAccount bankAccount)
    {
        //secret info - hesap numarasinin secretkey yada azure - aws gibi cloud platformlardan alindigini varsayalim.
        var account = "254875269523";
        if (bankAccount.Account == account)
        {
            return NextRule.Run(bankAccount);
        }
        return false;
    }
}
public class BranchRule : IRule
{
    public override bool Run(BankAccount bankAccount)
    {
        //secret info - brach code secretkey yada azure - aws gibi cloud platformlardan alindigini varsayalim.
        var branchCode = "755";
        if(bankAccount.BranchCode == branchCode) return true;
        return false;

    }
}
public class ExpireRule : IRule
{
    public ExpireRule()
    {
        NextRule = new BranchRule();
    }
    public override bool Run(BankAccount bankAccount)
    {
        if (bankAccount.ExpireTime > DateTime.Now)
        {
            return NextRule.Run(bankAccount);
        }
        return false;
    }
}

Burada her class, kendisinden sonraki işi constructor içinde NextRule özelliğine geçmiş oluyor. Böylelikle bir iş zinciri oluşmuş ve doğrulama sürecinin tüm işler bitene kadar devam etmesi sağlanmıştır.

var bankAccount = new BankAccount("254875269523", "755", new DateTime(2024, 03, 30));

var firstRule = new AccountRule();
var result = firstRule.Run(bankAccount);
if (!result)
{
    Console.WriteLine("Invalid Account");
}
else
{
    Console.WriteLine("SUCCESS");

}

Yukarıdaki kodumuzu çalıştırırsak çıktının "SUCCESS" olduğunu göreceksiniz.

Basit bir örnek üzerinden anlatmak istedim. Umarım faydalı olmuştur.

Sonraki yazılarımda görüşmek üzere! 👋