Etiket Arşivi extract method

Refactoring 2: Yeni Metod Oluşturma(Extract Method) Yöntemi

Merhabalar.
Refactoring yöntemlerini incelemeye başlıyoruz. İlk olarak Extract Method yöntemi:

Nedir?

void printOwing(double amount) {
    printBanner();

    //print details
    System.out.println ("name:" + _name);
    System.out.println ("amount" + amount);
}

graphics/arrow.gif

void printOwing(double amount)
{
     printBanner();
     printDetails(amount);
}
void printDetails(double amount)
{
     System.out.println ("name:" + _name);
     System.out.println ("amount" + amount);
}

 

Neden?

* Mümkün olduğunca uzun ve commente(yorum satırı) ihtiyaç duyan kod parçalarından kaçınmak lazım.
* Bunun yerine kısa ve güzel isimlendirilmiş metodlar kullanılmalı. Çünkü:
– Küçük(core sayılabilecek) metodlar ihtiyaç duyulan başka yerlerde de kullanılabilir.
– Küçük metodları(kodu) okumak commenti okumaktan daha kolaydır.

Nasıl?

* Yeni bir metod oluşturulup(create), ne yaptığını(nasıl yaptığını değil) anlatan güzel bir isim verilir.
– Ayıklanacak kod kısaysa ve anlamlı bir isim konulamayacaksa ayıklanmaması daha iyidir.
* İlgili kod yeni metoda kopyalanır.
* Kodun içinde değişken olup olmadığına bakılır.
– Daha önceden tanımlanmış, alınacak kodun sonrasında da kullanılan değişkenler parametre olarak verilebilir.
– Sadece seçilen kısımda kullanılan değişkenler, oluşturulan metodun içinde tanımlanır.
– Seçilen kodda değişkenin değeri değişiyorsa, metodda return edilebilir.
* Kullanılan tüm değişkenler tarandıktan sonra, kod silinip, söz konusu bçlümde yeni metod çağırılır.
* Derleme ve test.

Örnek

Aşağıdaki java konsol uygulaması üzerinden mevzuyu örneklemeye çalışayım:

“Refactoring” adında bir adet sınıf oluşturuyorum. “Main” metodunda, bir kitapçıdaki kitapların isim ve fiyatlarını konsolda listeliyor:


public class Refactoring {

 public static void main(String[] args) {

 ArrayList kitapListe=new ArrayList();

 double[] satisFiyat=new double[3];
 double kar = 0.25;

 // başlığı yaz
 System.out.println ("**************************");
 System.out.println ("******** Kitaplar ********");
 System.out.println ("**************************");

 // kitaplar ekleniyor
 kitapListe.add(new Kitaplar( "Dublörün Dilemması",10.0));
 kitapListe.add(new Kitaplar( "Aşkın Gözyaşları",5.0));
 kitapListe.add(new Kitaplar( "Kime Emanet",6.0));

 // kitapların fiyatları hesaplanıyor
 for(int i=0;i<3;i++)
 {
 satisFiyat[i]=kitapListe.get(i).gelisFiyat*(1+kar);
 }

 // Kitap listesi yazdırılıyor
 for(int i=0;i<3;i++)
 {
 System.out.println(kitapListe.get(i).isim+" "+satisFiyat[i]+" TL");
 }
 }
}

Bir tane de “Kitaplar” sınıfı oluşturuyorum. Kitabın ismi ve kitapçıya geliş fiyatını barındırıyor.

public class Kitaplar
{
 String isim;
 Double gelisFiyat=0.0;

 public Kitaplar(String isim, double gelisFiyat)
 {
 this.isim=isim;
 this.gelisFiyat=gelisFiyat;
 }

 public String getIsim() {
 return isim;
 }

public void setIsim(String isim) {
 this.isim = isim;
 }

public Double getGelisFiyat() {
 return gelisFiyat;
 }

public void setGelisFiyat(Double gelisFiyat) {
 this.gelisFiyat = gelisFiyat;
 }

}

 

Şimdi adım adım Extract Method yöntemimizi uygulayalım:
1-) Yukarıda belirtildiği gibi, yorum satırına(comment) ihtiyaç bırakmayacak şekilde başlık kısmını güzel isimlendirilmiş bir metoda çıkarıyorum(main metodum static olduğu için diğer metodları da static oluşturuyorum):

static void basligiYazdir()
	{
	    System.out.println ("**************************");
        System.out.println ("******** Kitaplar ********");
        System.out.println ("**************************");
	}

