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

@anothertechrock
Download Telegram
Вопрос с собеседования

В чем разница между классом и структурой?

Ответ:

Класс – это определенный пользователем чертеж, на основе которого создаются объекты. Он состоит из методов (набор инструкций), которые выполняются над объектами.

Структура – это определенная пользователем коллекция переменных. Структуры также являются различными типами данных.

#interview
🤮5
Какой паттерн предоставляет интерфейс для создания семейств, связанных между собой, или независимых объектов, конкретные классы которых неизвестны?
Anonymous Quiz
21%
Bridge (мост)
72%
Abstract Factory (абстрактная фабрика)
6%
Decorator (декоратор)
1%
Посмотреть результаты
Какой паттерн предоставляет унифицированный интерфейс к множеству интерфейсов в некоторой подсистеме и определяет интерфейс более высокого уровня, облегчающий работу с подсистемой?
Anonymous Quiz
5%
Builder (строитель)
12%
Composite (компоновщик)
81%
Facade (фасад)
2%
Посмотреть результаты
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 Топ-9 паттернов для обмена данными и взаимодействия между компонентами/сервисами в распределенных системах

🔹 Peer-to-Peer
🔹 API Gateway
🔹 Pub-Sub
🔹 Request-Response
🔹 Event Sourcing
🔹 ETL
🔹 Batching
🔹 Streaming Processing
🔹 Orchestration

👉 Источник

#инфографика
👍5🤬1
⚛️ 6 самых важных шаблонов проектирования в React

Правильное использование паттернов проектирования — ключ к созданию надежных, эффективных и масштабируемых React-приложений. Рассказываем о шаблонах, которые стоит освоить в первую очередь.

👉 Читать статью
👉 Зеркало
🤡1
🔥 6 архитектурных паттернов: на заметку разработчику

☑️ Layered
☑️ Microservices
☑️ Event-Driven
☑️ Client-Server
☑️ Plugin-based
☑️ Hexagonal

👉 Источник
👍7
📚 Топ-10 книг для разраба

◾️ Общие рекомендации
▫️ The Pragmatic Programmer, Andrew Hunt и David Thomas
▫️ Code Complete, Steve McConnell

◾️ Разработка
▫️ Clean Code, Robert C. Martin
▫️ Refactoring, Martin Fowler

◾️ Архитектура
▫️ Designing Data-Intensive Applications, Martin Kleppmann
▫️ System Design Interview, Alex Xu

◾️ Паттерны проектирования
▫️ Design Patterns, Eric Gamma и другие
▫️ Domain-Driven Design, Eric Evans

◾️ Структуры данных и алгоритмы
▫️ Introduction to Algorithms, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, и Clifford Stein
▫️ Cracking the Coding Interview, Gayle Laakmann McDowell

В комментарии кидайте свою любимую книгу, которая повлияла на вас как на разработчика👇

🔗 Источник
👍3
Паттерны

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

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

#паттерны #java
Шаблоны проектирования простым языком

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

Порождающие: https://tprg.ru/patterns-1
Структурные: https://tprg.ru/patterns-2
Поведенческие: https://tprg.ru/patterns-3

#паттерны
This media is not supported in your browser
VIEW IN TELEGRAM
Паттерны ООП — это методики, позволяющие эффективно решать определенные проблемы в определенных ситуациях

В этой статье разобрали паттерн, называемый «Хранитель». Он позволяет определять, сохранять и восстанавливать предыдущие состояния объектов без нарушения принципа инкапсуляции:

https://tprg.ru/Ep8H

#ооп #паттерны
1👌1
Что почитать на выходных: «Паттерны программирования игр» Роберта Нистрема

Автор — программист из Electronic Arts. В своей книге он собрал действенные советы про разрастание кода, оптимизацию и построение надёжной архитектуры.

Каждая глава — набор эффективных паттернов программирования. И их можно использовать как в готовом виде, так и улучшать/комбинировать на свой лад для собственной игры.

#gamedev #книги
💩1
#вопрос_для_самопроверки

Паттерн ___ предоставляет интерфейс для создания семейств, связанных между собой, или независимых объектов, конкретные классы которых неизвестны.
Anonymous Quiz
15%
Bridge (мост)
10%
Builder (строитель)
74%
Abstract Factory (абстрактная фабрика)
1%
Посмотреть результаты
👌31
Это точно поможет тебе в проектировании API

Если ты только начинаешь, советую стартовать с этого интерактивного роадмапа: Он удобен и на каждом этапе содержит ссылки для изучения подтем.

6 самых популярных стилей архитектуры API: которые вам нужно знать (с плюсами, минусами и примерами использования)

Проектирование REST API: спорные вопросы с проектов и собеседований на системного аналитика (и не только)

Руководство по проектированию сетевых API от Google: Его использовали внутри компании с 2014 года, и оно служит основой при разработке облачных и других API.

— Книга «Паттерны проектирования API: Сотрудник того же Google Джей Гивакс рассказывает о том, как в компании создают масштабируемые и гибкие сервисы. Вы узнаете, как улучшить дизайн самых распространённых API и как действовать в сложных пограничных случаях. Сопровождается иллюстрациями и примеры кода.

С вас лойс 👍

#api
This media is not supported in your browser
VIEW IN TELEGRAM
🔥8😁2👍1
#вопросы_для_самопроверки

