Структура кода
- Дробите логику класса на небольшие методы
Каждый метод должен решать одну конкретную задачу. - Делите длинные выражения и литералы
Сложные выражения разбивайте на отдельные переменные с понятными именами. - Минимизируйте вложенность конструкций
Глубокая вложенность условий и циклов усложняет понимание кода. - Избегайте сложных конструкций управления потоком данными
Откажитесь от goto и чрезмерной рекурсии. - Добавляйте защитные ограничители в циклах
Всегда предусматривайте выход из потенциально бесконечных циклов. - Избегайте лишние else
Используйте ранний возврат (return) для упрощения логики.
Именование и понятность
- Давайте самодостаточные и понятные имена
Имя должно полностью отражать назначение элемента. - Стремитесь писать самодокументируемый код
Хороший код не требует комментариев для объяснения. - Избегайте магические числа
Выносите числовые значения в константы с осмысленными именами. - Явное лучше неявного
Предпочитайте явное указание типов, зависимостей и поведения.
Принципы SOLID
- Single Responsibility Principle (SRP)
Каждый класс должен иметь одну причину для изменения. - Open/Closed Principle (OCP)
Классы должны быть открыты для расширения, но закрыты для модификации. - Liskov Substitution Principle (LSP)
Объекты базового типа должны быть заменяемы объектами его подтипов. - Interface Segregation Principle (ISP)
Не заставляйте классы реализовывать методы, которые им не нужны. - Dependency Inversion Principle (DIP)
Код должен зависеть от абстракций, а не от конкретных реализаций.
Архитектурные принципы
- Стремитесь к слабой связностью между модулями
Используйте IoC, DI, Service Locator для уменьшения зависимостей. - Создавайте классы с логической связностью
Все методы и свойства класса должны быть логически связаны. - Инкапсулируйте то, что изменяется
Скрывайте детали реализации, которые могут измениться. - Разделяйте интерфейсы
Лучше много маленьких интерфейсов, чем один большой. - Принцип композиции над наследованием
Предпочитайте композицию классов наследованию.
Поддержка кода
- Don’t Repeat Yourself (DRY)
Не дублируйте код, выносите повторяющиеся части в отдельные методы. - You Aren’t Gonna Need It (YAGNI)
Не добавляйте функционал, который может пригодиться в будущем. - You Don’t Need It Anymore (YDNIA)
Удаляйте неиспользуемый код без сожаления. - Command-Query Separation (CQS)
Разделяйте методы на команды (изменяют состояние) и запросы (возвращают данные)
Практические принципы
- Keep It Simple, Stupid (KISS)
Выбирайте простые решения, избегайте излишней сложности. - Следуйте принципам безопасного программирования
Защищайте приложение от известных уязвимостей. - Не гонитесь за преждевременной оптимизацией
Сначала сделайте код правильным, затем быстрым. - Закон Деметры
Объект должен взаимодействовать только с ближайшими соседями.
Работа в команде
- Используйте парное ревью
Особенно при решении сложных задач. - Следуйте стандартам кодирования команды
Единообразие кода улучшает его понимание. - Документируйте API и архитектурные решения
Ключевые решения должны быть задокументированы.
Тестирование
- Пишите тестируемый код
Проектируйте классы так, чтобы их было легко тестировать. - Автоматизируйте тестирование
Покрывайте код автотестами разных уровней (unit, integration, e2e). - Используйте TDD/BDD
Написание тестов до кода помогает лучше спроектировать решение.