Yazılım Mühendisliği

Eylül 29, 2008

Refactoring-4

Filed under: OOP,Refactoring — Yahya KOÇ @ 9:56 pm

Ö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 Yapın »

Henüz yorum yapılmamış.

RSS feed for comments on this post. TrackBack URI

Yorum bırakın

WordPress.com'da ücretsiz bir web sitesi ya da blog oluşturun.