Уровни абстракции в контексте книги "Чистый код" Роберта Мартина относят к тому, как организована логика в коде и как она представлена. Каждый уровень абстракции представляет собой степень общего представления о выполняемых задачах, и они помогают сделать код более читаемым и поддерживаемым.
1. **Высший уровень абстракции** — это тот уровень, на котором описывается, что делает функция в контексте бизнес-логики. Это может быть, например, название функции `calculatePay`, которое указывает на то, что функция выполняет расчет зарплаты работника. Здесь мы рассматриваем функциональность с точки зрения пользователя или бизнес-логики, не углубляясь в детали реализации.
2. **Низший уровень абстракции** — это детали того, как именно реализуется задача. В данном случае, это различные алгоритмы, используемые для расчета зарплаты в зависимости от типа работника (например, `calculateCommissionedPay`, `calculateHourlyPay`, `calculateSalariedPay`). Здесь вы уже будете иметь дело с конкретными операциями (расчетами), которые выполняются для получения результата.
Теперь о **TO-абзацах**, которые упоминаются в книге. TO-абзацы представляют собой блоки кода, которые служат для ясной структуризации. Например, если вы смотрите на функцию `calculatePay`, можете выделить в ней абстракции:
- **TO** (что делает?) — функция вычисляет зарплату.
- **для кого?** — для разных типов работников.
- **как?** — с помощью вызовов других функций, которые пока не интересуют, но которые реализуют более низкий уровень абстракции (расчет зарплаты для каждого типа работника).
Автор кода должен стремиться к тому, чтобы функции не смешивали различные уровни абстракции. Если в одной функции одновременно используются высокие и низкие уровни абстракции (например, описание бизнес-логики и детали реализации), это затрудняет понимание кода. Каждая функция должна решать одну задачу и делать это на одном уровне абстракции.
В примере, приведенном вами, функция `calculatePay` делает слишком много: она проверяет тип работника и вызывает различные функции для расчета зарплаты. Она совмещает логику выбора типа работника (высший уровень) и операции расчета (низший уровень), что и делает ее менее читабельной. Лучше было бы разбить эту функцию на несколько частей, каждая из которых будет иметь свой уровень абстракции.
В заключение, для выделения уровней абстракции в коде полезно задавать себе вопросы о том, что делается, для кого это делается и как именно это происходит, а также стараться разделять разные уровни абстракции, чтобы каждая функция была ответственной за одну особую задачу.