Pull to refresh

Не учите паттерны, учите концепции

Reading time3 min
Views41K
Добрый день (или вечер, или утро, в зависимости от того, когда выйдет этот пост).

Я хочу высказаться об элитарной части программирования и донести, в общем-то, очевидную мысль до начинающих в back-end (и не только) разработке, попутно используя попытку начать писать на Хабре.

Итак


Любой программист с хоть немного хорошим вкусом, начавший программировать по своей воле, после понимания основ языка и написания первых проектов, будет задаваться вопросом не «как сделать что-то», а «как сделать что-то правильно» и «какие тут есть стандарты красоты».

Эти, безусловно верные, вопросы, рано или поздно приведут его к непонятным названиям «Абстрактная фабрика», «Синглтон», «Медиатор» и не менее понятным аббревиатурам SOLID, GRASP.

Обратите внимание, что я не привел в пример ООП, MVC, ORM — это концепции с весьма конкретным смыслом и областью применения, имеющие минимальный уровень абстракции.

ООП говорит: «чувак, я нашел наглядный и понятный способ представления программ».
MVC говорит: «чел, будет лучше, если ты разделишь код, а правила разделения под катом».
ORM говорит: «псс, парень, я тут нашел способ помирить две разные идеологии — ООП и БД».
Тут все понятно.

Я говорю про вещи, которые предполагают максимальный уровень абстракции. Пример:
«Посредник»:
чел, если у тебя есть много разных объектов, сделай один центральный, к нему подключи все остальное.
Программист просто странно посмотрит в его сторону, если он общительный, скажет «спасибо, кэп!», а за глаза будет называть не иначе как «капитан очевидность».

То же самое про другие паттерны:
«Фабрика»:
чел, а ты знал, что можно конструировать объекты посредством другого класса?
«Data mapper»:
а почему бы тебе не использовать дополнительный слой абстракции для сохранения данных?
«Наблюдатель»:
парень, а давай намутим интерфейсов?
«Стратегия»:
ты знаешь что такое полиморфизм?
И особенно SOLID:
S (single responsibility):
один модуль должен выполнять только одну задачу, не забывай об этом!
I (interface segregation):
для разных операций используй разные интерфейсы!
Ну и так далее.

Я веду к тому, что основная сфера применения паттернов вовсе не в приучении к хорошему коду. Паттерны нужны для обсуждения уже написанной кем-то программы, для формализации хорошего кода. Чтобы можно было сказать («а это чего за класс?» — «а, это часть посредника»). Но не для того, чтобы сверять свою писанину с uml-ками паттернов в судорожном приступе «ааа, какой же паттерн применить в этом случае?».

Программист, хорошо владеющий какой-то концепцией (например, из приведенных выше), сам будет писать код, используя best practices, даже если он не слышал о них ни слова. А те самые best practices нужны, чтобы формализовать отношение его тимлида к его коду — и квинтэссенцией тут является, конечно же, GRASP.

Что я хотел бы сказать начинающим программистам:

  1. учите концепции, а не паттерны. Концепции реально важны.
  2. если вы вдруг опомнились, что не знаете паттернов, не надо паниковать. Это будет иметь значение только для рекрутера, но никак не для вашего кода и хорошего стиля.

Что я хотел бы сказать гуру Хабра:

  1. Я могу быть неправ. Серьезно.
  2. Я понимаю, мысль банальна. Но, тем не менее, почему-то я часто встречаю подобный подход у начинающих.
  3. Исходя из пункта 2, подобная статья может быть уже написана до меня. Я не знаю.

Ну и напоследок: статья, конечно же, субъективная, я никого ни к чему (воевать с фабриками) не призываю. Это просто мое мнение :)

Более того, я имею не слишком большой опыт в проектировании, но данный подход — уделять слишком большое внимание частностям — всегда вводил меня в непонимание.

Хорошего дня!
Tags:
Hubs:
+43
Comments107

Articles