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

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

One Comments

Bir cevap yazın