Какой паттерн определяет скелет алгоритма, перекладывая ответственность за некоторые его шаги на подклассы, и позволяет подклассам переопределять шаги алгоритма, не меняя его общей структуры?
Anonymous Quiz
8%
Visitor (посетитель)
45%
Template Method (шаблонный метод)
8%
State (состояние)
35%
Prototype (прототип)
5%
Посмотреть результаты
Old but gold: подборка статей, которые простым языком объяснят 3 вида паттернов

С примерами из жизни, кейсами для использования и кодом.

Порождающие: https://tprg.ru/patterns-1
Структурные: https://tprg.ru/patterns-2
Поведенческие: https://tprg.ru/patterns-3

#паттерны
😁4
#вопросы_для_самопроверки

Какой паттерн определяет между объектами зависимость типа один-ко-многим, так что при изменении состояния одного объекта все зависящие от него получают извещение и автоматически обновляются.
Anonymous Quiz
18%
Prototype (прототип)
78%
Observer (наблюдатель)
3%
Singleton (одиночка)
1%
Посмотреть результаты
Какой паттерн использует разделение для эффективной поддержки большого числа мелких объектов?
Anonymous Quiz
50%
Flyweight (приспособленец)
30%
Memento (хранитель)
14%
Interpreter (интерпретатор)
6%
Посмотреть результаты
Что почитать программисту: «Паттерны объектно-ориентированного проектирования»

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

После прочтения вы сможете быстро и эффективно создавать собственные приложения с учетом всех ограничений, возникающих при разработке больших проектов. Все шаблоны взяты из реальных систем и основаны на реальной практике. Для каждого паттерна приведен код на C++, но принцип работы смогут понять разработчики и на других языках.

#книги #ооп #паттерны
👍2
Фабричный методэто порождающий паттерн проектирования, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.

from __future__ import annotations
from abc import ABC, abstractmethod


class Creator(ABC):
"""
Класс Создатель объявляет фабричный метод, который должен возвращать объект
класса Продукт. Подклассы Создателя обычно предоставляют реализацию этого
метода.
"""

@abstractmethod
def factory_method(self):
"""
Обратите внимание, что Создатель может также обеспечить реализацию
фабричного метода по умолчанию.
"""
pass

def some_operation(self) -> str:
"""
Также заметьте, что, несмотря на название, основная обязанность
Создателя не заключается в создании продуктов. Обычно он содержит
некоторую базовую бизнес-логику, которая основана на объектах Продуктов,
возвращаемых фабричным методом. Подклассы могут косвенно изменять эту
бизнес-логику, переопределяя фабричный метод и возвращая из него другой
тип продукта.
"""

# Вызываем фабричный метод, чтобы получить объект-продукт.
product = self.factory_method()

# Далее, работаем с этим продуктом.
result = f"Creator: The same creator's code has just worked with {product.operation()}"

return result


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


class ConcreteCreator1(Creator):
"""
Обратите внимание, что сигнатура метода по-прежнему использует тип
абстрактного продукта, хотя фактически из метода возвращается конкретный
продукт. Таким образом, Создатель может оставаться независимым от конкретных
классов продуктов.
"""

def factory_method(self) -> Product:
return ConcreteProduct1()


class ConcreteCreator2(Creator):
def factory_method(self) -> Product:
return ConcreteProduct2()


class Product(ABC):
"""
Интерфейс Продукта объявляет операции, которые должны выполнять все
конкретные продукты.
"""

@abstractmethod
def operation(self) -> str:
pass


"""
Конкретные Продукты предоставляют различные реализации интерфейса Продукта.
"""


class ConcreteProduct1(Product):
def operation(self) -> str:
return "{Result of the ConcreteProduct1}"


class ConcreteProduct2(Product):
def operation(self) -> str:
return "{Result of the ConcreteProduct2}"


def client_code(creator: Creator) -> None:
"""
Клиентский код работает с экземпляром конкретного создателя, хотя и через
его базовый интерфейс. Пока клиент продолжает работать с создателем через
базовый интерфейс, вы можете передать ему любой подкласс создателя.
"""

print(f"Client: I'm not aware of the creator's class, but it still works.\n"
f"{creator.some_operation()}", end="")


if __name__ == "__main__":
print("App: Launched with the ConcreteCreator1.")
client_code(ConcreteCreator1())
print("\n")

print("App: Launched with the ConcreteCreator2.")
client_code(ConcreteCreator2())
3👌1
Вопрос с собеседования

Для чего нужен Decorator паттерн в Javascript?
Приведите пример.

Ответ:

Javascript предоставляет удивительно гибкие возможности по работе с функциями: их можно передавать, в них можно записывать данные как в объекты, у них есть свои встроенные методы.

Шаблон декоратора динамически расширяет (украшает) поведение объекта. Возможность добавления нового поведения во время выполнения достигается с помощью объекта Decorator, который «оборачивается» вокруг исходного объекта. Несколько декораторов могут добавлять или переопределять функциональность исходного объекта.

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

Декораторы обеспечивают гибкость статически типизированных языков, позволяя вносить изменения во время выполнения, а не наследование, которое происходит во время компиляции. Однако JavaScript - это динамический язык, и возможность расширения объекта во время выполнения встроена в сам язык.

Пример использования декоратора в JavaScript:

function User(name) {
this.name = name,
this.print = () => console.log(this.name)
}

const jane = new User ('Jane Doe')
jane.print() // 'Jane Doe'

function DecorateWithCity(user, city) {
user.city = city
user.print = function() {
console.log (${this.name} from ${this.city})
}
}

DecorateWithCity(jane, 'NewYork')
jane.print(); //'Jane Doe from New York'


#interview
👍1