HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Паттерн проектирования - подход к решению какой-то типовой задачи. Ранее мы уже рассмотрели некоторые из них, начиная от разных видов диспетчеризации, заканчивая Стратегией и Фабрикой. Этих паттернов очень много, каждый день придумываются новые, и даже каждый программист имеет какие-то свои паттерны для своих задач.</p>
1 <p>Паттерн проектирования - подход к решению какой-то типовой задачи. Ранее мы уже рассмотрели некоторые из них, начиная от разных видов диспетчеризации, заканчивая Стратегией и Фабрикой. Этих паттернов очень много, каждый день придумываются новые, и даже каждый программист имеет какие-то свои паттерны для своих задач.</p>
2 <p>Паттерны, в общем, не связаны с понятием ООП, но именно в ООП их любят структурировать и описывать. Поэтому эта тема особенно распространена в языках с классовой структурой, например Java, C# или PHP. И большинство этих паттернов сводится к тому, как<em>правильно применять полиморфизм подтипов</em>в разных ситуациях. Вот только некоторые из широко известных, которые опираются на полиморфизм:</p>
2 <p>Паттерны, в общем, не связаны с понятием ООП, но именно в ООП их любят структурировать и описывать. Поэтому эта тема особенно распространена в языках с классовой структурой, например Java, C# или PHP. И большинство этих паттернов сводится к тому, как<em>правильно применять полиморфизм подтипов</em>в разных ситуациях. Вот только некоторые из широко известных, которые опираются на полиморфизм:</p>
3 <ul><li>Адаптер</li>
3 <ul><li>Адаптер</li>
4 <li>Стратегия</li>
4 <li>Стратегия</li>
5 <li>Абстрактная фабрика</li>
5 <li>Абстрактная фабрика</li>
6 <li>Мост</li>
6 <li>Мост</li>
7 <li>Композит</li>
7 <li>Композит</li>
8 <li>Декоратор</li>
8 <li>Декоратор</li>
9 <li>Посредник</li>
9 <li>Посредник</li>
10 <li>Цепочка ответственности</li>
10 <li>Цепочка ответственности</li>
11 <li>Наблюдатель</li>
11 <li>Наблюдатель</li>
12 <li>Состояние</li>
12 <li>Состояние</li>
13 <li>Шаблонный метод</li>
13 <li>Шаблонный метод</li>
14 <li>Посетитель</li>
14 <li>Посетитель</li>
15 </ul><p>Некоторые из них связаны с абстракцией и имеют внутреннее состояние, другие - обычные функции, упакованные в классы только ради полиморфизма (но могли бы быть реализованы и обычными функциями, которые диспетчеризуются разными способами).</p>
15 </ul><p>Некоторые из них связаны с абстракцией и имеют внутреннее состояние, другие - обычные функции, упакованные в классы только ради полиморфизма (но могли бы быть реализованы и обычными функциями, которые диспетчеризуются разными способами).</p>
16 <p>В мире ООП паттернов, их основным источником считается книга -<a>Приемы объектно-ориентированного проектирования. Паттерны проектирования</a>. В ней действительно описано много полезных подходов, но будьте осторожны. Учтите следующие моменты:</p>
16 <p>В мире ООП паттернов, их основным источником считается книга -<a>Приемы объектно-ориентированного проектирования. Паттерны проектирования</a>. В ней действительно описано много полезных подходов, но будьте осторожны. Учтите следующие моменты:</p>
17 <ul><li>Примеры в книге описаны на языке C++ и имеют более сложную реализацию, чем это нужно в динамических языках.</li>
17 <ul><li>Примеры в книге описаны на языке C++ и имеют более сложную реализацию, чем это нужно в динамических языках.</li>
18 <li>Многие паттерны рождаются вследствие ограничений конкретного языка, например паттерн Команда. В JavaScript это естественный способ писать код и для этого не нужны классы.</li>
18 <li>Многие паттерны рождаются вследствие ограничений конкретного языка, например паттерн Команда. В JavaScript это естественный способ писать код и для этого не нужны классы.</li>
19 <li>Не все паттерны, описанные в этой книге, так уж важны для веб-разработчиков. Вероятность того, что вам придется когда-то иметь дело с абстрактной фабрикой, крайне мала.</li>
19 <li>Не все паттерны, описанные в этой книге, так уж важны для веб-разработчиков. Вероятность того, что вам придется когда-то иметь дело с абстрактной фабрикой, крайне мала.</li>
20 <li>Самих паттернов намного больше, чем указано в этой книге. Паттерны это не догма: все течет, все развивается.</li>
20 <li>Самих паттернов намного больше, чем указано в этой книге. Паттерны это не догма: все течет, все развивается.</li>
21 </ul><h2>Полиморфизм в паттернах или Паттерн создания Паттернов</h2>
21 </ul><h2>Полиморфизм в паттернах или Паттерн создания Паттернов</h2>
22 <p>Большая часть паттернов, которая связана с полиморфизмом, строится по одному и тому же принципу. Зная его, вы сможете самостоятельно принимать правильные решения, даже не зная про паттерн для данной ситуации. Ключевая идея состоит в том, что берется все множество вариантов поведения и на каждый создается свой собственный класс.</p>
22 <p>Большая часть паттернов, которая связана с полиморфизмом, строится по одному и тому же принципу. Зная его, вы сможете самостоятельно принимать правильные решения, даже не зная про паттерн для данной ситуации. Ключевая идея состоит в том, что берется все множество вариантов поведения и на каждый создается свой собственный класс.</p>
23 <p>Например, в Стратегии количество классов-стратегий совпадает с количеством разных способов вычисления. Если их будет пять, то придется создать пять классов. По крайней мере в классовых языках. В языках, где предпочитают функции, будет создано пять разных функций и это все равно будет Стратегия.</p>
23 <p>Например, в Стратегии количество классов-стратегий совпадает с количеством разных способов вычисления. Если их будет пять, то придется создать пять классов. По крайней мере в классовых языках. В языках, где предпочитают функции, будет создано пять разных функций и это все равно будет Стратегия.</p>
24 <h2>Антипаттерны</h2>
24 <h2>Антипаттерны</h2>
25 <p>Раз есть паттерны, значит существуют и антипаттерны - это типовые ошибки, которые совершают программисты. Многие из них имеют вполне конкретные, часто шуточные, названия: "паблик морозов" или "божественный объект". Самое удивительное, что подходы, считавшиеся раньше паттернами, иногда перетекают в раздел антипаттернов. Самый яркий пример это паттерн "Одиночка (Singleton)" - объект, который может существовать только в единственном экземпляре. Как показала жизнь, это плохо почти всегда. Кроме того, код с синглтонами крайне сложно тестировать.</p>
25 <p>Раз есть паттерны, значит существуют и антипаттерны - это типовые ошибки, которые совершают программисты. Многие из них имеют вполне конкретные, часто шуточные, названия: "паблик морозов" или "божественный объект". Самое удивительное, что подходы, считавшиеся раньше паттернами, иногда перетекают в раздел антипаттернов. Самый яркий пример это паттерн "Одиночка (Singleton)" - объект, который может существовать только в единственном экземпляре. Как показала жизнь, это плохо почти всегда. Кроме того, код с синглтонами крайне сложно тестировать.</p>
26 <h2>Обучение паттернам</h2>
26 <h2>Обучение паттернам</h2>
27 <p>Новичков, которые начитались статей и наслушались старших товарищей, очень волнует вопрос изучения паттернов. Нужно ли их учить? Сколько их учить? По каким книгам и так далее.</p>
27 <p>Новичков, которые начитались статей и наслушались старших товарищей, очень волнует вопрос изучения паттернов. Нужно ли их учить? Сколько их учить? По каким книгам и так далее.</p>
28 <p>Попробуем разобраться. Как показывает практика, про паттерны все говорят, но мало кто действительно прочитал, понял их и может разумно применять. Причин этому несколько. Во-первых, крайне сложно осознать паттерн, не столкнувшись с реальной проблемой, которую он решает. Во-вторых, настоящее понимание паттернов завязано на те вещи, которые мы разбирали на протяжении всей профессии: именование (оно чертовски важно), менеджмент состояния, побочные эффекты, абстракции, расширяемость, полиморфизм подтипов. Без понимания этих вещей, попытка использовать паттерны почти наверняка превратится в<a>культ карго</a>. Причем из всего списка выше, паттерны, по эффекту оказываемому на код, находятся на последнем месте.</p>
28 <p>Попробуем разобраться. Как показывает практика, про паттерны все говорят, но мало кто действительно прочитал, понял их и может разумно применять. Причин этому несколько. Во-первых, крайне сложно осознать паттерн, не столкнувшись с реальной проблемой, которую он решает. Во-вторых, настоящее понимание паттернов завязано на те вещи, которые мы разбирали на протяжении всей профессии: именование (оно чертовски важно), менеджмент состояния, побочные эффекты, абстракции, расширяемость, полиморфизм подтипов. Без понимания этих вещей, попытка использовать паттерны почти наверняка превратится в<a>культ карго</a>. Причем из всего списка выше, паттерны, по эффекту оказываемому на код, находятся на последнем месте.</p>
29 <p>Важно понимать, что паттерны это не причина, а следствие. Остерегайтесь мышления в стиле "вот есть паттерн, как его натянуть на ситуацию". Сначала нужно понять ситуацию, а потом возникнет паттерн. И совершенно нормально, что первые годы разработки (а у кого-то и больше), задачи будут решаться так, как получается. Обучение происходит через ошибки и неправильные решения, этого не надо бояться и избегать. Главное - это последовательное улучшение, а здесь помогут книги и наставники (на работе или в сети). О том, как лучше читать книги, в том числе по паттернам, мы писали в<a>статье</a>.</p>
29 <p>Важно понимать, что паттерны это не причина, а следствие. Остерегайтесь мышления в стиле "вот есть паттерн, как его натянуть на ситуацию". Сначала нужно понять ситуацию, а потом возникнет паттерн. И совершенно нормально, что первые годы разработки (а у кого-то и больше), задачи будут решаться так, как получается. Обучение происходит через ошибки и неправильные решения, этого не надо бояться и избегать. Главное - это последовательное улучшение, а здесь помогут книги и наставники (на работе или в сети). О том, как лучше читать книги, в том числе по паттернам, мы писали в<a>статье</a>.</p>