простой. Читается как хорошо написанная проза. Выражает намерение» • «Может читаться и улучшаться другими людьми, не только автором. Есть тесты. Хорошие имена. Один результат достигается одним способом. Интерфейс минимален и предельно понятен» Что есть хороший код?
очевидного способа улучшить этот код — всё уже продумано» • «Не содержит дублирования. Выражает собой идеи, заложенные в дизайн системы. Минимизирует количество сущностей (классов, методов, функций, …)» • «Видишь то, что ожидал бы увидеть. Выглядит так, как будто язык специально был создан для решения этой задачи»
так, а потом всё сделаем начисто, когда будет время» • «Заработало? Скорее берись за следующую задачу, сроки поджимают!» • «Просто сделай, чтобы хоть как-то работало, а дальше уже не наши проблемы»
• Делающие ровно одну вещь и при этом хорошо. Критерий: невозможно вынести часть кода в другую функцию. • Один уровень абстракции у всех операторов — необходимое условие для «ровно одной вещи».
• Два аргумента легко перепутать: char *strstr(const char *s1, const char *s2); • Можно уменьшить количество аргументов, объединяя их в класс: Circle makeCircle(double x, double y, double radius); Circle makeCircle(Point center, double radius);!
версий!). • Написали тест на верификацию нового поведения системы. • Добились рабочего состояния. • Прогнали все тесты и убедились, что ничего не поломали. • Применили к коду правила хорошего кода. • Прогнали тесты… • GO TO 10
методов между классами (по иерархии и так). • Выделение какого-то функционала в отдельный класс (или наоборот). • Разделение функций на более мелкие (или наоборот). • Применение паттернов проектирования для большей выразительности. • …