Чистый тест характеризуется удобочитаемостью: ясностью, простотой и выразительностью.
В тестах использовать паттерн «построение – операции – проверка».
Тесты не делают ничего лишнего, в них используются только действительно необходимые типы и функции.
Использовать наборы функций и служебных программ, использующих API.
Код тестов не такой эффективный, как код продукта.
Чтобы избежать дублирования, можно воспользоваться паттерном шаблонный метод.
Не более 1 assert в функции теста.
Одна концепция в тесте (1 тест – 1 проверка).
Характеристики чистых тестов:
– тесты должны выполняться быстро;
– тесты не зависят друг от друга;
– тесты дают повторяемые результаты в любой среде.
Результатом выполнения теста должен быть логический признак (результат очевиден).
Тесты создаются своевременно непосредственно перед кодом продукта.
Класс должен начинаться со списка переменных.
Сначала перечисляются открытые статические константы.
Далее следуют приватные статические переменные.
За ними идут приватные переменные экземпляров.
Затем открытые функции.
Приватные вспомогательные функции, вызываемые открытыми функциями, непосредственно за самой открытой функцией (газетная статья).
Открытые переменные обычно не используют.
Предпочтительно объявлять переменные и вспомогательные функции приватными.
Иногда переменную или вспомогательную функцию приходится объявлять защищенной, чтобы иметь возможность обратиться к ней из класса.
Ослабление инкапсуляции должно быть последней мерой.
Классы должны быть максимально компактными.
Компактность класса определяется его ответственностью.
По имени класса можно определить его размер.
Краткое описание класса должно укладываться в 25 слов, без выражений «если», «и», «или», «но».
Принцип единой ответственности: SRP – класс или модуль должен иметь одну и только одну причину для изменения (одну ответственность).
Система должна состоять из множества мелких классов со сформированной структурой.
Класс взаимодействует с другими классами для реализации желаемого поведения системы.
Классы должны иметь небольшое количество переменных экземпляров.
Чем с большим числом переменных работает метод, тем выше связность этого метода со своим классом. Создавать классы с высокой связностью не рекомендуется.
Высокая связность означает, что методы и переменные класса взаимозависимы.
Рост числа переменных экземпляров свидетельствует о необходимости выделения класса.
Рефакторинг может удлинить программу.
Приватные методы, действие которых распространяется на небольшое подмножество класса, – признак возможности усовершенствований.
Структурирование проводится с учетом изменений.
Время, необходимое для понимания класса, падает почти до нуля.
Вероятность того, что одна из функций нарушит работу другой, ничтожно мала.
Принцип открытости-закрытости: классы должны быть открыты для расширений, но закрыты для модификации.
Структура системы должна быть такой, чтобы обновление системы создавало как можно меньше проблем.
В идеале новая функциональность должна реализовываться расширением системы, а не внесением изменений в существующий код.
С помощью интерфейсов и абстрактных классов класс изолируется от конкретных подробностей.
Принцип обращения зависимостей: классы системы должны зависеть от абстракций, а не от конкретных подробностей.
В программных системах фаза инициализации, в которой конструируются объекты приложения и «склеиваются» основные зависимости, должна отделяться от логики времени выполнения, получающей управление после ее завершения.
Инициализация – область ответственности.
Код инициализации пишется системно и отделен от логики времени выполнения.
Удобные идиомы не ведут к нарушению модульности.
Приложение ничего не знает о main или о процессе конструирования.