7 Mayıs 2018 Pazartesi

Delegation Dictionary ile Sınıfları Koşulsuz Çağırma

     S.a. Arkadaşlar,
     Bugünkü yazacağımız konu, kodun düzenlenmesiyle ilgilidir. Farklı sınıfları çağırırken if veya switch case yapısı yerine nasıl bir yöntem izleyebiliriz ona bakacağız. Öncelikle switch case yapısını inceleyeceğiz, daha sonra reflection ile düzenleme yapacağız, en son da delegate dictionary ile kodu düzenleyeceğiz. Aradaki farkı gördükten sonra istediğiniz yapıyı kullanmak size kalmış, fakat sanki tercihiniz belli gibi olacak. Hazırsak başlayalım.
      Kısaca ne yapacağımızı anlatalım. Elimizde belirli bir sınıftan türemiş sınıflar var. Her obje ismine göre başka bir sınıf çalışacaktır. Her çağrılan objeyi aldığı parametresinden tanıyoruz. Sınıflarımızla birlikte kurucu metotlarını verelim daha sonra üzerinden devam edelim.

    public class Living
    {

    }

    public class Humon : Living
    {
        string kind;
        public Humon(string kind)
        {
            this.kind = kind;
        }
    }

    public class Animal : Living
    {
        string kind;
        public Animal(string kind)
        {
            this.kind = kind;
        }
    }

    public class Plant : Living
    {
        string kind;
        public Plant(string kind)
        {
            this.kind = kind;
        }
    }


     Sınıfları çağırırken nasıl çağırabiliriz. Şu parametre geldiğinde bu form açılacak, diğeri geldiğinde diğeri açılacak. İlk akla gelenler doğal olarak if else veya switch case yapılarıdır.

Living obj = null;
switch (kind)
{
    case "Humon":
        obj = new Humon(kind);
        break;
    case "Animal":
        obj = new Animal(kind);
        break;
    case "Plant":
        obj = new Plant(kind);
        break;
}

     Şimdi burada sorun yok. Yazdığımız kod bu şekilde de çalışır. Her bir sınıf eklediğimizde case yapısına yeni bir ekleme yaparak bunu yazabiliriz. Bu yapıyı delegation dictionary ile çözümlemeye çalışalım.

Living obj = null;

var map = new Dictionary<string, Living>();
map.Add("Humon", new Humon(kind));
map.Add("Animal", new Animal(kind));
map.Add("Plant", new Plant(kind));

if (map.ContainsKey(kind))
{
    obj = map[kind];
}

   Buradaki kodu inceleyelim. Burada bir dictionary tanımladık ve parametrelerimize karşılık hangi sınıfın çalışacağını söyledik. Daha sonra hangi parametre çağrılırsa dictionary'dan ona ait sınıf çağrılacak. Bunun kullanımı sizce de daha güzel değil mi ? Şimdi son olarak reflection yapısına göz atalım.

 Living obj = null;
 obj = (Living)Activator.CreateInstance(Type.GetType("namespace.classname"),kind);

     Burada reflection ile sınıfları dinamik olarak çağırabiliyoruz. Dinamik yapıdan dolayı namespace uzantısını vermek zorundayız, aksi halde sınıfın konumunu bulamayacağı için hata verecektir. Burada yine dictionary veya benzer bir yapı kullanılarak geliştirme yapılabilir. Burada her yiğidin yoğurt yiyişi ayrıdır prensibiyle istediğinizi kullanabilirsiniz. Ama ben şuan için kararımı 2.yapıdan kullandım. O bana daha estetik gibi geldi. Tabi bunların birbirine göre avantaj ve dezavantajları vardır. Salt doğru pek olmuyor zaten bu işlerde. O an ihtiyaç gören neyse o yapı kullanılabilir.

     Üzerinde düşünülmüş kodlar yazmak dileğiyle. Hoşça Kalın.

Hiç yorum yok:

Yorum Gönder