Добрый день (или вечер, или утро, в зависимости от того, когда выйдет этот пост).
Я хочу высказаться об элитарной части программирования и донести, в общем-то, очевидную мысль до начинающих в back-end (и не только) разработке, попутно используя попытку начать писать на Хабре.
Любой программист с хоть немного хорошим вкусом, начавший программировать по своей воле, после понимания основ языка и написания первых проектов, будет задаваться вопросом не «как сделать что-то», а «как сделать что-то правильно» и «какие тут есть стандарты красоты».
Эти, безусловно верные, вопросы, рано или поздно приведут его к непонятным названиям «Абстрактная фабрика», «Синглтон», «Медиатор» и не менее понятным аббревиатурам SOLID, GRASP.
Обратите внимание, что я не привел в пример ООП, MVC, ORM — это концепции с весьма конкретным смыслом и областью применения, имеющие минимальный уровень абстракции.
ООП говорит: «чувак, я нашел наглядный и понятный способ представления программ».
MVC говорит: «чел, будет лучше, если ты разделишь код, а правила разделения под катом».
ORM говорит: «псс, парень, я тут нашел способ помирить две разные идеологии — ООП и БД».
Тут все понятно.
Я говорю про вещи, которые предполагают максимальный уровень абстракции. Пример:
«Посредник»:
То же самое про другие паттерны:
«Фабрика»:
S (single responsibility):
Я веду к тому, что основная сфера применения паттернов вовсе не в приучении к хорошему коду. Паттерны нужны для обсуждения уже написанной кем-то программы, для формализации хорошего кода. Чтобы можно было сказать («а это чего за класс?» — «а, это часть посредника»). Но не для того, чтобы сверять свою писанину с uml-ками паттернов в судорожном приступе «ааа, какой же паттерн применить в этом случае?».
Программист, хорошо владеющий какой-то концепцией (например, из приведенных выше), сам будет писать код, используя best practices, даже если он не слышал о них ни слова. А те самые best practices нужны, чтобы формализовать отношение его тимлида к его коду — и квинтэссенцией тут является, конечно же, GRASP.
Что я хотел бы сказать начинающим программистам:
Что я хотел бы сказать гуру Хабра:
Ну и напоследок: статья, конечно же, субъективная, я никого ни к чему (воевать с фабриками) не призываю. Это просто мое мнение :)
Более того, я имею не слишком большой опыт в проектировании, но данный подход — уделять слишком большое внимание частностям — всегда вводил меня в непонимание.
Хорошего дня!
Я хочу высказаться об элитарной части программирования и донести, в общем-то, очевидную мысль до начинающих в back-end (и не только) разработке, попутно используя попытку начать писать на Хабре.
Итак
Любой программист с хоть немного хорошим вкусом, начавший программировать по своей воле, после понимания основ языка и написания первых проектов, будет задаваться вопросом не «как сделать что-то», а «как сделать что-то правильно» и «какие тут есть стандарты красоты».
Эти, безусловно верные, вопросы, рано или поздно приведут его к непонятным названиям «Абстрактная фабрика», «Синглтон», «Медиатор» и не менее понятным аббревиатурам SOLID, GRASP.
Обратите внимание, что я не привел в пример ООП, MVC, ORM — это концепции с весьма конкретным смыслом и областью применения, имеющие минимальный уровень абстракции.
ООП говорит: «чувак, я нашел наглядный и понятный способ представления программ».
MVC говорит: «чел, будет лучше, если ты разделишь код, а правила разделения под катом».
ORM говорит: «псс, парень, я тут нашел способ помирить две разные идеологии — ООП и БД».
Тут все понятно.
Я говорю про вещи, которые предполагают максимальный уровень абстракции. Пример:
«Посредник»:
чел, если у тебя есть много разных объектов, сделай один центральный, к нему подключи все остальное.Программист просто странно посмотрит в его сторону, если он общительный, скажет «спасибо, кэп!», а за глаза будет называть не иначе как «капитан очевидность».
То же самое про другие паттерны:
«Фабрика»:
чел, а ты знал, что можно конструировать объекты посредством другого класса?«Data mapper»:
а почему бы тебе не использовать дополнительный слой абстракции для сохранения данных?«Наблюдатель»:
парень, а давай намутим интерфейсов?«Стратегия»:
ты знаешь что такое полиморфизм?И особенно SOLID:
S (single responsibility):
один модуль должен выполнять только одну задачу, не забывай об этом!I (interface segregation):
для разных операций используй разные интерфейсы!Ну и так далее.
Я веду к тому, что основная сфера применения паттернов вовсе не в приучении к хорошему коду. Паттерны нужны для обсуждения уже написанной кем-то программы, для формализации хорошего кода. Чтобы можно было сказать («а это чего за класс?» — «а, это часть посредника»). Но не для того, чтобы сверять свою писанину с uml-ками паттернов в судорожном приступе «ааа, какой же паттерн применить в этом случае?».
Программист, хорошо владеющий какой-то концепцией (например, из приведенных выше), сам будет писать код, используя best practices, даже если он не слышал о них ни слова. А те самые best practices нужны, чтобы формализовать отношение его тимлида к его коду — и квинтэссенцией тут является, конечно же, GRASP.
Что я хотел бы сказать начинающим программистам:
- учите концепции, а не паттерны. Концепции реально важны.
- если вы вдруг опомнились, что не знаете паттернов, не надо паниковать. Это будет иметь значение только для рекрутера, но никак не для вашего кода и хорошего стиля.
Что я хотел бы сказать гуру Хабра:
- Я могу быть неправ. Серьезно.
- Я понимаю, мысль банальна. Но, тем не менее, почему-то я часто встречаю подобный подход у начинающих.
- Исходя из пункта 2, подобная статья может быть уже написана до меня. Я не знаю.
Ну и напоследок: статья, конечно же, субъективная, я никого ни к чему (воевать с фабриками) не призываю. Это просто мое мнение :)
Более того, я имею не слишком большой опыт в проектировании, но данный подход — уделять слишком большое внимание частностям — всегда вводил меня в непонимание.
Хорошего дня!