Refactoring 4: Geçici Değişkenlerin Sorguya Dönüştürülmesi (Replace Temp with Query)

Merhabalar.

Bu yazıda “replace temp with query”(geçici değişkenlerin sorguya dönüştürülmesi) yönteminden bahsetmeye çalışacağım.

Nedir?

double basePrice = _quantity * _itemPrice;

if (basePrice > 1000)

     return basePrice * 0.95;

else

     return basePrice * 0.98;

extractmethod

if (basePrice() > 1000)

     return basePrice() * 0.95;

else

     return basePrice() * 0.98;

...
double basePrice() {

     return _quantity * _itemPrice; }

Neden?

  • Global olmayan değişkenler geçici ve lokaldir. Bu zaman zaman kullanımı zorlaştırabilir. Örneğin tanımlandığı blok dışında kullanılamazlar.
  • Bilhassa uzun metodlarda değişkenleri sorgusal metodlara çevirmek faydalı bir yöntemdir.
  • Extract Method yöntemi öncesi, önemli bir adımdır.
  • Bu yöntemi değişkene tek bir değer(global değişkenler, hardcoded değerler vb.) tahsis edildiği durumlarda kullanmak gerekir. Değeri devamlı güncellenen bir değişkene uygulamak mümkün olsa bile uğraştırıcıdır.

Nasıl?

  • Bir kez atama yapılan değişkenlere bakılır. Java’da çalışıyorsanız bir kez atandığını garanti etmek için değişkenleri final yapabilirsiniz.
  • Değişkene atanan kısım alınır ve private bir metod tanımlanıp içine atılır.
  • Değişkenin kullanıldığı yerlerde yeni metod çağırılır ve değişken remove edilir.
  • Derleme ve test.

Örnek

Bir ürünün paket/koli fiyatını getiren bir metodumuz olsun. Paket fiyatına göre de indirimli fiyatı hesaplıyor.

Buradaki _miktar ve _adetFiyati global değişkenler.

double ucretGetir()
 {
      int paketFiyat = _miktar * _adetFiyati;
      double indirimOrani;

      if (paketFiyat > 1000) indirimOrani = 0.95;
      else indirimOrani = 0.98;

      return paketFiyat * indirimOrani;
 }

İlk etapta değişkenlerimizi final yaparak bir kez atama yapıldığını test edelim.

double ucretGetir()
 {
      final int paketFiyat = _miktar * _adetFiyati;
      final double indirimOrani;

      if (paketFiyat > 1000) indirimOrani = 0.95;
      else indirimOrani = 0.98;

      return paketFiyat * indirimOrani;
 }

paketFiyat hesaplamasını yeni bir metoda çıkarıyorum:

private int paketFiyat()
{
     return _miktar * _adetFiyati;
}

Değişkeni artık bu metoda eşitleyebilirim.

double ucretGetir()
 {
      final int paketFiyat = paketFiyat();
      final double indirimOrani;

      if (paketFiyat > 1000) indirimOrani = 0.95;
      else indirimOrani = 0.98;

      return paketFiyat * indirimOrani;
 }

Derleyip, test ediyoruz. Sonra asıl konumuz olan yöntemi uygulamaya başlıyoruz. Değişkeni kullandığım yerde direkt metodu çağırıyorum.

double ucretGetir()
 {
      final int paketFiyat = paketFiyat();
      final double indirimOrani;

      if (paketFiyat() > 1000) indirimOrani = 0.95;
      else indirimOrani = 0.98;

      return paketFiyat * indirimOrani;
 }

Derleyip, test ediyoruz. Daha sonra yerel değişkenimizi tamamen imha ediyoruz:

double ucretGetir()
 {
      final double indirimOrani;

      if (paketFiyat() > 1000) indirimOrani = 0.95;
      else indirimOrani = 0.98;

      return paketFiyat() * indirimOrani;
 }

Derleyip, test ediyoruz. Koda dikkatli baktığımızda indirimOrani için de aynı işlemleri uygulayabiliriz gibi gözüküyor. Bu defa biraz kestirmeden gidelim:

double ucretGetir()
 {
      final double indirimOrani = indirimOrani();

      return paketFiyat * indirimOrani;
 }

private int indirimOrani()
{
      if (paketFiyat() > 1000) return 0.95;
      else return 0.98;
}

..ve son yerel değişkenimizi de ortadan kaldırıyoruz:

double ucretGetir()
{
      return paketFiyat() * indirimOrani();
}

private int indirimOrani()
{
     if (paketFiyat() > 1000) return 0.95;
     else return 0.98;
}

private int paketFiyat()
{
     return paketFiyat * indirimOrani;
}

 

Kendinize çook iyi davranın.

Kaynak: http://sourcemaking.com/refactoring/replace-temp-with-query

 Bu sayfa 1965 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
Benzer Konular

Yorum Yap


Not - Bunları KullanabilirsinizHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>