Большие проекты, архитектура и фреймворки.

EatDog
Большие проекты,
архитектура и фреймворки
Александр Макаров, Yii
О себе
• 8 лет занимаюсь фреймворком Yii и другим открытым
кодом.
• Параллельно работал над коммерческими проектами.
• Участвую в PHP-FIG.Автор нескольких книг и
rmcreative.ru.
• В этом году провожу эксперимент с Patreon.
Архитектура?
Чёткого определения нет :)
Ряд решений о том, как
взаимодействуют отдельные части
системы. Это, в основном,
глобальные решения, которые
тяжело изменить потом.
• На какие элементы разбить код?
• Как эти элементы взаимодействуют?
Архитектура — это про интерфейсы,
контракты и абстракцию. Не про код и
конкретную реализацию.
Что такое интерфейс?
Наследование знают все.
А что такое инкапсуляция и полиморфизм?
Какой их смысл?
Фреймворк — не архитектура.
Он не построит архитектуру за вас.
Фреймворк ничего не знает об элементах
вашего приложения и не может определить
интерфейсы для взаимодействия этих
элементов.
Но может дать начальный шаблон и
инфраструктуру.
В случае Yii это MVC.
basic/advanced — не догма и не шаблон
полноценной архитектуры.
Кстати, про MVC...
Controller
• Принимает данные извне (GET, POST, консольный ввод).
• Отдаёт данные в нужном виде в Model и View.
• Не реализует логику, не занимается форматированием или
формированием ответа.
View
• Получает подготовленные контроллером данные.
• Форматирует данные для ответа.
• Никогда не работает с внешними данными, базой или
пользовательским вводом напрямую.
Model
• Не Model в Yii!
• Не ActiveRecord!
• M в MVC - не один класс, а целый доменный слой.
• Получает подготовленные контроллером данные,
обрабатывает их, возвращает результат.
• Никогда не работает с внешними данными или
пользовательским вводом напрямую.
• Не занимается форматированием или формированием
ответа.
Паттерны проектирования —
не архитектура!
Это проверенные варианты решения
более-менее распространённых проблем.
У каждого паттерна есть как плюсы, так и
минусы.
Даже правильно
реализованные
паттерны легко
использовать
неправильно
Зачем нужна архитектура?
• Для борьбы со сложностью.
• Цель — сделать понятным
каждый уровень абстракции.
• Для изменения под реалии бизнеса.
• Чтобы не приходилось всё переписывать с нуля.
• Сделать с первого раза хорошо — это не
просто.
Большие проекты, архитектура и фреймворки.
Хорошая архитектура —
это дорого.
Плохая — еще дороже.
"If you think good architecture is expensive, try
bad architecture"
Brian Foote and Joseph Yoder
SOLID
Ещё одна модная аббревиатура...
Single Responsibility
Класс должен делать что-то одно.
Open-closed
Класс или модуль должен
скрывать детали реализации ,
но иметь чётко определённый
интерфейс, который позволяет
как использовать модуль или
класс , так и расширять его
наследованием.
Liskov substitution
- принцип об иерархии и
наследовании.
Классическое определение очень запутанное. Можно
проще.
Когда мы реализовываем новый класс, наследуясь от
существующего, новый должен быть с тем же интерфейсом
и вести себя абсолютно так же в тех же ситуациях. Так,
чтобы программа работала, если подсунуть ей как
родителя, так и наследника.
Interface segregation
Интерфейс не должен определять больше
функциональности, чем используется за один раз.
Это как Single Responsibility, только для интерфейсов.
Если интерфейс описывает более одной задачи,
разбиваем его на несколько интерфейсов.
Dependency inversion
Класс должен объявлять зависимости через интерфейсы,
но никогда не получать их самостоятельно.
Где-то это уже было...
Хорошие и плохие
зависимости
• Cohesion - связность.
• Coupling - связанность.
Cohesion
Степень единства элементов модуля.
Coupling
Степень взаимной зависимости модулей
/ классов.
Cohesion - хорошо. Coupling - плохо.
• Служащие одной цели классы собираются в модули (Не
модули Yii! Не конкретные классы! Логические рамки).
• Внутри модуля используем его классы напрямую. Нет
смысла абстрагироваться.
• Используемые модулем классы, но не связанные с ним,
используются только через интерфейсы.
• Модулю наплевать на то, как он получит зависимости.
Довольно много мест в Yii сделаны не по
SOLID.
На это есть причины.
Чтобы нарушать правила необходимо
их знать и уметь соблюдать.
Попробуйте делать в своих проектах
правильно.
Active Record
• Делает одновременно слишком много.
• Притягивает к себе бизнес-логику (ей не место в
AR).
• Позволяет достичь цели очень быстро.
• Удобен.
Переабстрагирование
Чрезмерное увлечение
абстракцией может привести
к тому, что каждый
отдельный её уровень
слишком прост, а
взаимодействие уровней
слишком сложно.
Документирование
архитектурных решений
Что описывать?
• Модули: структура компонентов.
• Компоненты и коннекторы: взаимодействие компонентов.
• Размещение: физическое распределение компонентов по
серверам.
Чем описывать?
• Текст
• UML
Как сделать приложение
надёжным?
Исправляю одно, отваливается другое...
TDD/BDD
Тестировать.
Ключевые места хорошей архитектуры не
сложно тестировать.
Архитектура зависит в большей степени от
предметной области, а не от применяемых
фреймворков и библиотек.
DDD
Domain Driven Design
Программист недостаточно знает
автоматизируемый им процесс.
Есть человек, который знает его от и до.
Это — доменный эксперт.
Большие проекты (> 6 месяцев).
Цель — получить архитектуру, близкую к
реальному процессу, используя термины
реального процесса.
Структурные блоки
• Value object — значение, которое может включать в себя
другие значения.
• Entity — объекты, которые можно идентифицировать.
Взяв два объекта и сравнив их, можно определить, тот
же это объект или нет.
• Aggregate — группа объектов. Имеет главный Entity, без
которого вся группа не имеет смысла (root).
Транзакционно целостна.
Доменный слой не зависит ни от чего.
Главные паттерны
• Repository — сохраняет чистые объекты и загружает их.
Чаще всего речь идёт про базу данных. Не AR!
• Доменный сервис — использует entity для какой-то
полезной работы. Всё ещё не зависит ни от чего вне
домена.
• Сервис приложения — предоставляется фреймворком
(components). Может использовать доменный сервис для
работы с доменом.
DDD действительно нужен
не часто
• Сложно.
• Оверхед.
• Абстрактно.
• Плохо натягивается на "бедный" домен.
* из слайдов Дмитрия Науменко
Изучать стоит!
Можно перенять частично
• Чёткие методы в AR, работающие с инстансом.
• Отдельные модели для форм.
• Сервисы.
• ActiveQuery.
Всё это стоит изучить!
Сложно — не повод не учиться.
Редко нужно — не повод не учиться.
Почитать
• Руководство Microsoft по проектированию архитектуры
приложений
• Domain Driven Design Quickly (InfoQ)
• Implementing Domain-Driven Design - Vaughn Vernon
• Domain Driven Design Distilled - Vaughn Vernon
• Catalog of Patterns of Enterprise Application Architecture
• Clean Architecture
Время вопросов!
1 of 62

