Всякий код описывает способ достижения определённой цели (алгоритм). Иными словами, код содержит в себе решение задачи, знание о том, как задача решается.
Например:
- как вычислить корни квадратного уравнения
- как почистить сообщение от запрещённых символов
- как сделать видимым дропдаун на форме
- как показать сообщение об ошибке валидации и т. д.
Суть принципа:
Знание о том, как решается каждая задача, должно присутствовать в коде ровно один раз.
Это значит, что когда мне по ходу алгоритма нужно показать дропдаун, я пишу не:
document.querySelector('.form .city-input .dropdown').classList.remove('.hidden');
а:
cityInput.showDropdown();
— то есть не вписываю реализацию показа дропдауна в каждое место, где мне это требуется. За счёт этого знание о том, как сделать дропдаун видимым, содержится в моём коде ровно один раз — в методе showDropdown
.
Выгоды от единственной реализации:
- если нужно будет поменять отдельные детали реализации, не потребуется делать это во всех местах (которые ещё нужно отыскать в коде), а только в одном
- проще будет писать новый код: если существует функция для определённой операции, то ниже риск написать ещё одну реализацию для этой же операции
- новый код сам по себе станет проще: он будет состоять из вызовов других функций, а не многочисленных деталей реализации каждой операции
- проще будет читать код: не нужно будет сравнивать реализации, чтобы понять, что это одна и та же операция
Принцип единственной реализации по сути повторяет принцип DRY, Don’t repeat yourself. Однако, название «принцип единственной реализации» нравится мне больше, потому что в таком виде ясно указывает на смысл принципа.