Örneğimize devam ediyoruz.
Yaptığımız son değişikliklerden sonra sınıflarımız şu şekilde:
Bir sonraki adımımız EgitimTipi ve PersonelTuru değişkenleri bir enum altında toplamak olabilir.Bu adımı es geçerek yazımızın başından itibaren üzerinde durduğumuz “yarının ihtiyaçlarına da cevap verebilme” prensibine tekrar dönelim.Firma içinde zamanla arge personeli ve idare personeli dışında üçüncü bir tip çalışan grubu oluştuğunu varsayalım.Bu çalışan grubuna da HizmetPersoneli diyelim.Bu durumda halihazırdaki kod içerisinde yer alan switch içerisine bir case daha eklemek durumunda kalacağız.Burada refactoring’in Decompose Conditional yöntemini devreye sokacağız.Swicth içerisinde yer alan her case için ayrı bir çalışan grubu sınıfı oluşturacağız.
Personel Interface
public interface IPersonel { string Ad { get; set; } string Soyad { get; set; } double SicilNo { get; set; } double BrutMaas { get; set; } double AylikIndirimYuzdesi { get; set; } PersonelEgitimTuru EgitimTuru{ get; set;} } public enum PersonelEgitimTuru { LisansliPersonel=0, DoktoraliPersonel=1 }
ArgePersoneli sınıfına bakalım.
public class ArgePersoneli:IPersonel { ..... public double AylikIndirimYuzdesi { get { if (egitimTuru == PersonelEgitimTuru.DoktoraliPersonel) aylikIndirimYuzdesi=0.8; else if (egitimTuru == PersonelEgitimTuru.DoktoraliPersonel) aylikIndirimYuzdesi = 0.7; return aylikIndirimYuzdesi; } set { aylikIndirimYuzdesi = value; } } public PersonelEgitimTuru EgitimTuru { get { return egitimTuru; } set { egitimTuru = value; } } }
public class IdarePersoneli:IPersonel { .... public double AylikIndirimYuzdesi { get { return 0; } set { aylikIndirimYuzdesi = value; } } }
public class Bordro { public BordroParametreleri bordoParametleri = new GenelParametreler().BordroParametre; public IPersonel personel; public Bordro(IPersonel personel) { this.personel = personel; } public void BordroBas() { double netMaas =NetMaasHesapla(); //netMaas,brutMass,toplamKesinti Bordro Basma işlemi yapılır. } public double NetMaasHesapla() { double toplamKesinti; toplamKesinti = brutMaas * bordoParametleri.AylikKesintiYuzdesi*(1-personel.AylikIndirimYuzdesi); return personel.brutMaas - toplamKesinti; } }
ArgePersoneli sınıfı içerisinde EgitimTuru hala switch yapısı içerisinde.Bu tür veritabanından okunmayan statik değerler için Table Driven Methods kullanıyoruz.
if (egitimTuru == PersonelEgitimTuru.DoktoraliPersonel) aylikIndirimYuzdesi=0.8; else if (egitimTuru == PersonelEgitimTuru.DoktoraliPersonel) aylikIndirimYuzdesi = 0.7; return aylikIndirimYuzdesi;
yerine
public double AylikIndirimYuzdesi { get { aylikIndirimYuzdesi = BordroParametreleri.AylikIndirimYuzdesi(egitimTuru); return aylikIndirimYuzdesi; } set { aylikIndirimYuzdesi = value; } }
BordoParametreleri sınıfına Table Driven Methods prensibinden yola çıkarak aşağıdaki yapıyı yerleştiriyoruz.
public class BordroParametreleri { ..... static IDictionary<PersonelEgitimTuru, double> aylikIndirimListesi= new Dictionary<PersonelEgitimTuru, double>() { {PersonelEgitimTuru.LisansliPersonel,0.7}, {PersonelEgitimTuru.DoktoraliPersonel,0.8} }; public static double AylikIndirimYuzdesi (PersonelEgitimTuru egitimTuru) { return aylikIndirimListesi[egitimTuru]; }
Yorum bırakın