The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
Вы наверняка знаете акроним SOLID. Он означает пять принципов объектно-ориентированного программирования, которые, при соблюдении, предполагают делать ваш код и понятным и расширяемым. Они были представлены почти 30 лет назад, но действительно ли они сделали нас лучшими программистами за это время? Мы действительно лучше понимаем ООП благодаря им? Мы пишем более “понятный и расширяемый” код? Я не думаю.
Давайте рассмотрим каждый из них по отдельности и посмотрим, как они “помогают”.
“S” обозначает принцип единственной ответственности, который, согласно книге Чистый код Роберта Мартина, означает, что “класс должен иметь только одну причину для изменения”.
Это утверждение звучит для меня крайне неопределённо, но книга объясняет это, говоря, что объекты должны быть ориентированы на решение проблемы и быть ответственными за “одну вещь”. Конечно, нам решать, что это одна вещь.
Это то, что мы знаем как “высокую связность”, так как Ларри Константайн писал об этом в журнале IBM Systems Journal в 1974 году. Почему было необходимо создать новый принцип через 15 лет с двусмысленным названием и очень сомнительным определением?
Это письмо посвящено принципу открытости/закрытости, который был представлен Бертраном Мейером в книге Object Oriented Software Construction в 1988 году. Простыми словами, это означает, что объект не должен быть изменяемым. Я полностью согласен с этим.
Но затем говорится, что он должен быть расширяемым, буквально с помощью наследования реализации, которое известно как анти-OOP технология. Таким образом, этот принцип не совсем применим к объектам и ООП. Он может работать с модулями и сервисами, но не с объектами.
Третья буква относится к Принципу подстановки Лисков, который был представлен Барбарой Лисков в 1987 году. Эта часть является самой безобидной в пятиэлементной модели SOLID. Простыми словами, она утверждает, что если ваш метод ожидает Коллекцию
, то ArrayList
будет работать.
Он также известен как подтипирование и является основополагающим компонентом любого объектно-ориентированного языка. Зачем нам называть это принципом и “следовать” ему? Возможно ли вообще создать объектно-ориентированное программное обеспечение без подтипирования? Если это принцип, давайте добавим сюда также “переменные” и “вызов методов”.
Честно говоря, я подозреваю, что этот принцип был добавлен в SOLID в основном для заполнения пробела между “SO” и “ID”.
Я полагаю, что оба этих принципа были предложены Робертом Мартином, когда он работал в Xerox.
Принцип разделения интерфейса утверждает, что вы не должны объявлять List x
, если вам нужен только Collection x
или даже Iterable x.
Я совершенно согласен. Посмотрим на следующий.
Принцип инверсии зависимостей означает, что вместо ArrayList x
вы должны объявить List x
и позволить поставщику объекта решить, будет ли это ArrayList
или LinkedList.
Этот принцип тоже кажется мне разумным.
Однако, в чем разница между всем этим и добрым старым “слабым связыванием”, предложенным Константином в 1974 году вместе с согласованностью? Действительно ли нам нужно упрощать и смазывать, чтобы лучше учиться? Нет, не для лучшего обучения, а для лучшей продажи. Вот моя точка зрения.
Суть заключается в том, что эти принципы - ничто иное, как объяснение “связности и связности” для дурачков в очень примитивной, неоднозначной и рыночной форме. Дурачки будут покупать книги, семинары и тренинги, но на самом деле не смогут понять логику, которая стоит за ними. Возможно, это им действительно не нужно? Ведь они просто кодеры, верно?
“Но объект должен быть ответственным за одну вещь!” - это то, что я часто слышу на конференциях. Люди выучивают эту мантру, даже не зная, что такое связность и не понимая, что такое эта “одна вещь”, за которую они молятся. Нет такой вещи, ребята! Существуют разные уровни связности.
Кто виноват? Дядя Боб и компания.
Они не лучше Ридли Скотта и других голливудских деньгоделов, которые создают примитивные и плачевные фильмы только ради прибыли. Люди становятся глупее, смотря их, но это их не волнует. То же самое происходит с волшебными принципами ООП - программисты полагаются на них, думая, что правда находится там, в то время как настоящая правда не понята даже создателями этой “магии”.
SOLID - это инструмент для заработка денег, а не инструмент для улучшения кода.
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 16:34