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

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
0.00 avg. rating (0% score) - 0 votes

Bir cevap yazın