Recommended

Принципы объектно-ориентированного дизайна by
Принципы объектно-ориентированного дизайнаПринципы объектно-ориентированного дизайна
Принципы объектно-ориентированного дизайнаСергей Шебанин
9.6K views68 slides
GRASP – паттерны Объектно-Ориентированного Проектирования by
GRASP – паттерны Объектно-Ориентированного ПроектированияGRASP – паттерны Объектно-Ориентированного Проектирования
GRASP – паттерны Объектно-Ориентированного ПроектированияAlexander Nemanov
9.1K views21 slides
Работа в команде, управление программными проектами by
Работа в команде, управление программными проектамиРабота в команде, управление программными проектами
Работа в команде, управление программными проектамиUnguryan Vitaliy
3.5K views31 slides
SOLID – принципы объектно-ориентированного дизайна by
SOLID – принципы объектно-ориентированного дизайнаSOLID – принципы объектно-ориентированного дизайна
SOLID – принципы объектно-ориентированного дизайнаPavel Treshnikov
1.4K views89 slides
07 Архитектура информационных систем. Принципы GRASP by
07 Архитектура информационных систем. Принципы GRASP07 Архитектура информационных систем. Принципы GRASP
07 Архитектура информационных систем. Принципы GRASPEdward Galiaskarov
1.9K views44 slides
Шаблоны проектирования GoF by
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoFUnguryan Vitaliy
3.9K views35 slides

More Related Content

What's hot

Конспект лекций по курсу "Шаблоны разработки ПО" by
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Sergey Nemchinsky
7.9K views38 slides
Принципы SOLID by
Принципы SOLIDПринципы SOLID
Принципы SOLIDUnguryan Vitaliy
3.7K views41 slides
ооп by
оопооп
оопLidiKashka
82 views28 slides
Прагматичный подход к разработке гибких программных систем by
Прагматичный подход к разработке гибких программных системПрагматичный подход к разработке гибких программных систем
Прагматичный подход к разработке гибких программных системAlexander Byndyu
658 views30 slides
Парадигмы программирования by
Парадигмы программированияПарадигмы программирования
Парадигмы программированияITCP Community
859 views28 slides

