Metodu Metot Nesnesine Dönüştürme (Replace Method with Method Object)

Eki 24th, 2011 | Yazar: Özcan Acar | Kategori: Refactoring

Metodu Metot Nesnesine Dönüştürme (Replace Method with Method Object) refactoring metodu aşağıdaki durumlarda kullanılabilir:

  • Çok sayıda lokal değişken Yeni Metot Oluşturma (Extract Method) refactoring metodunun kullanımını engelliyor.
  • Uzun bir metot bünyesinde tanımlanan lokal değişkenlerin kapsama alanı (scope) geniş yani lokal değişkenler metodun sonuna kadar kullanılıyor.
  • Metot SRP tasarım prensibi ile uyumlu degil yani refactor etmek istediğimiz metot, bünyesinde bulunduğu sınıfa yeni bir sorumluluk yüklüyor.

Metodu Metot Nesnesine Dönüştürme (Replace Method with Method Object) refactoring metodu ile yeni bir sınıf oluşturulur ve uzun metod bu sınıfa taşınır. Metot bünyesinde tanımlanmış olan lokal değişkenler sınıf değişkenleri olarak değiştirilir. Metodun yer aldığı eski sınıf bünyesinde yeni oluşturulan sınıftan bir nesne oluşturularak, yeni sınıf bünyesindeki metoda delege edilir.

Aşağıda yer alan örnekte calculatePrice metodu Order sınıfına yeni bir sorumluluk yüklediği için Metodu Metot Nesnesine Dönüştürme (Replace Method with Method Object) refactoring metodunu kullanarak PriceCalculator isminde yeni bir sınıf oluşturuyor ve calculatePrice metodunu bu sınıfa taşıyoruz.


package com.kurumsaljava.refactoring.replaceMethodwithMethodObject;

public class Order {

	private double price;
	private String locale;

	public static Double calculatePrice(final Order order) {
		Double result = new Double(0);
		final String locale = order.getLocale();
		final double price = order.getPrice();
		double taxRate = 0;
		if (locale != null && locale.equals("de_DE")) {
			taxRate = 19.00;
			final Double tax = Double.valueOf((price / 100) * taxRate);
			result = Double.valueOf(tax.doubleValue() + price);
		} else if (locale != null && locale.equals("tr_TR")) {
			taxRate = 18.00;
			final Double tax = Double.valueOf((price / 100) * taxRate);
			result = Double.valueOf(tax.doubleValue() + price);
		}
		return result;
	}

	public double getPrice() {
		return price;
	}

	public String getLocale() {
		return locale;
	}
}


package com.kurumsaljava.refactoring.replaceMethodwithMethodObject;

public class PriceCalculator {

	public Double calculatePrice(final Order order) {
		Double result = new Double(0);
		final String locale = order.getLocale();
		final double price = order.getPrice();
		double taxRate = 0;
		if (locale != null && locale.equals("de_DE")) {
			taxRate = 19.00;
			final Double tax = Double.valueOf((price / 100) * taxRate);
			result = Double.valueOf(tax.doubleValue() + price);
		} else if (locale != null && locale.equals("tr_TR")) {
			taxRate = 18.00;
			final Double tax = Double.valueOf((price / 100) * taxRate);
			result = Double.valueOf(tax.doubleValue() + price);
		}
		return result;
	}
}

Bu işlemin ardında Order sınıfını aşağıdaki şekilde değiştiriyoruz.


package com.kurumsaljava.refactoring.replaceMethodwithMethodObject;

public class Order {

	private double price;
	private String locale;

	public static Double calculatePrice(final Order order) {
		return new PriceCalculator().calculatePrice(order);
	}

	public double getPrice() {
		return price;
	}

	public String getLocale() {
		return locale;
	}
}

Bu değişikliğin ardından Order sınıfında bulunan fiyat hesaplama metodunu PriceCalculator sınıfına taşımış olduk. Order sınıfı fiyat hesaplama işlemi için yeni oluşturduğumuz PriceCalculator sınıfını kullanır hale geldi.


EOF (End Of Fun)
Özcan Acar

Share Button

Özcan Acar

Bilgisayar mühendisi olan Özcan Acar 1997 yılından beri programcı olarak çalışıyor.

KurumsalJava.com, SmartHomeProgrammer.com ve Mikrodevre.com adresleri altında blog yazıyor. Kurduğu BTSoru.com'da ona yazılımla ile ilgili sorularınızı yöneltebilirsiniz. Pratik Programcı Yayınları bünyesinde Pratik Spring, Pratik Agile, Pratik Git ve Design Patterns ismini taşıyan kitapları bulunmaktadır. 21.12.2009 tarihinde Java Champion olarak seçildi.
  • Share/Bookmark
yorum yok. | 2.108 kez okundu |

1 Yıldız2 Yıldız3 Yıldız4 Yıldız5 Yıldız (Değerlendirme bulunmuyor)
Loading ... Loading ...
Tags: ,

BU YAZI İÇİN BİR YORUM YAPABİLİRSİNİZ.