IF Enflasyonundan Kurtulmak İçin Dictionary Kullanımı

Merhabalar.

Daha önce temel manada Dictionary kullanımından bahsetmiştim.

Dictionary yapıları anahtar-değer(key-value) ikilisiyle içinde değer tutan generic yapılar. Burada farklı bir kullanımından bahsetmek istiyorum.

Dictionary kullanırken value olarak method atayabiliyoruz.

Atamak istediğimiz bu metod geriye değer dönen bir metod olacaksa Func<parametre1,parametre2.., return_tipi> ifadesiyle;
değer dönmeyecek bir metod olacaksa Action<parametre1,parametre2….> ifadesiyle set ediyoruz.

Bilhassa IF enflasyonu olan yerlerde bu şekilde gayet temiz bir iş yapabiliyoruz.

Şimdi bir banka için, mesela combobox’tan seçilip gönderilen değerlere göre, çeşitli raporlar hazırlayan aşağıdaki gibi bir metodumuz olsun:

private void RaporHazirla(int raporTuru)
{
	if (raporTuru == 1)
	{
		SubeBazliGunlukIslemRaporu();
	}
	else if (raporTuru == 2)
	{
		PersonelBazliGunlukIslemRaporu();
	}
	else if (raporTuru == 3)
	{
		MusteriBazliGunlukIslemRaporu();
	}
	else if (raporTuru == 4)
	{
		ToplamGunlukIslemRaporu();
	}
	else if (raporTuru == 5)
	{
		MessageBox.Show("Bu rapor 01.01.2015 tarihinden itibaren verilememektedir.");
	}
}

Burada bir Dictionary oluşturup, key olarak raporTuru‘nu, value olarak da rapor oluşturan metodları ekleyebilirim.

Ama burada bir problemimiz var! Son casede bir metod çağırılmıyor. Ama buradan da bir metod çağırmamız gerekiyor.

Yani:

private void RaporYokUyari()
{
    MessageBox.Show("Bu rapor 01.01.2015 tarihinden itibaren verilememektedir.");
}
private void RaporHazirla(int raporTuru)
{
	if (raporTuru == 1)
	{
		SubeBazliGunlukIslemRaporu();
	}
	else if (raporTuru == 2)
	{
		PersonelBazliGunlukIslemRaporu();
	}
	else if (raporTuru == 3)
	{
		MusteriBazliGunlukIslemRaporu();
	}
	else if (raporTuru == 4)
	{
		ToplamGunlukIslemRaporu();
	}
	else if (raporTuru == 5)
	{
		RaporYokUyari();
	}
}

gibi.

Artık Dictionary’mi oluşturabilirim. Global değişken olarak oluşturuyorum:

Dictionary<long?, Action> _dictRaporlar = new Dictionary<long?, Action>();

Burada value’yu Action tipinde tanımlamam demek, ekleyeceğim metodların tamamının void olması demek.
Eğer örneğin 2 int parametre alıp string bir sonuç dönen metodlar kullanacaksam(tabi bu defa da metodların tamamının parametre tipleri ve dönüş tipi aynı olmak zorunda. Ama object kullanılarak biraz esnetilebilir.) Action yerine Func<int,int,string> yazmam gerekirdi.

Her neyse şimdi Dictionary’nin içeriğini oluşturalım:

private void raporDictionaryOlustur()
{
	_dictRaporlar[1] = new Action(SubeBazliGunlukIslemRaporu);
	_dictRaporlar[2] = new Action(PersonelBazliGunlukIslemRaporu);
	_dictRaporlar[3] = new Action(MusteriBazliGunlukIslemRaporu);
	_dictRaporlar[4] = new Action(ToplamGunlukIslemRaporu);
	_dictRaporlar[5] = new Action(RaporYokUyari);
} 

Son tahlilde RaporHazirla metodumu aşağıdaki gibi ziyadesiyle sade bir şekilde düzenliyorum:

private void RaporHazirla(int raporTuru)
{
	 _dictRaporlar[raporTuru].Invoke();
}

Kendinize çook iyi davranın.

 Bu sayfa 964 kez görüntülendi

It's only fair to share...Share on LinkedInShare on FacebookShare on Google+Tweet about this on TwitterShare on Tumblr
Benzer Konular
  1. Çok güzel anlatmışsın hocam eline sağlık.

Yorum Yap


Not - Bunları KullanabilirsinizHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>