Pattern Guru. Шаблоны проектирования. Архитектура ПО
3.15K subscribers
194 photos
4 videos
86 links
Патерны программирования.
Архитектура ПО.
Микросервисы

@anothertechrock
Download Telegram
📚 Основы алгоритмов на одной шпаргалке

Хочешь разобраться, чем массив отличается от хеш-таблицы? Этот шпаргалка — для тебя.

✍️ 9 ключевых структур данных:
🟢Массив
🟢 Стек
🟢 Очередь и дек
🟢 Хеш-таблица
🟢 Связанный список
🟢 Двоичное дерево поиска
🟢 Граф

✔️ Для каждой:
🟣 Простое объяснение
🟣 Примеры
🟣 Основные задачи и особенности
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍3
Вопрос с собеседования

Назовите поведенческие шаблоны и кратко опишите их.


Ответ:

Поведенческие шаблоны характеризуют способы взаимодействия классов или объектов между собой.

К поведенческим шаблонам относятся:

🔎 Chain of Responsibility (Цепочка Обязанностей). организует независимую от объекта-отправителя цепочку не знающих возможностей друг друга объектов-получателей, которые передают запрос друг другу (object that can fulfill a request).

🔎 Command (Команда). Используется для определения по некоторому признаку объекта конкретного класса, которому будет передан запрос для обработки (when and how a request is fulfilled).