What's hot(20)

Конспект лекций по курсу "Шаблоны разработки ПО" by Sergey Nemchinsky
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"
Sergey Nemchinsky7.9K views
Прагматичный подход к разработке гибких программных систем by Alexander Byndyu
Прагматичный подход к разработке гибких программных системПрагматичный подход к разработке гибких программных систем
Прагматичный подход к разработке гибких программных систем
Alexander Byndyu658 views
Парадигмы программирования by ITCP Community
Парадигмы программированияПарадигмы программирования
Парадигмы программирования
ITCP Community859 views
REQ Labs 2014. Smart Business Modelling: A Key to Success in Enterprise Autom... by Alex V. Petrov
REQ Labs 2014. Smart Business Modelling: A Key to Success in Enterprise Autom...REQ Labs 2014. Smart Business Modelling: A Key to Success in Enterprise Autom...
REQ Labs 2014. Smart Business Modelling: A Key to Success in Enterprise Autom...
Alex V. Petrov796 views
Шаблоны разработки ПО. Шаблоны GRASP by Sergey Nemchinsky
Шаблоны разработки ПО. Шаблоны GRASPШаблоны разработки ПО. Шаблоны GRASP
Шаблоны разработки ПО. Шаблоны GRASP
Sergey Nemchinsky6.5K views
STRATOPLAN. Efficient Object-Oriented Design and Structured Quality of Softwa... by Alex V. Petrov
STRATOPLAN. Efficient Object-Oriented Design and Structured Quality of Softwa...STRATOPLAN. Efficient Object-Oriented Design and Structured Quality of Softwa...
STRATOPLAN. Efficient Object-Oriented Design and Structured Quality of Softwa...
Alex V. Petrov833 views
Domain-Driven Design: Модель вместо требований by CUSTIS
Domain-Driven Design: Модель вместо требованийDomain-Driven Design: Модель вместо требований
Domain-Driven Design: Модель вместо требований
CUSTIS996 views
ПиАПС, Лекция №1б - Представление архитектуры by Pavel Shalagin
ПиАПС, Лекция №1б - Представление архитектурыПиАПС, Лекция №1б - Представление архитектуры
ПиАПС, Лекция №1б - Представление архитектуры
Pavel Shalagin390 views
UML2. Eleven Trivial Tips for BPMN Modellers [1.01, RUS] by Alex V. Petrov
UML2. Eleven Trivial Tips for BPMN Modellers [1.01, RUS]UML2. Eleven Trivial Tips for BPMN Modellers [1.01, RUS]
UML2. Eleven Trivial Tips for BPMN Modellers [1.01, RUS]
Alex V. Petrov8K views
Requirement modelling in software creation process by Dima Dzuba
Requirement modelling in software creation processRequirement modelling in software creation process
Requirement modelling in software creation process
Dima Dzuba209 views
Общие темы. Тема 02. by Igor Shkulipa
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
Igor Shkulipa399 views
ITGM #5. System Duality and Its Practical Effect on Business Analysis [1.0, RUS] by Alex V. Petrov
ITGM #5. System Duality and Its Practical Effect on Business Analysis [1.0, RUS]ITGM #5. System Duality and Its Practical Effect on Business Analysis [1.0, RUS]
ITGM #5. System Duality and Its Practical Effect on Business Analysis [1.0, RUS]
Alex V. Petrov836 views
SPb BA & SA Night. Learning a New Business Domain [1.01, RUS] by Alex V. Petrov
SPb BA & SA Night. Learning a New Business Domain [1.01, RUS]SPb BA & SA Night. Learning a New Business Domain [1.01, RUS]
SPb BA & SA Night. Learning a New Business Domain [1.01, RUS]
Alex V. Petrov424 views

Similar to Большие проекты, архитектура и фреймворки.

Design Rules And Principles by
Design Rules And PrinciplesDesign Rules And Principles
Design Rules And PrinciplesEvgeniy Krivosheev
888 views72 slides
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПО by
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПОЕвгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПОLuxoft Education Center
1.3K views72 slides
введение в объектно ориентированный анализ by
введение в объектно ориентированный анализвведение в объектно ориентированный анализ
введение в объектно ориентированный анализMaksim Nikitin
169 views40 slides
DESIGN PATTERNS? EASY! by
DESIGN PATTERNS? EASY!DESIGN PATTERNS? EASY!
DESIGN PATTERNS? EASY!DrupalCamp Kyiv
185 views36 slides
JavaScript Design Patterns overview by Ksenia Redunova by
JavaScript Design Patterns overview by Ksenia RedunovaJavaScript Design Patterns overview by Ksenia Redunova
JavaScript Design Patterns overview by Ksenia RedunovaLohika_Odessa_TechTalks
877 views33 slides
C++ осень 2013 лекция 8 by
C++ осень 2013 лекция 8C++ осень 2013 лекция 8
C++ осень 2013 лекция 8Technopark
889 views118 slides

