Разбиение условного оператора
Проблема
У вас есть сложный условный оператор (if-then/else или switch).
Решение
Выделите в отдельные методы все сложные части оператора: условие, then и else.
if (date.before(SUMMER_START) || date.after(SUMMER_END)) {
  charge = quantity * winterRate + winterServiceCharge;
}
else {
  charge = quantity * summerRate;
}
                                    if (isSummer(date)) {
  charge = summerCharge(quantity);
}
else {
  charge = winterCharge(quantity);
}
                                    if (date < SUMMER_START || date > SUMMER_END) 
{
  charge = quantity * winterRate + winterServiceCharge;
}
else 
{
  charge = quantity * summerRate;
}
                                    if (isSummer(date))
{
  charge = SummerCharge(quantity);
}
else 
{
  charge = WinterCharge(quantity);
}
                                    if ($date->before(SUMMER_START) || $date->after(SUMMER_END)) {
  $charge = $quantity * $winterRate + $winterServiceCharge;
} else {
  $charge = $quantity * $summerRate;
}
                                    if (isSummer($date)) {
  $charge = summerCharge($quantity);
} else {
  $charge = winterCharge($quantity);
}
                                    if date.before(SUMMER_START) or date.after(SUMMER_END):
    charge = quantity * winterRate + winterServiceCharge
else:
    charge = quantity * summerRate
                                    if isSummer(date):
    charge = summerCharge(quantity)
else:
    charge = winterCharge(quantity)
                                    if (date.before(SUMMER_START) || date.after(SUMMER_END)) {
  charge = quantity * winterRate + winterServiceCharge;
}
else {
  charge = quantity * summerRate;
}
                                    if (isSummer(date)) {
  charge = summerCharge(quantity);
}
else {
  charge = winterCharge(quantity);
}
                                    Причины рефакторинга
Чем длиннее кусок кода, тем сложнее понять, что он делает. Все усложняется ещё больше, когда код щедро приправлен условными операторами:
- 
пока вы разберётесь в том, что делает код в then, вы забываете, какое условие стояло в операторе;
- 
пока вы разбираетесь с else, вы забываете, что делал код вthen.
Достоинства
- 
Извлекая код условного оператора в методы с понятным названием, вы упрощаете жизнь тому, кто впоследствии будет этот код поддерживать (зачастую вам самим через месяц или два). 
- 
Кстати, этот рефакторинг применим и для коротких выражений в условиях оператора. Строка isSalaryDay()куда наглядней опишет то, что она делает, чем код сравнения дат.
Порядок рефакторинга
- 
Выделите условие в отдельный метод с помощью выделения метода. 
- 
Повторите выделение для thenиelseчасти оператора.