Koşulları Parçalarına Ayırma (Reverse Conditional)

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

TaxCalculator sınıfı, uygulamanın kullanıldığı ülkeye bağlı olarak katma değer vergisini ihtiva eden fiyatı hesaplamak için kullanılmaktadır.


package com.kurumsaljava.refactoring.reverseconditional;

<span id="more-1415"></span>

public class TaxCalculator{
         private static final double TAX_RAT_GERMANY = 19.00;
         private static final double TAX_RAT_TURKISH_REPUBLIC = 18.00;

         public Double calculate(String locale, double price){
                  Double result = new Double(0.0);

                  if(locale != null && locale.equals("de_DE")){
                           Double tax = Double.valueOf( (price / 100 ) * TAX_RAT_GERMANY);
                           result = Double.valueOf(tax.doubleValue() + price);
                  }
                  else if(locale != null && locale.equals("tr_TR")){
                           Double tax = Double.valueOf( (price / 100) * TAX_RAT_TURKISH_REPUBLIC);
                           result = Double.valueOf(tax.doubleValue() + price);
                  }
         return result;
         }
}


calculate gibi metotlarda karşılaştığımız en büyük sorunlardan birisi if/else blokları içinde mantıksal operatörler kullanılarak bir takım koşulların tanımlanması ve bu koşullara bağımlı olarak bazı işlemlerin yapılmasıdır. Bu tür bir programlama tarzı ne yazık ki uzun ve anlaşılması zor metotların oluşmasına sebep olmaktadır. calculate metoduna baktığımızda if/else bünyesinde ne olup bittiğini belki anlamaktayız, lakın neden bunun yapıldığını anlamak her zaman mümkün olmamaktadır.

Bahsettiğim sorunları ortadan kaldırmak için Reverse Conditional refactoring metodunu kullanabiliriz.


package com.kurumsaljava.refactoring.reverseconditional;

public class TaxCalculator {
         private static final String LOCALE_DE = "de_DE";
         private static final String LOCALE_TR = "tr_TR";
         private static final double TAX_RAT_GERMANY = 19.00;
         private static final double TAX_RAT_TURKISH_REPUBLIC = 18.00;

         public Double calculate(String locale, double price) {
                  Double result = new Double(0.0);

                  if (isCountryGermany(locale)) {
                           result = calculatePrice(price, locale);
                  } else if (isCountryTurkishRepublic(locale)) {
                           result = calculatePrice(price, locale);
                  }
                  return result;
         }

         private boolean isCountryTurkishRepublic(String locale) {
                  return locale != null && locale.equals(LOCALE_TR);
         }

         private Double calculatePrice(double price, String locale) {
                  Double result;
                  double taxRate = 0;

                  if (isCountryGermany(locale)) {
                           taxRate = TAX_RAT_GERMANY;
                  } else if (isCountryTurkishRepublic(locale)) {
                           taxRate = TAX_RAT_TURKISH_REPUBLIC;
                  }

                  Double tax = Double.valueOf( (price / 100) * taxRate);
                  result = Double.valueOf(tax.doubleValue() + price);
                  return result;
         }

         private boolean isCountryGermany(String locale) {
                  return locale != null && locale.equals(LOCALE_DE);
         }
}

Yeni implmentasyonu gözden geçirdiğimizde calculate metodunda olup bitenlerin ne anlama geldiğini daha iyi algılayabilmekteyiz. Reverse Conditional refactoring metodunu kullanarak if/else koşullarını parçalara böldük ve yeni metotlar oluşturduk. Kullandığımız metot isimleri yapılan işlemi algılamamızı daha kolaylaştırmakta ve bu şekilde kodun okunulurluk derecesi artmaktadır.


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
1 yorum | 1.805 kez okundu |

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

1 YORUM “Koşulları Parçalarına Ayırma (Reverse Conditional)”

  1. […] Koşulları Parçalarına Ayırma (Reverse Conditional) […]

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