Я четко определил
требования? Официальная документация требований может не потребоваться, но вы должны иметь четкое видение, прежде чем начать кодирование. Инструменты Mind-Mapping и прототипы или эскизы дизайна могут стать хорошей альтернативой, если вам не нужна формальная документация. Работайте с конечными пользователями и заинтересованными сторонами как можно раньше в процессе разработки программного обеспечения, чтобы убедиться, что вы реализуете то, что им нужно.
Я заново изобретаю колесо? Если вы кодируете для решения общей проблемы, ищите надежную библиотеку, которая уже решает эту проблему. Если вы считаете, что, возможно, уже решили проблему в другом месте своего кода (или это может сделать коллега), сначала найдите существующее решение.
Имеет ли мой объект четкую единственную цель? Следуя принципу инкапсуляции, объект должен вести себя вместе с данными, с которыми он работает. У объекта должна быть только одна главная ответственность.
Могу ли я написать код для интерфейса? Проектирование по контракту - отличный способ включить модульное тестирование, задокументировать подробные требования класса и поощрить повторное использование кода.
Могу ли я проверить свой код? Разработка через тестирование (TDD) не всегда легка; но модульные тесты неоценимы для рефакторинга и проверки регрессионного поведения после внесения изменений. Идет рука об руку с Проектом по контракту.
Я перезаписываю? Не пытайтесь закодировать повторно используемый компонент. Не пытайтесь предвидеть будущие требования. Эти вещи могут показаться нелогичными, но они ведут к лучшему дизайну. В первый раз, когда вы что-то кодируете, просто реализуйте это как можно проще и заставьте работать. Во второй раз вы используете ту же логику, скопируйте и вставьте. Если у вас есть два рабочих раздела кода с общей логикой, вы можете легко выполнить рефакторинг, не пытаясь предвидеть будущие требования.
Я ввожу избыточный код? Не повторяйте себя (СУХОЙ) - это основной принцип рефакторинга. Используйте копирование и вставку только в качестве первого шага к рефакторингу. Не кодируйте одно и то же в разных местах, это кошмар обслуживания.
Это обычный шаблон проектирования, анти-шаблон или запах кода? Ознакомьтесь с общими решениями проблем проектирования ОО и ищите их при кодировании, но не пытайтесь заставить проблему соответствовать определенному образцу. Не упустите код, который попадает в общий шаблон "плохой практики".
Не слишком ли тесно связан мой код? Слабая связь - это принцип, который пытается уменьшить взаимозависимости между двумя или более классами. Некоторые зависимости необходимы; но чем больше вы зависите от другого класса, тем больше вам нужно исправить, когда этот класс изменится. Не позволяйте коду в одном классе зависеть от деталей реализации другого класса - используйте объект только в соответствии с его контрактом.
Я раскрываю слишком много информации? Практикуйтесь в сокрытии информации. Если метод или поле не должны быть публичными, сделайте их приватными. Предоставьте только минимальный API, необходимый для выполнения контрактом объекта. Не делайте детали реализации доступными для клиентских объектов.
Защитно ли я пишу код? Проверьте наличие ошибок и Fail Fast. Не бойтесь использовать исключения, и пусть они распространяются. В случае, если ваша программа достигает неожиданного состояния, намного, намного лучше прервать операцию, записать трассировку стека, с которой вы можете работать, и избежать непредсказуемого поведения в нижестоящем коде. Следуйте рекомендациям по очистке ресурсов, таким как оператор using() {}
.
Смогу ли я прочитать этот код через шесть месяцев? Хороший код читается при минимальной документации. Оставляйте комментарии там, где это необходимо; но также пишите интуитивно понятный код и используйте значимые имена классов, методов и переменных. Практикуйте хороший стиль кодирования; если вы работаете над командным проектом, каждый член команды должен написать код, который выглядит одинаково.
Это все еще работает? Тестируйте рано, тестируйте часто. После введения новых функций вернитесь назад и коснитесь любого существующего поведения, которое могло быть затронуто. Сделайте так, чтобы другие члены команды провели рецензирование и протестировали свой код. Повторно запустите юнит-тесты после внесения изменений и обновляйте их.