Refactoring 5: Açıklayıcı Değişken Kullanımı (Introduce Explaining Variable)

Merhabalar.

Bu yazıda Açıklayıcı Değişken Kullanımı – Introduce Explaining Variable yöntemini anlatmaya çalışacağım.
(Çeviri için arkadaşım Mesut Fatih Elevli’ye sevgiler..)

Nedir?

if ((platform.toUpperCase().indexOf("MAC") > -1) &&
(browser.toUpperCase().indexOf("IE") > -1) &&
wasInitialized() && resize > 0 ) {
// do something
}

extractmethod

final boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1;
final boolean isIEBrowser = browser.toUpperCase().indexOf("IE") > -1;
final boolean wasResized = resize > 0;

if (isMacOs && isIEBrowser && wasInitialized() && wasResized) {
// do something
}

Neden?

Kimi zaman kod içerisinde -belki de- zamanla koda yeni caseler eklenmesiyle okunması zor kompleks ifadeler oluşur.

Bu ifadeler okunurluğunu ve yönetilebilirliğini artırmak için parçalanıp, değişkenlere atanabilir.

Elbette oluşturulan bu değişkenlerin güzel isimlendirilmesi(yukarıdaki örnekte isMacOs, wasResized kullanımları gibi) ziyadesiyle önem arz eder.

Bazı durumlarda bu yöntem yerine Extract Method yöntemini kullanmak daha efektif olabilir. Mesela bu ifadeler yerel değişkenler içerip, tamamı tek bir yerde kullanılıyorsa veya buradaki değişkenlerin tamamı global değişkense Extract Method kullanımı tavsiye edilebilir.

Nasıl?

  • Öncelikle anlaşılır şekilde isimlendirilmiş bir değişken oluşturulur ve sözkonusu kompleks ifade bu değişkene atanır.
  • Daha sonra ifadelerin yerine değişkenler yazılır.
  • Derleme ve test.

Örnek

Yöntemimizi şöyle basit bir fiyat hesaplamasıyla inceleyebiliriz. 500 adet üzerindeki siparişlere %5 indirim yapılan bir ürün için toplam fiyatı hesaplıyoruz:

double fiyat() {
    // fiyat = taban fiyat - indirim + nakliye
     return _miktar * _adetFiyati -
        Math.max(0, _miktar - 500) * _adetFiyati * 0.05 +
        Math.min(_miktar * _adetFiyati * 0.1, 100.0);
}

İlk etapta taban fiyat hesaplamasını ayırıyoruz.

double fiyat() {
     // fiyat = taban fiyat - indirim + nakliye
     final double tabanFiyat = _miktar * _adetFiyati;

     return tabanFiyat -
         Math.max(0, _miktar - 500) * _adetFiyati * 0.05 +
         Math.min(_miktar * _adetFiyati * 0.1, 100.0);
}

Nakliye masrafının hesaplamasında da taban fiyat üzerinden hesaplama yapılıyor. Dolayısıyla yeni değişkenimizi oraya da koyabiliriz.

double fiyat() {
    // fiyat = taban fiyat - indirim + nakliye
    final double tabanFiyat = _miktar * _adetFiyati;

    return tabanFiyat -
        Math.max(0, _miktar - 500) * _adetFiyati * 0.05 +
        Math.min(tabanFiyat * 0.1, 100.0);
}

Şimdi toplam indirimi de değişkene alalım:

double fiyat() {
    // fiyat = taban fiyat - indirim + nakliye
    final double tabanFiyat = _miktar * _adetFiyati;
    final double miktaraGoreIndirim = Math.max(0, _miktar - 500) * _adetFiyati * 0.05;

    return tabanFiyat - miktaraGoreIndirim + Math.min(tabanFiyat * 0.1, 100.0);
}

Nakliyeyi de ayırdık mı gayet okunur ve temiz bir kodumuz oluşuyor.

double fiyat() {
    final double tabanFiyat = _miktar * _adetFiyati;
    final double miktaraGoreIndirim = Math.max(0, _miktar - 500) * _adetFiyati * 0.05;
    final double nakliye = Math.min(tabanFiyat * 0.1, 100.0);

    return tabanFiyat - miktaraGoreIndirim + nakliye;
}

Bu örnekte tüm değişkenler global değişken olduğu için Extract Method yöntemi de kullanılabilir. Şimdi üstadın tavsiyesi üzerine bu yöntemi uygulayalım.

Örneği başa sarıyoruz.

double fiyat() {
    // fiyat = taban fiyat - indirim + nakliye
     return _miktar * _adetFiyati -
        Math.max(0, _miktar - 500) * _adetFiyati * 0.05 +
        Math.min(_miktar * _adetFiyati * 0.1, 100.0);
}

Taban fiyatı bu defa değişkene değil metoda çıkartıyoruz:

double fiyat() {
    // fiyat = taban fiyat - indirim + nakliye
    return tabanFiyat() -
        Math.max(0, _miktar - 500) * _adetFiyat * 0.05 +
        Math.min(tabanFiyat() * 0.1, 100.0);
}
private double tabanFiyat() {
    return _miktar * _adetFiyat;
}

Daha sonra tüm ifadeleri metodlara çıkarıyoruz:

double fiyat() {
    return tabanFiyat() - miktaraGoreIndirim () + nakliye();
}
 
private double miktaraGoreIndirim () {
    return Math.max(0, _miktar - 500) * _adetFiyat * 0.05;
}
 
private double nakliye() {
    return Math.min(tabanFiyat() * 0.1, 100.0);
}
 
private double tabanFiyat() {
    return _miktar * _adetFiyat;
}

Extract Method kullanımı, düzenlediğimiz ifadenin programın farklı yerlerinde de kullanımına imkan sağlayacağı için daha esnek bir yapı oluşturabilir. Bu yüzden ekstradan çaba gerektirmeyen durumlarda daha faydalı bir yöntem olabilir. Ama bolca lokal değişkenlerin olduğu ifadeler için Introduce Explaining Variable yöntemi kullanılabilir.

Kaynak: https://sourcemaking.com/refactoring/introduce-explaining-variable

Kendinize çook iyi davranın.

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