CSharp

Kural Tasarım Modeli (Rule Design Pattern) Kullanımı

İş kuralı modeli (Business Rules) olarak da adlandırılan bu yaklaşım kod karmaşıklığının azaltılması, farklı durumlarda farklı kuralların test edilmesi, yazılımın bakım ve düzenleme maliyetinin azaltılması gibi avantajları sağlamaktadır.

Model basitçe iş katmanında bir veya birden fazla kontrolü çalıştırarak sonucun üretilmesi mantığına dayanmaktadır.

Örneğin bir telefon rehberine kişi bilgileri kaydedilirken çeşitli kontroller yapılacağını varsayalım.

Sonuc, KisiBilgisi sınıfları ile Main ve RehbereEkle metodları:

    class Sonuc
    {
        public bool Basarili { get; set; }
        public string HataMesaji { get; set; }
    }
    class KisiBilgisi
    {
        public string AdSoyad { get; set; }
        public string Adres { get; set; }
        public string EvTel { get; set; }
        public string IsTel { get; set; }
        public string CepTel { get; set; }
    }
    public List TelefonDefteri { get; set; }

        static void Main(string[] args)
        {
            var sonuc = RehbereEkle(new KisiBilgisi
            {
                AdSoyad = "Örnek Kisi Ad Soyad",
                Adres = "Örnek Kisi Adres",
                CepTel = "05xx1234567",
                EvTel = "0xxx1234567",
                IsTel = "0xxx1234567"
            });

            if (sonuc.Basarili)
            {
                Console.WriteLine("Ekleme başarılı");
            }
            else
            {
                Console.WriteLine("Ekleme başarısız. Hata Mesajı:"+sonuc.HataMesaji);
            }
        }
    private static Sonuc RehbereEkle(KisiBilgisi kisiBilgisi)
        {
            if (kisiBilgisi.AdSoyad == string.Empty)
            {
                return new Sonuc { Basarili = false, HataMesaji = "Ad Soyad boş" };
            }
            if (kisiBilgisi.CepTel == string.Empty)
            {
                return new Sonuc { Basarili = false, HataMesaji = "Cep Tel boş" };
            }
            if (kisiBilgisi.EvTel == string.Empty)
            {
                return new Sonuc { Basarili = false, HataMesaji = "Ev Tel boş" };
            }
            if (kisiBilgisi.Adres == string.Empty)
            {
                return new Sonuc { Basarili = false, HataMesaji = "Adres boş" };
            }
            if (kisiBilgisi.IsTel == string.Empty)
            {
                return new Sonuc { Basarili = false, HataMesaji = "İş Tel boş" };
            }

            return new Sonuc { Basarili = true };
        }

RehbereEkle metodunda görüldüğü üzere KisiBilgisi sınıfı ile gelen veri 5 kontrolden geçmektedir. Bu kontroller başka bir iş metodunda lazım olduğunda yeniden yazılmak zorunda kalınacaktır. Ayrıca yeni bir kontrol eklemek için koda bir if daha eklenecek ve kodun her tekrar ettiği yerde ekleme yapılması gerekecektir.

Buradaki rehber örneğinde ad soyad, telefon, adres bilgilerinin kontrolü basit gelebilir. Daha karmaşık iş kural ve kontrolleri kullandınız veya kullanıyor olabilirsiniz.  Buradaki kuralların yerine kendi iş kurallarınızı konumlandırdığınızda işlevsellik daha rahat anlaşılacaktır.

İş kuralı modelini uyarlarsak RehbereEkle metodu değişecektir. Kurallardan oluşan liste, RuleManager sınıfının ExecuteRules metoduna gönderilir. Geriye kuralların uygulanarak başarısız olan varsa bilgisinin dönmesi söz konusudur.

    private static Sonuc RehbereEkle(KisiBilgisi kisiBilgisi)
        {
            var kurallar = new List();
            kurallar.Add(new AdSoyadCheck(kisiBilgisi));
            kurallar.Add(new CepTelCheck(kisiBilgisi));
            kurallar.Add(new EvTelCheck(kisiBilgisi));
            kurallar.Add(new AdresCheck(kisiBilgisi));
            kurallar.Add(new IsTelCheck(kisiBilgisi));

            var sonuc = RuleManager.ExecuteRules(kurallar);
            return new Sonuc { Basarili = sonuc.IsSuccess, HataMesaji = sonuc.ErrorMessage };
        }

Main metodu:

Sonuç Çıktısı:

RehbereEkle Metodu:

Result, RuleManager, RuleBase sınıfları ve IRule arayüzü:

    public class Result
    {
        public bool IsSuccess { get; set; }
        public string ErrorMessage { get; set; }
    }
    public interface IRule
    {
        Result IsValid();
    }

    public static class RuleManager
    {
        public static Result ExecuteRules(IList rules)
        {
            List Results = new List();

            foreach (var rule in rules)
            {
                var result = rule.IsValid();

                if (!result.IsSuccess)
                {
                    Results.Add(result.ErrorMessage);
                }
            }

            if (Results.Count == 0)
                return new Result { IsSuccess = true };

            return new Result { IsSuccess = false, ErrorMessage = String.Join(",", Results.ToArray()) };
        }
    }

    public abstract class RuleBase : IRule
    {
        protected TRuleData ruleData;
        public RuleBase(TRuleData RuleData)
        {
            ruleData = RuleData;
        }

        public abstract Result IsValid();
    }    

EvTelCheck sınıfı yani iş kuralının kendisi:

    //kural sınıfı bu şekildedir.
    //diğer kurallarda bu sınıf gibi oluşturulur.
    //ceptel,iştel,adsoyad,adres gibi..
    public class EvTelCheck : RuleBase
    {
        public EvTelCheck(KisiBilgisi RuleData) : base(RuleData)
        {
        }

        public override Result IsValid()
        {
            if (ruleData.EvTel == string.Empty)
                return new Result { IsSuccess = false, ErrorMessage = "Ev Tel boş olamaz." };

            return new Result { IsSuccess = true };
        }
    }

Modelin uygulanması bu şekildedir. Sağlıkla kalın.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*