Это вопрос о концепции функции, выполняющей только одно.Это не будет иметь смысла без некоторых соответствующих отрывков для контекста, поэтому я приведу их здесь.Они появляются на стр. 37-38:
Чтобы сказать это иначе, мы хотим иметь возможность читать программу, как если бы это был набор абзацев TO, каждый из которых описывает текущий уровеньабстракция и ссылки на последующие абзацы TO на следующем уровне вниз.
Чтобы включить настройки и разрывы, мы включаем настройки, затем включаем содержимое тестовой страницы и затем включаем разрывы.Чтобы включить настройки, мы включаем настройку набора, если это набор, затем включаем обычную настройку.
Оказывается, что программистам очень трудно научиться следовать этому правилу и писать функциикоторые остаются на одном уровне абстракции.Но изучение этого трюка также очень важно.Это ключ к тому, чтобы функции были короткими и чтобы они выполняли «одну вещь». Создание кода, читаемого как нисходящий набор абзацев TO, является эффективным способом поддержания согласованности уровня абстракции.
Затем он приводит следующий пример плохого кода:
public Money calculatePay(Employee e)
throws InvalidEmployeeType {
switch (e.type) {
case COMMISSIONED:
return calculateCommissionedPay(e);
case HOURLY:
return calculateHourlyPay(e);
case SALARIED:
return calculateSalariedPay(e);
default:
throw new InvalidEmployeeType(e.type);
}
}
и объясняет проблемы с ним следующим образом:
Есть несколько проблем с этой функцией.Во-первых, он большой, и когда добавляются новые типы сотрудников, он будет расти.Во-вторых, это очень четко делает больше, чем одно.В-третьих, он нарушает принцип единой ответственности7 (SRP), поскольку существует более чем одна причина для его изменения.В-четвертых, он нарушает принцип Open Closed Principle8 (OCP), поскольку он должен меняться при каждом добавлении новых типов.
Теперь мои вопросы.
Для начала, мне ясно, как он нарушаетOCP, и мне ясно, что только это делает его плохим дизайном.Однако я пытаюсь понять каждый принцип, и мне не ясно, как применяется SRP.В частности, единственная причина, по которой я могу представить изменение этого метода, - это добавление новых типов сотрудников.Существует только одна «ось изменения».Если детали расчета необходимо изменить, это повлияет только на такие подметоды, как "CalcualHourlyPay ()"
Кроме того, хотя, в некотором смысле, очевидно, что он делает 3 вещи, все эти три вещи находятся на одном уровнеабстракция, и все они могут быть помещены в абзац TO, не отличающийся от примера: Чтобы рассчитать оплату за сотрудника, мы рассчитываем комиссионную плату, если сотрудник получает комиссию, почасовую оплату, если он является почасовым, и т. д. .Таким образом, помимо нарушения OCP, этот код, похоже, соответствует другим требованиям Мартина к чистому коду, хотя он утверждает, что это не так.
Может кто-нибудь объяснить, что мне не хватает?
Спасибо.