[Из песочницы] Не учите паттерны, учите концепции

?v=1

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

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

Итак


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

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

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

Я говорю про вещи, которые предполагают максимальный уровень абстракции. Пример:
«Посредник»:

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

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

То же самое про другие паттерны:
«Фабрика»:

чел, а ты знал, что можно конструировать объекты посредством другого класса?

«Data mapper»:

а почему бы тебе не использовать дополнительный слой абстракции для сохранения данных?

«Наблюдатель»:

парень, а давай намутим интерфейсов?

«Стратегия»:

ты знаешь что такое полиморфизм?

И особенно SOLID:
S (single responsibility):

один модуль должен выполнять только одну задачу, не забывай об этом!

I (interface segregation):

для разных операций используй разные интерфейсы!

Ну и так далее.

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

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

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

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


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

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


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

Более того, я всего-лишь junior, но я просто вижу противоречия и говорю о них.

Хорошего дня!

© Habrahabr.ru