-
Полезные принципы программирования
Я люблю принципы программирования, которые помогают. Прочитал принцип, применил — и код сразу стал лучше. К сожалению, с некоторыми принципами такое не прокатывает. SRP. Что есть ответственность? Где начинается и заканчиается ответственность? Каковы чёткие критерии того, что ответственность одна? KISS. Как определить, что вот этот конкретный код уже достаточно простой? DRY. В каком случае идентичный код…
-
Принцип связного повествования
Часто при прочтении кода у меня возникает ощущение хаоса. Код функции начинается с подготовки переменных, которые будут использованы в самом конце функции. Алгоритм постоянно перепрыгивает с одной переменной на другую: подготовка одной переменной прерывается, внимание переключается на другую, потом возвращается к предыдущей, переходит к третьей и снова возвращается к первой. Такой код напоминает поток сознания…
-
Принцип нисходящей реализации
Часто встречается шаблон написания кода, когда мы начинаем с подробностей, а к концу функции добираемся до самого главного. Я называю такой паттерн восходящим кодингом, так как он подразумевает старт с низкоуровневых деталей и постепенное продвижение к высокоуровневым. В основе этого паттерна лежит самый простой способ сокрытия реализации: с помощью временных переменных. Такой способ порождает длинные…
-
Уровни сокрытия деталей реализации
Скрывать реализацию — единственный способ справиться со сложностью кода. Это можно делать различными способами и на разных уровнях. Временная переменная Скрывает совсем мало деталей реализации, и даже не скрывает, а просто отделяет реализацию от места использования результата. [пример] Метод или функция Метод или функция прячут чуть больше: реализацию действия или запроса информации. [пример] Класс Класс…
-
Размазывание знаний
Мощь современных языков программирования может принести вред в неумелых руках. Возможность лёгким движением руки создавать структуры данных произвольной конфигурации: каждый элемент структуры будет нужного нам типа и называться нужным нам именем (а то и вовсе размещаться под нужным номером) — поставила нас на скользкий путь. Я говорю о стандартном типе данных «хэш», он же «ассоциативный массив».…
-
YAGNI → YAGNTR — You aren’t gonna need that requirements
Я для себя чётко определил смысл YAGNI так, чтобы он был мне полезен в повседневном кодинге. То, что мне не понадобится — это не абстракции и паттерны, а бизнес-требования, которые отсутствуют в текущей постановке задачи. Одна из сложностей кодинга в том, что нельзя абсолютно всё предусмотреть в техническом задании, программисту часто приходится самому додумывать некоторые…
-
Единственная ответственность в каждом фрагменте кода
Иногда, очень редко нет жёсткой необходимости убирать какие-то частные детали реализации в отдельный метод — если детали короткие, а код в целом малозначимый. Но в этом случае необходимо всё же соблюсти обязательные условия: фрагмент кода, заключающий ответственность, должен быть чётко очерчен (как правило, отделён пустыми строками от остального кода); должны быть кристалльно ясны входные и выходные…
-
MVC? CMV!
Для меня более осмыслена другая последовательность терминов в широко известной аббревиатуре MVC — «Model — View — Controller». Всё начинается с внешнего воздействия, которое поступает в контроллер. Контроллером может быть обработчик пользовательского события или веб-запроса, функция main() для консольной утилиты и т. п. Контроллер принимает входные данные, что-то валидирует, проверяет права доступа и т. д., затем…
-
Анемичные коллекции
Благодаря наличию во всех языках программирования такой стандартной структуры данных, как массив, мы почти ежедневно усложняем себе жизнь. Нет, конечно, жизнь усложняют не сами массивы, а наша легкомысленность, когда мы непосредственно объявляем массив объектов и работаем с ним напрямую, вместо того, чтобы обернуть массив в класс и вызывать соответствующие методы этого класса. Фишка в том,…
-
Continue == goto
Я не люблю операторы continue, потому что для меня они то же самое, что goto. Они поступают с потоком выполнения в точности так же: перепрыгивают в другую точку кода в обход структуры, то есть блоков. Даже несмотря на то, что прыжок выполняется в предопределённое, а не в произвольное место в коде.
-
Как заставить код работать правильно
Чем длиннее метод, тем больше в нём выполняется действий, которые переплетаются между собой. Результат вычислений одного куска метода подаётся на вход другого куска. Самостоятельные действия вплетены друг в друга — становится не просто непонятно, где каждое действие начинается и где заканчивается, а и вообще, как отделить одно действие от другого. Возникают адски вложенные друг в…