2-) Sonra kitapları ArrayList‘e eklemek için bir metod oluşturuyorum.. ama ArrayList kodun devamında da kullanılacağı için “return” etmem gerekiyor:

static ArrayList kitaplariListeyeEkle()
	{
		ArrayList kitapListe=new ArrayList();

		kitapListe.add(new Kitaplar( "Dublörün Dilemması",10.0));
        kitapListe.add(new Kitaplar( "Aşkın Gözyaşları",5.0));
        kitapListe.add(new Kitaplar( "Kime Emanet",6.0));

        return kitapListe;
	}

Kodları çıkardığım yerlerden bu metodları çağırınca main metodu aşağıdaki gibi oldu:

public static void main(String[] args) {

 ArrayList kitapListe=new ArrayList();

 double[] satisFiyat=new double[3];
 double kar = 0.25;

 basligiYazdir();

 kitapListe=kitaplariListeyeEkle();

 // kitapların fiyatları hesaplanıyor
 for(int i=0;i<3;i++)
 {
 satisFiyat[i]=kitapListe.get(i).gelisFiyat*(1+kar);
 }

 // Kitap listesi yazdırılıyor
 for(int i=0;i<3;i++)
 {
 System.out.println(kitapListe.get(i).isim+" "+satisFiyat[i]+" TL");
 }
 }

3-) Fiyat hesaplamaları için de bir metod oluşturabilirim. Main kısmı olduğu için ne kadar “extract method” yapsam kardır.
Fiyat hesaplama kısmında kitapListe ArrayList’i kullanılıyor ve herhangi bir değişikliğe uğramıyor. O zaman bunu parametre olarak gönderebilirim.
satisFiyat dizisinin ise hem burada içeriği oluşturuluyor, hem de kodun devamında kullanılıyor. O halde “return” edebilirim bu değeri.
Son olarak ise kar değişkenine baktığımda sadece bu kısımda kullanıldığını görüyorum. O halde bu değişkeni yeni metodun içinde de tanımlasam olur. Yani:

static double[] fiyatlariHesapla(ArrayList kitapListe)
	{
		double[] satisFiyat=new double[3];
		double kar = 0.25;

		for(int i=0;i<3;i++)
        {
        	satisFiyat[i]=kitapListe.get(i).gelisFiyat*(1+kar);
        }

		return satisFiyat;
	}

4-) Son olarak listeyi konsola yazdırma kısmını da metoda çıkaralım. Bu kısımda kitapListe ArrayList‘imiz ve satisFiyat dizimiz kullanılıyor ve sadece değerleri görüntüleniyor. O zaman bunları parametre olarak göndermem yeterli:

static void kitapListesiniYazdir(ArrayList kitapListe, double[] satisFiyat)
	{
		for(int i=0;i<3;i++)
        {
        	System.out.println(kitapListe.get(i).isim+"   "+satisFiyat[i]+" TL");
        }
	}

..ve işte sınıfımızın son hali:

public class Refactoring {

	public static void main(String[] args) {

        ArrayList kitapListe=new ArrayList();
        double[] satisFiyat=new double[3];

        basligiYazdir();

        kitapListe=kitaplariListeyeEkle();

        satisFiyat=fiyatlariHesapla(kitapListe);

        kitapListesiniYazdir(kitapListe, satisFiyat);

    }

	static void basligiYazdir()
	{
		System.out.println ("**************************");
        System.out.println ("******** Kitaplar ********");
        System.out.println ("**************************");
	}

	static ArrayList kitaplariListeyeEkle()
	{
		ArrayList kitapListe=new ArrayList();

		kitapListe.add(new Kitaplar( "Dublörün Dilemması",10.0));
        kitapListe.add(new Kitaplar( "Aşkın Gözyaşları",5.0));
        kitapListe.add(new Kitaplar( "Kime Emanet",6.0));

        return kitapListe;
	}

	static double[] fiyatlariHesapla(ArrayList kitapListe)
	{
		double[] satisFiyat=new double[3];
		double kar = 0.25;

		for(int i=0;i<3;i++)
        {
        	satisFiyat[i]=kitapListe.get(i).gelisFiyat*(1+kar);
        }

		return satisFiyat;
	}

	static void kitapListesiniYazdir(ArrayList kitapListe, double[] satisFiyat)
	{
		for(int i=0;i<3;i++)
        {
        	System.out.println(kitapListe.get(i).isim+"   "+satisFiyat[i]+" TL");
        }
	}
}

Kendinize çook iyi davranın.

Kaynak: http://sourcemaking.com/refactoring/extract-method

 

Bu sayfa 1314 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