Similar to Большие проекты, архитектура и фреймворки.(20)

Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПО by Luxoft Education Center
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПОЕвгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
введение в объектно ориентированный анализ by Maksim Nikitin
введение в объектно ориентированный анализвведение в объектно ориентированный анализ
введение в объектно ориентированный анализ
Maksim Nikitin169 views
C++ осень 2013 лекция 8 by Technopark
C++ осень 2013 лекция 8C++ осень 2013 лекция 8
C++ осень 2013 лекция 8
Technopark889 views
Как пройти собеседование и получить первую работу на Swift by Anton Loginov
Как пройти собеседование и получить первую работу на SwiftКак пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на Swift
Anton Loginov2.1K views
SOLIDарность: Тестирование как разработка by SQALab
SOLIDарность: Тестирование как разработкаSOLIDарность: Тестирование как разработка
SOLIDарность: Тестирование как разработка
SQALab1.7K views
C++ осень 2012 лекция 7 by Technopark
C++ осень 2012 лекция 7C++ осень 2012 лекция 7
C++ осень 2012 лекция 7
Technopark528 views
Модифицируемость программных систем by Dima Dzuba
Модифицируемость программных системМодифицируемость программных систем
Модифицируемость программных систем
Dima Dzuba581 views
Mad Stream: Software Architecture 101. by Mad Devs
Mad Stream: Software Architecture 101. Mad Stream: Software Architecture 101.
Mad Stream: Software Architecture 101.
Mad Devs97 views
Как писать красивый код или основы SOLID by Pavel Tsukanov
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLID
Pavel Tsukanov5.3K views
Как спроектировать хороший API и почему это так важно by Bubon Makabra
Как спроектировать хороший API и почему это так важноКак спроектировать хороший API и почему это так важно
Как спроектировать хороший API и почему это так важно
Bubon Makabra2.5K views
INFOSYSTEMS. How to Measure Software Architecture [1.01, RUS] by Alex V. Petrov
INFOSYSTEMS. How to Measure Software Architecture [1.01, RUS]INFOSYSTEMS. How to Measure Software Architecture [1.01, RUS]
INFOSYSTEMS. How to Measure Software Architecture [1.01, RUS]
Alex V. Petrov1.1K views
Автоматизация design patterns и компактный код вместе с PostSharp by GoSharp
Автоматизация design patterns и компактный код вместе с PostSharpАвтоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharp
GoSharp665 views
Общие темы. Тема 01. by Igor Shkulipa
Общие темы. Тема 01.Общие темы. Тема 01.
Общие темы. Тема 01.
Igor Shkulipa539 views
Проектирование больших ИС в Agile (статья) by Andrey Bibichev
Проектирование больших ИС в Agile (статья)Проектирование больших ИС в Agile (статья)
Проектирование больших ИС в Agile (статья)
Andrey Bibichev1.6K views

More from EatDog

Классифицируем текст в iOS без CoreML: как и зачем? by
Классифицируем текст в iOS без CoreML: как и зачем? Классифицируем текст в iOS без CoreML: как и зачем?
Классифицируем текст в iOS без CoreML: как и зачем? EatDog
778 views47 slides
macOS app development for iOS devs: expand your horizons by
macOS app development for iOS devs: expand your horizonsmacOS app development for iOS devs: expand your horizons
macOS app development for iOS devs: expand your horizonsEatDog
1K views80 slides
Dependency Injections in Kotlin by
Dependency Injections in KotlinDependency Injections in Kotlin
Dependency Injections in KotlinEatDog
1.2K views73 slides
Быстрый в имплементации и в работе мониторинг с использованием ELK by
Быстрый в имплементации и в работе мониторинг с использованием ELKБыстрый в имплементации и в работе мониторинг с использованием ELK
Быстрый в имплементации и в работе мониторинг с использованием ELKEatDog
347 views30 slides
Continuous integration / continuous delivery by
Continuous integration / continuous deliveryContinuous integration / continuous delivery
Continuous integration / continuous deliveryEatDog
545 views82 slides
Как мы экспериментируем в больших микросервисных системах by
Как мы экспериментируем в больших микросервисных системахКак мы экспериментируем в больших микросервисных системах
Как мы экспериментируем в больших микросервисных системахEatDog
733 views33 slides

