-
Кубики против проволоки
Если написанный код структурирован как отдельные кубики, то их можно разъединить и быстро собрать другой домик. Если код сделан как единый кусок проволоки, сплетённый в замысловатую фигуру, то проще его весь выбросить и взять другой кусок проволоки, чем расплести и сплести как-то иначе. Код из проволоки — это длинная простыня. Код из кубиков — мелко нарубленный…
-
Метод составления плана
При рефакторинге длинных простыней кода я пользуюсь приёмом, который называю составлением плана. Чтобы составить качественный план текста, необходимо тщательно с ним ознакомиться и найти все «главные мысли» — для этого необходимо уметь отличать значимое от второстепенного. Применительно к коду это означает обнаружение всех промежуточных действий, которые выполняются на пути к конечной цели. Пример: код для…
-
Код функции явно указывает на конечный результат и границы алгоритма
Когда я анализирую некий произвольный кусок кода в длинной простыне, часто бывает сложно понять, в какой переменной у этого куска конечный результат, ради которого он был написан, а где — промежуточные значения, которые не понадобятся для дальнейших вычислений. Даже у фрагмента кода есть конечный результат, который по цепочке передаётся в следующий фрагмент как входной параметр.…
-
Контракты функции, класса, переменной
В широком смысле контракт в программировании — это обещание, договорённость. В контракте участвуют как минимум две стороны. Контракт функции — это обещание достигнуть определённой цели. Одна сторона такого контракта — сама функция, другая — код, который эту функцию вызывает. Вызывающий код — пользователь функции, он пользуется результатом её работы. Вызывающему коду нужны функции, потому что функция знает,…
-
Принцип единственного знания
Что + Как функции Связка двух аспектов функции: «что» + «как» является воплощением знания как достичь что. Это могут быть очень маленькие и простые вещи: как должно выглядеть сообщение об ошибке, как валидировать имейл, как аутентифицироваться на определённом внешнем API, как выяснить, видно ли всплывающее окно в данный момент или нет, как получить значения каждого…
-
Что + Как
У каждой функции (метода, процедуры) есть два аспекта, две точки зрения, с которых можно на неё смотреть. Первый аспект — цель, конечный результат, которых она достигает («намерение» в терминологии Мартина Фаулера). Цель — внешний аспект, то, как её видят её пользователи. Польза, которую она приносит. Конечный результат связан с контрактом, обещанием, которое даёт функция своим…
-
Полезные принципы программирования
Я люблю принципы программирования, которые помогают. Прочитал принцип, применил — и код сразу стал лучше. К сожалению, с некоторыми принципами такое не прокатывает. SRP. Что есть ответственность? Где начинается и заканчиается ответственность? Каковы чёткие критерии того, что ответственность одна? KISS. Как определить, что вот этот конкретный код уже достаточно простой? DRY. В каком случае идентичный код…
-
Название переменной
В моём коде я тщательно выбираю названия переменных. Проще же найти вещь в одном из сотен ящиков, когда на каждом чётко указано, что в нём лежит. О переменной нужно думать как об информации, которая в ней лежит, хотя нас учили думать о переменной как о контейнере информации. Название переменной — это надпись: что лежит внутри…
-
Source Independency Principle
Принцип единственной ответственности шикарен — если научиться его правильно применять. Для этого надо его научиться правильно понимать… а с этим у меня проблема. Поэтому продолжаю исследовать отдельные аспекты SRP в надежде, что когда-нибудь полностью его проясню. Хочу обратить внимание на MVC как частный случай SRP (хотя мне больше нравится порядок букв CMV — так логичнее…
-
Принцип единственной реализации
Всякий код описывает способ достижения определённой цели (алгоритм). Иными словами, код содержит в себе решение задачи, знание о том, как задача решается. Например: как вычислить корни квадратного уравнения как почистить сообщение от запрещённых символов как сделать видимым дропдаун на форме как показать сообщение об ошибке валидации и т. д. Суть принципа: Знание о том, как решается каждая задача, должно присутствовать в…