🔎 Iterator (Итератор). Позволяет последовательно обойти все элементы коллекции или другого составного объекта, не зная деталей внутреннего представления данных (how an aggregate's elements are accessed, traversed).

🔎 Mediator (Посредник). Позволяет снизить число связей между классами при большом их количестве, выделяя один класс, знающий все о методах других классов (how and which objects interact with each other).

🔎 Memento (Хранитель). Сохраняет текущее состояние объекта для дальнейшего восстановления (what private information is stored outside an object, and when).

🔎 Observer (Наблюдатель). Позволяет при зависимости между объектами типа «один ко многим» отслеживать изменения объекта (number of objects that depend on another object; how the dependent objects stay up to date).

🔎 State (Состояние). Позволяет объекту изменять свое поведение за счет изменения внутреннего объекта состояния (states of an object).

🔎 Strategy (Стратегия). Задает набор алгоритмов с возможностью выбора одного из классов для выполнения конкретной задачи во время создания объекта (an algorithm).

🔎 Template Method (Шаблонный Метод). Создает родительский класс, использующий несколько методов, реализация которых возложена на производные классы (steps of an algorithm).

🔎 Visitor (Посетитель). Представляет операцию в одном или нескольких связанных классах некоторой структуры, которую вызывает специфичный для каждого такого класса метод в другом классе (operations that can be applied to object(s) without changing their class(es)).

🔎 Interpreter (Интерпретатор). Для определенного способа представления информации определяет правила (grammar and interpretation of a language).

#interview
Please open Telegram to view this post
VIEW IN TELEGRAM
5👎1
Оффер на 300к без программирования

До такого уровня можно вырасти примерно за 2 года работы бизнес-аналитиком в  IT. А если ты еще новичок, то стартануть от сотки в месяц.

Если не планируешь заниматься программированием или тестированием, рекомендую посмотреть видос в закрепе канала IT с Юлей

В нем Юля, ведущий бизнес-аналитик простым языком объясняет:
— чем занимается бизнес-аналитик и почему это лучшее направление для входа в IT
— как с нуля зайти в профессию в 2026 году и зарабатывать от 100к
— ее путь и реальные истории трудоустройства новичков в IT

Плюс дает сборник с разбором самых частых вопросов от HR с правильными ответами и разбором логики.

Посмотри, потом будешь рад, что не пролистал: https://t.me/+ZBBh1Ssqc5IwZTEy
🤡13🔥2💊2😁1
Какой паттерн инкапсулирует запрос в виде объекта, позволяя тем самым параметризовывать клиентов типом запроса, устанавливать очередность запросов, протоколировать их и поддерживать отмену выполнения операций?
Anonymous Quiz
34%
Chain of Responsibility (Цепочка обязанностей)
21%
Composite (Компоновщик)
37%
Command (Команда)
8%
Посмотреть результаты
2
Шаблон проектирования Strategy

Стратегия относится к поведенческим шаблонам проектирования. Цель этого паттерна - выделить схожие алгоритмы, решающие конкретную задачу. Реализация алгоритмов выносится в отдельные классы и предоставляется возможность выбирать алгоритмы во время выполнения программы.

Давайте рассмотрим принципы и суть шаблона Стратегия на примерах.

Читать статью
🔥4
Вопрос с собеседования

Что такое Interface segregation principle?


Ответ:

Interface segregation principle
- принцип разделения интерфейса (много специализированных интерфейсов лучше, чем один универсальный).

Иными словами, большие, объемные интерфейсы надо разбивать на мелкие. При этом клиенты маленьких интерфейсов должны знать только о тех методах, которые необходимы им в работе. Также при изменении метода интерфейса не должны меняться клиенты, которые этот метод не используют.


#interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Шаблон проектирования Flyweigth

Приспособленец (также - Легковес) - структурный паттерн проктирования. Он позволяет вместить большее количество объектов в отведенную оперативную память.

Основная идея паттерна — различие между внутренним и внешним состоянием объекта. Внешнее состояние передается клиентом, использующим приспособленца, в некотором контексте. Внутреннее состояние хранится непосредственно в приспособленце и позволяет разделять их. Под разделением понимается возможность одновременной работы нескольких клиентов с одним и тем же приспособленцем.

Смотреть реализацию
🔥4
Вопрос с собеседования

Какие антишаблоны вы знаете?


Ответ:

Например...

🚩 Big ball of mud (Большой Ком Грязи). Термин для системы или просто программы, которая не имеет хоть немного различимой архитектуры. Как правило, включает в себя более одного антишаблона. Этим страдают системы, разработанные людьми без подготовки в области архитектуры ПО.

🚩 Yo-Yo problem (Проблема Йо-Йо). Возникает, когда необходимо разобраться в программе, иерархия наследования и вложенность вызовов методов которой очень длинны и сложны. Программисту вследствие этого необходимо лавировать между множеством различных классов и методов, чтобы контролировать поведение программы. Термин происходит от названия игрушки йо-йо.

🚩 Magic Button. Возникает, когда код обработки формы сконцентрирован в одном месте и, естественно, никак не структурирован.

🚩 Magic Number. Наличие в коде многократно повторяющихся одинаковых чисел или чисел, объяснение происхождения которых отсутствует.

🚩 Gas Factory (Газовый Завод). Необязательный сложный дизайн для простой задачи.

🚩 Analiys paralisys (Паралич анализа). В разработке ПО проявляет себя через чрезвычайно длинные фазы планирования проекта, сбора необходимых для этого артефактов, программного моделирования и дизайна, которые не имеют особого смысла для достижения итоговой цели.

🚩 Interface Bloat (Распухший Интерфейс). Термин, используемый для описания интерфейсов, которые пытаются вместить в себя все возможные операции над данными.

🚩 Accidental complexity (Случайная сложность). Проблема в программировании, которой легко можно было избежать. Возникает вследствие неправильного понимания проблемы или неэффективного планирования.

#interview
Please open Telegram to view this post
VIEW IN TELEGRAM
4
Структурные шаблоны проектирования простым языком

Структурные шаблоны — шаблоны проектирования, в которых рассматривается вопрос о том, как из классов и объектов образуются более крупные структуры.

В этой статье рассматриваем на примерах такие шаблоны, как адаптер, мост, компоновщик, декоратор, фасад, приспособленец, заместитель.

Читать статью
👍6
Вопрос с собеседования

Что такое GRASP?


Ответ:

GRASP (аббр. General Responsibility Assignment Software Patterns, русск. - общие шаблоны распределения обязанностей) - шаблоны проектирования, используемые для решения общих задач по назначению обязанностей классам и объектам.

Известно девять GRASP-шаблонов:

1️⃣ Information Expert (Информационный эксперт). Описывает основополагающие принципы назначения обязанностей классам и объектам. Информационным экспертом (объектом, наделенным некоторыми обязанностями) является объект, обладающий максимумом информации, необходимой для выполнения назначенных обязанностей.

2️⃣Creator (Создатель). Суть ответственности такого объекта в том, что он создает другие объекты. Сразу напрашивается аналогия с фабриками.

3️⃣ Controller (Контроллер). Отвечает за обработку входных системных событий, делегируя обязанности по их обработке компетентным классам. В общем случае контроллер реализует один или несколько вариантов использования. Использование контроллеров позволяет отделить логику от представления, тем самым повышая возможность повторного использования кода.

4️⃣ Low Coupling (Слабая связанность). Если объекты в приложении сильно связаны, то любое их изменение приводит к изменениям во всех связанных объектах. А это неудобно и порождает баги. Вот поэтому необходимо, чтобы код был слабо связан и зависел только от абстракций.

5️⃣ High Cohesion (Высокая сцепленность). Этот принцип тесно соотносится со слабой связанностью: одно всегда приводит к другому. И это показатель того, что мы не нарушаем single resposibility principle. Вернее сказать, высокая сцепленность получается в результате соблюдения такого принципа из SOLID, как single resposibility principle (SRP).

6️⃣ Pure Fabrication (Чистая выдумка или чистое синтезирование). Это класс, не отражающий никакого реального объекта предметной области, но специально придуманный для усиления связности, ослабления связанности или увеличения степени повторного использования. Pure Fabrication отражает концепцию сервисов в модели Программирование от предметной области.

7️⃣ Indirection (Посредник). Шаблон перенаправление реализует низкую связность между классами путем назначения обязанностей по их взаимодействию дополнительному объекту - посреднику.

8️⃣ Protected Variations (Сокрытие реализации или защищенные изменения). Защищает элементы от изменения других элементов (объектов или подсистем) с помощью вынесения взаимодействия в фиксированный интерфейс. Всё взвимодействие между элементами должно происходить через него. Поведение может варьироваться лишь с помощью создания другой реализации интерфейса.

9️⃣ Polymorphism (Полиморфизм). Позволяет обрабатывать альтернативные варианты поведения на основе типа и заменять подключаемые компоненты системы. Обязанности распределяются для различных вариантов поведения с помощью полиморфных операций для этого класса. Все альтернативные реализации приводятся к общему интерфейсу.

#interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31
🚩 Шаблон проектирования Абстрактная фабрика

🟣 Подробное описание паттерна

Шаблон Абстрактная фабрика (англ. Abstract Factory) относится к классу порождающих паттернов. Его основное назначение — предоставить интерфейс для создания семейства взаимосвязанных объектов, не указывая конкретные классы этих объектов.

🟪 Этот шаблон стоит использовать, если:

🔎 Ваша система должна быть независимой от способа создания новых объектов

🔎 Создаваемые объекты должны использоваться вместе и быть взаимосвязанными.

Классы абстрактной фабрики часто реализуются фабричными методами, но могут быть реализованы и с помощью паттерна Prototype.

🗂 Код на Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Паттерны

В одном репозитории собрано 111 паттернов проектирования. На данный момент это самый популярный репозиторий на языке Java, у него почти 50k звёзд.

Для каждого паттерна есть подробное описание и примеры реализации на Java: https://github.com/iluwatar/java-design-patterns

#паттерны #java
#паттерны

Введение

Сегодня мы рассмотрим паттерн проектирования "Абстрактная фабрика".

Классификация

Тип: Порождающий

Определение: Абстрактная фабрика - это порождающий паттерн проектирования, который предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.

Грубо говоря, абстрактная фабрика - это "фабрика фабрик", данный паттерн позволяет решить проблему создания целых семейств связанных объектов, без указания конкретных классов продуктов.
С помощью абстрактной фабрики вы можете предоставить библиотеку объектов не расскрывая их реализацию.

Из чего состоит и как работает данный паттерн

1. Абстрактного класса/Интерфейса абстрактной фабрики. Содержит абстрактные методы которые возвращают абстрактные продукты, связанные одной конпцецией.

class AbstractFactory(ABC):
@abstractmethod
def create_product_a(self):
...

@abstractmethod
def create_product_b(self):
...


2. Конретные фабрики. Конкретные фабрики реализут операции которые создают конкретные продукты.

class ConcreteFactory1(AbstractFactory):
def create_product_a(self):
return ConcreteProductA1()

def create_product_b(self):
return ConcreteProductB1()

class ConcreteFactory2(AbstractFactory):
def create_product_a(self):
return ConcreteProductA2()

def create_product_b(self):
return ConcreteProductB2()


3. Абстрактные классы продуктов. Реализуют интерфейс для всех конретных продуктов своего семейства.

class AbstractProductA(ABC):
@abstractmethod
def very_important_super_function_a(self) -> str:
...

class AbstractProductB(ABC):
@abstractmethod
def very_important_super_function_b(self) -> str:
...


4. Конкретные продукты. Реализуют абстрактные продукты. Продукты одного семейства не могут взаимодействовать, с продуктами другого семейства.

class ConcreteProductA1(AbstractProductA):
def very_important_super_function_a(self) -> str:
return "Product A1"


class ConcreteProductA2(AbstractProductA):
def very_important_super_function_a(self) -> str:
return "Product A2"

class ConcreteProductB1(AbstractProductB):
def very_important_super_function_b(self) -> str:
return "Product B1"


class ConcreteProductB2(AbstractProductB):
def very_important_super_function_b(self) -> str:
return "Product B2"


5. Клиент. Клиентский код работает исключительно с абстрактной фабрикой и абстрактными продуктами.

def client(factory: AbstractFactory) -> str:
return factory.create_product_a().very_important_super_function_a()

for factory in (ConcreteFactory1, ConcreteFactory2, ...):
client(factory)


Плюсы данного паттерна

1. Реализует принцип открытости/закрытости.

2. Упращает поддержку кода.

3. Выделяет код производства продуктов в одно место, упрощая поддержку кода.

Минусы данного паттерна

1. Снижает читаемость программы из-за введения множества дополнительных классов.

Пример и задача

Дед Мороз и Пасхальный кролик не успевают сделать игрушки к празднику, которые они будут дарить детям.
Все существует 3 вида игрушек:

1. Лошадка
2. Зайчик
3. Шарик

Всё было бы просто однако Деду Морозу нужны игрушки в новогоднем стиле, а пасхальному кролику в пасхальном.
Создайте абстрактную фабрику игрушек и спасите эти праздники!

Пример из реального кода

Пример из реального кода предоставил @Tishka17. Он разработал замечательный фреймворк aiogram_dialog для разработки интерактивных диалогов и меню в телеграмм ботах, как обычное приложение с графическим интерфейсом.

Вот здесь он использует данный паттерн: https://github.com/Tishka17/aiogram_dialog/blob/develop/aiogram_dialog/manager/manager_middleware.py#L23

Вот его объяснение, какую задачу он решает в данном случае:
2
🚩 Шаблон проектирования Заместитель

🟣 Подробное описание паттерна

Заместитель (англ. Proxy) — структурный паттерн проектирования. Он позволяет подставлять вместо реальных объектов специальные объекты-заменители. Эти объекты перехватывают вызовы к оригинальному объекту, позволяя сделать что-то до или после передачи вызова оригиналу.

🟪 Ситуации, когда можно использовать паттерн Заместитель:

🔎 Виртуальный proxy является заместителем объектов, создание которых обходится дорого. Реальный объект создается только при первом запросе/доступе клиента к объекту.

🔎 Удаленный proxy предоставляет локального представителя для объекта, который находится в другом адресном пространстве ("заглушки" в RPC и CORBA).

🔎 Защитный proxy контролирует доступ к основному объекту. "Суррогатный" объект предоставляет доступ к реальному объекту, только вызывающий объект имеет соответствующие права.

🔎 Интеллектуальный proxy выполняет дополнительные действия при доступе к объекту.

🗂 Код на Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
3