More from EatDog(20)

Классифицируем текст в iOS без CoreML: как и зачем? by EatDog
Классифицируем текст в iOS без CoreML: как и зачем? Классифицируем текст в iOS без CoreML: как и зачем?
Классифицируем текст в iOS без CoreML: как и зачем?
EatDog778 views
macOS app development for iOS devs: expand your horizons by EatDog
macOS app development for iOS devs: expand your horizonsmacOS app development for iOS devs: expand your horizons
macOS app development for iOS devs: expand your horizons
EatDog1K views
Dependency Injections in Kotlin by EatDog
Dependency Injections in KotlinDependency Injections in Kotlin
Dependency Injections in Kotlin
EatDog1.2K views
Быстрый в имплементации и в работе мониторинг с использованием ELK by EatDog
Быстрый в имплементации и в работе мониторинг с использованием ELKБыстрый в имплементации и в работе мониторинг с использованием ELK
Быстрый в имплементации и в работе мониторинг с использованием ELK
EatDog347 views
Continuous integration / continuous delivery by EatDog
Continuous integration / continuous deliveryContinuous integration / continuous delivery
Continuous integration / continuous delivery
EatDog545 views
Как мы экспериментируем в больших микросервисных системах by EatDog
Как мы экспериментируем в больших микросервисных системахКак мы экспериментируем в больших микросервисных системах
Как мы экспериментируем в больших микросервисных системах
EatDog733 views
Отказоустойчивый Redis кластер by EatDog
Отказоустойчивый Redis кластерОтказоустойчивый Redis кластер
Отказоустойчивый Redis кластер
EatDog993 views
Кодстайл и насилие. by EatDog
Кодстайл и насилие. Кодстайл и насилие.
Кодстайл и насилие.
EatDog466 views
Refactor to Reactive With Spring 5 and Project Reactor by EatDog
Refactor to Reactive With Spring 5 and Project ReactorRefactor to Reactive With Spring 5 and Project Reactor
Refactor to Reactive With Spring 5 and Project Reactor
EatDog1.2K views
GraphQL: APIs the New Way. by EatDog
GraphQL: APIs the New Way.GraphQL: APIs the New Way.
GraphQL: APIs the New Way.
EatDog413 views
Microservices in a Wild. by EatDog
Microservices in a Wild.Microservices in a Wild.
Microservices in a Wild.
EatDog286 views
Dependency Rejection and TDD without Mocks by EatDog
Dependency Rejection and TDD without MocksDependency Rejection and TDD without Mocks
Dependency Rejection and TDD without Mocks
EatDog460 views
Стероиды для Дотнетчика by EatDog
Стероиды для ДотнетчикаСтероиды для Дотнетчика
Стероиды для Дотнетчика
EatDog195 views
Domain Driven Design – просто о сложном. by EatDog
Domain Driven Design – просто о сложном.Domain Driven Design – просто о сложном.
Domain Driven Design – просто о сложном.
EatDog379 views
OWASP: безопасное программирование на PHP. by EatDog
OWASP: безопасное программирование на PHP.OWASP: безопасное программирование на PHP.
OWASP: безопасное программирование на PHP.
EatDog599 views
Принципы Solid на практике by EatDog
Принципы Solid на практикеПринципы Solid на практике
Принципы Solid на практике
EatDog1.1K views
Mapbox GL: как работают современные векторные карты by EatDog
Mapbox GL: как работают современные векторные картыMapbox GL: как работают современные векторные карты
Mapbox GL: как работают современные векторные карты
EatDog842 views
Нельзя просто так взять и сделать версионирование API by EatDog
Нельзя просто так взять и сделать версионирование APIНельзя просто так взять и сделать версионирование API
Нельзя просто так взять и сделать версионирование API
EatDog3.3K views
API в SAAS, с облаком и без: ресурсы, SLA, балансировка, расширяемость by EatDog
API в SAAS, с облаком и без: ресурсы, SLA, балансировка, расширяемостьAPI в SAAS, с облаком и без: ресурсы, SLA, балансировка, расширяемость
API в SAAS, с облаком и без: ресурсы, SLA, балансировка, расширяемость
EatDog463 views
Выжить с помощью ООП. Максим Гопей by EatDog
Выжить с помощью ООП. Максим ГопейВыжить с помощью ООП. Максим Гопей
Выжить с помощью ООП. Максим Гопей
EatDog614 views

Большие проекты, архитектура и фреймворки.