el proceso entero con comentarios se puede seguir mediante el archivo de MoonEdit (programa muy chulo , gratis y sin peso apenas) replace parameter with method 
CODIGO INICIAL
public double getPrice(){ int basePrice = _quantity * _itemPrice; int discountLevel; if (_quantity > 300) discountLevel = 3; else if (_quantity > 200) discountLevel = 2; else discountLevel = 1; double finalPrice = discountedPrice (basePrice, discountLevel); return finalPrice;   }
   private double discountedPrice (int basePrice, int discountLevel) { if (discountLevel == 2) return basePrice * 0.1; elseif (discountLevel == 3) return basePrice * 0.2; else return basePrice * 0.05;   }CODIGO FINAL
public double getPrice()  { if (Discount.isEnoughQuantityForPlatinum(_quantity))   return getBasePrice() * Discount.PLATINUM.getPercentage(); elseif (Discount.isEnoughQuantityForPlus(_quantity))   return getBasePrice() * Discount.PLUS.getPercentage(); else   return getBasePrice() * Discount.NORMAL.getPercentage();    }       private int getBasePrice() { return _quantity * _itemPrice; } class Discount{ static final int MIN_QUANTITY_FOR_PLATINUM = 300;  static final int MIN_QUANTITY_FOR_PLUS = 200; 
 static final int PLATUNUM_LEVEL = 3; static final int PLUS_LEVEL = 2; static final int NORMAL_LEVEL = 1; static final float PLATINUM__PERCENTAGE = 0.2; static final float PLUS__PERCENTAGE = 0.1; static final float NORMAL_PERCENTAGE = 0,05;     public static final Discount NORMAL = new Discount (NORMAL_LEVEL , NORMAL_PERCENTAGE); public static final Discount PLUS = new Discount (PLUS_LEVEL , PLUS_PERCENTAGE);   public static final Discount PLATINUM = new Discount (PLATINUM_LEVEL , PLATINUM_PERCENTAGE);      private final int _level; private final float _percentage;   
   private Discount(int level,float percentage)    { _level = level; _percentage = percentage;   }   public getLevel()   { return _level;   }   public getPercentage()   { return _percentage;   }   public boolean isEnoughQuantityForPlus(quantity)   { if (quantity > MIN_QUANTITY_FOR_PLUS) return true; return false;   }      public boolean isEnoughQuantityForPlatinum(quantity)   { if (quantity > MIN_QUANTITY_FOR_PLATINUM) return true; return false;   } bad Smell: getPrice() -- long method , finalPrice variable is always the discount Calculated Price
refactoring used : 
    replace parameter with method <- making methods calls simpler 
invented name refactor  (i don´t know if its a current name for this) 
    introduce multible return points <- simplifying Conditional Expressions
    inline method <- componsing methods
    replace Magic Number with Symbolic constant <- organizing data
    replace type code with class <- organizing data
    move method <- move features between objects
    consolidate conditional expression <- simplifying conditional expressions
 
No hay comentarios:
Publicar un comentario