В данном докладе мы рассмотрим пять основных принципов дизайна классов в объектно-ориентированном проектировании, которые известны, как принципы SOLID. А также как обеспечить достаточный уровень гибкости, связанности, управляемости, стабильности и понятности кода.
Sergey Teplyakov, .NET Expert, “SOLID Principles in the real world”:
• Why design principles matters?
• SOLID principles in the real world
S – Single Responsibility Principle
O – Open-Closed Principle
L – Liskov Substitution Principle
I – Interface Segregation Principle
D – Dependency Inversion Principle
Когда заходит речь о хранении данных .NET приложения, обычно вопросов не возникает. Конечно же это будет реляционная база. А в большинстве случаев — и вовсе MS SQL Server. Но что, если если мы скажем вам, что классический подход далеко не идеальный? Он требует дополнительных усилий, и практически всегда приводит к постоянной потере важных данных.
На этом докладе мы разберем основные проблемы и недостатки реляционной модели и рассмотрим как можно их избежать современным .NET разработчикам.
В данном докладе мы рассмотрим пять основных принципов дизайна классов в объектно-ориентированном проектировании, которые известны, как принципы SOLID. А также как обеспечить достаточный уровень гибкости, связанности, управляемости, стабильности и понятности кода.
Sergey Teplyakov, .NET Expert, “SOLID Principles in the real world”:
• Why design principles matters?
• SOLID principles in the real world
S – Single Responsibility Principle
O – Open-Closed Principle
L – Liskov Substitution Principle
I – Interface Segregation Principle
D – Dependency Inversion Principle
Когда заходит речь о хранении данных .NET приложения, обычно вопросов не возникает. Конечно же это будет реляционная база. А в большинстве случаев — и вовсе MS SQL Server. Но что, если если мы скажем вам, что классический подход далеко не идеальный? Он требует дополнительных усилий, и практически всегда приводит к постоянной потере важных данных.
На этом докладе мы разберем основные проблемы и недостатки реляционной модели и рассмотрим как можно их избежать современным .NET разработчикам.
PHP Meetup
Микола Паламарчук
— Розробник в Upwork (PHP infrastructure team)
— Більше 10 років досвіду в web development
— Спікер WebCamp:PHP Одеса (2016), PHP fwdays Київ (2015, 2017)
В проектуванні ПЗ є основні принципи.
Звично їх використовують лише для ООП, але насправді ці принципи мають застосування на всіх етапах розробки, навіть у функціональному програмуванні.
Доповідь про приклади застосування цих принципів на різних рівнях і про переваги такого підходу
Секрет производства: программный продукт, за который не будет стыдноCUSTIS
Открытый семинар для студентов в компании CUSTIS (15 октября 2015 года).
Лектор: Виктор Крапивин, архитектор.
Аннотация: В программном проекте разработчику постоянно приходится работать с унаследованным кодом созданных ранее программ, которые предстоит доделать, исправить или сделать источником примеров в дальнейшей практике. В процессе изучения такого исходного кода программисты часто возмущаются, порой не без оснований заявляя: «Ну кто же так пишет?!». Многочисленные непонятные решения, срочные заплаты для исправления критических ошибок, «костыли» — во всем этом непросто разобраться даже при наличии документации, а ведь иногда она уже не актуальна или ее нет совсем.
Создавая программный продукт, который может «дожить» до промышленной эксплуатации, необходимо помнить, что рано или поздно он попадет в руки программистов, не имеющих отношения к его первоначальной разработке. В ходе этого семинара мы на примерах из мира Java продемонстрируем, как создать этот продукт таким образом, чтобы «потомки» остались довольны.
Видеозапись семинара: https://vimeo.com/142895727.
Доклад Александра Макарова для Съесть собаку #10: PHP, 12/10/2017.
Тезисы:
- Что такое архитектура сайта и зачем она нужна
- Виноват ли фреймворк в плохой архитектуре
- Где выход из сложности и регрессий
- Что делать со сложным доменом
- Выводы.
Слайды для лекции о паттернах, что я давал в Aller Media Norge в 2019.
Ссылка на исходник на GDocs:
https://docs.google.com/presentation/d/1CL2umKOcEeBehJ_hFlaD7P5pdoey_trCTeSnd5TiBSI/edit?usp=sharing
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014Python Meetup
Ежедневно разработчикам приходится писать десятки классов для разного рода функционала. Этот функционал может быть связан между собой или иметь разные функции. Нередко, сопровождая чужой код, программист, который более или менее понимает как должен реализовываться класс, видит картину, где, к примеру, класс «Товар» изменяет баланс клиента. По сути это в корне неверно!
Доклад будет рассматривать такую проблему как правильного написания классов. Данные 5 принципов можно применять к любому объектно-ориентированному языку, но в рамках Python meetup примеры будут продемонстрированы на python.
Данный доклад рассматривает 5 основных принципов, где каждая буква в аббревиатуре обозначает свой принцип.
S – Single responsibility principle (Принцип единой обязанности):
O – Open/Closed principle (Принцип Открытости/Закрытости)
L – Liskov substitution principle (Принцип постановки Барбары Лисков)
I – Interface segregation principle (Принцип разделения интерфейса)
D – Dependency inversion principle (Принцип инверсий зависимостей)
PHP Meetup
Микола Паламарчук
— Розробник в Upwork (PHP infrastructure team)
— Більше 10 років досвіду в web development
— Спікер WebCamp:PHP Одеса (2016), PHP fwdays Київ (2015, 2017)
В проектуванні ПЗ є основні принципи.
Звично їх використовують лише для ООП, але насправді ці принципи мають застосування на всіх етапах розробки, навіть у функціональному програмуванні.
Доповідь про приклади застосування цих принципів на різних рівнях і про переваги такого підходу
Секрет производства: программный продукт, за который не будет стыдноCUSTIS
Открытый семинар для студентов в компании CUSTIS (15 октября 2015 года).
Лектор: Виктор Крапивин, архитектор.
Аннотация: В программном проекте разработчику постоянно приходится работать с унаследованным кодом созданных ранее программ, которые предстоит доделать, исправить или сделать источником примеров в дальнейшей практике. В процессе изучения такого исходного кода программисты часто возмущаются, порой не без оснований заявляя: «Ну кто же так пишет?!». Многочисленные непонятные решения, срочные заплаты для исправления критических ошибок, «костыли» — во всем этом непросто разобраться даже при наличии документации, а ведь иногда она уже не актуальна или ее нет совсем.
Создавая программный продукт, который может «дожить» до промышленной эксплуатации, необходимо помнить, что рано или поздно он попадет в руки программистов, не имеющих отношения к его первоначальной разработке. В ходе этого семинара мы на примерах из мира Java продемонстрируем, как создать этот продукт таким образом, чтобы «потомки» остались довольны.
Видеозапись семинара: https://vimeo.com/142895727.
Доклад Александра Макарова для Съесть собаку #10: PHP, 12/10/2017.
Тезисы:
- Что такое архитектура сайта и зачем она нужна
- Виноват ли фреймворк в плохой архитектуре
- Где выход из сложности и регрессий
- Что делать со сложным доменом
- Выводы.
Слайды для лекции о паттернах, что я давал в Aller Media Norge в 2019.
Ссылка на исходник на GDocs:
https://docs.google.com/presentation/d/1CL2umKOcEeBehJ_hFlaD7P5pdoey_trCTeSnd5TiBSI/edit?usp=sharing
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014Python Meetup
Ежедневно разработчикам приходится писать десятки классов для разного рода функционала. Этот функционал может быть связан между собой или иметь разные функции. Нередко, сопровождая чужой код, программист, который более или менее понимает как должен реализовываться класс, видит картину, где, к примеру, класс «Товар» изменяет баланс клиента. По сути это в корне неверно!
Доклад будет рассматривать такую проблему как правильного написания классов. Данные 5 принципов можно применять к любому объектно-ориентированному языку, но в рамках Python meetup примеры будут продемонстрированы на python.
Данный доклад рассматривает 5 основных принципов, где каждая буква в аббревиатуре обозначает свой принцип.
S – Single responsibility principle (Принцип единой обязанности):
O – Open/Closed principle (Принцип Открытости/Закрытости)
L – Liskov substitution principle (Принцип постановки Барбары Лисков)
I – Interface segregation principle (Принцип разделения интерфейса)
D – Dependency inversion principle (Принцип инверсий зависимостей)
3. OOA&D
OOA&D - объектно ориентированный
анализ и дизайн
OOA - объекты, отражающие
What?
функциональные требования
OOD - как эти объекты
How?
взаимодействуют
4. Почему важен
хороший OOD?
Позволяет разрабатывать быстрее
Позволяет поддерживать высокое
качество на протяжении всего цикла
разработки
Упрощает понимание работы системы
6. Плохой дизайн
Rigidity - закрепощённость
Fragility - хрупкость
Immobility - монолитность
Viscosity - вязкость
Complexity - неоправданная сложность
A lot of code smells - говнокод
7. Rigidity /
закрепощённость
Система с трудом поддаётся
изменениям
Последствия даже простых изменений
непредсказуемы
Одно изменение влечёт за собой каскад
изменений в куче модулей
Тяжело оценить затраты на изменение
8. Fragility / хрупкость
Внесение изменений ломает систему в
совершенно непредсказуемых местах
В процессе исправления этих ошибок
появляются новые
9. Immobility /
монолитность
Выделение компонентов системы,
которые могли бы повторно
использоваться, приводит к большим
рискам
Проще написать заново, чем что-то
переиспользовать
10. Viscosity / вязкость
Хак сделать проще, чем написать так,
как задумано дизайном
Расширение дизайна проходит
болезненно и тяжело
Вероятность ошибки при следовании
дизайну очень высока
11. Complexity /
сложность
Вангующие разработчики, пытающиеся
предсказать будущие требования
Как итог — много лишнего кода/дизайна
«на будущее»
12. Code smells / говнокод
Копипаст
God-objects
Много параметров в методах
Методы на 500 строк
17. SRP / Единственность
ответственности
Компонент должен иметь только одну
область ответственности
Компонент должен иметь только одну
причину для изменения
21. OCP / открытость-
закрытость
Компоненты должны быть открыты для
расширения, но закрыты от изменений
Поведение компонента можно
расширить без изменения его
внутренней реализации
Use abstractions, Luke!
22. OCP / открытость-
закрытость
void Draw(Shape[] shapes)
{
foreach (var shape in shapes)
{
Type type = shape.GetType();
if (type == typeof(Square))
DrawSquare((Square)shape);
else if (type == typeof(Circle))
DrawCircle((Circle)shape);
}
}
}
23. OCP / открытость-
закрытость
Часто изменяющиеся вещи держите подальше
от тех, которые изменяются редко
Если они зависят друг от друга, часто
изменяющиеся компоненты должны зависеть от
редко изменяющихся. Не наоборот!
Предпочитайте композицию наследованию
25. LSP / Принцип
замещения Лисков
Eсли для каждого объекта o1
типа S существует объект o2
типа T, который для всех
программ P определен в
терминах T, то поведение P
не изменится, если o1
заменить на o2 при условии,
что S является подтипом T.
26. LSP / Принцип
замещения Лисков
Подтипы должны быть полностью
заменяемыми базовыми типами в местах, где
они используются
В места, где используются подтипы, можно
подставить базовый тип без неожиданных
изменений в поведении
27. LSP / Принцип
замещения Лисков
public class DoubleList<T> : IList<T>
{
private readonly IList<T> _innerList = new
List<T>();
public void Add(T item)
{
innerList.Add(item);
innerList.Add(item);
}
}
28. LSP / Принцип
замещения Лисков
Проектирование по контракту
Наследуемый объект может изменить
родительское пред-условие на такое же
или более слабое, а пост условие на
такое же или более сильное
31. ISP / разделение
интерфейсов
Большие классы бывают
Клиенту не всегда нужны все методы
класса
Клиент не должен зависеть от того, что
он не использует
32. DIP / инверсия
зависимостей
Модули верхнего уровня не должны
зависеть от модулей нижнего уровня.
Оба должны зависеть от абстракций.
Абстракция не должна зависеть от
деталей реализации, детали реализации
должны зависеть от абстракций
33. DIP / инверсия
зависимостей
public class Reporter
{
public void SendReports()
{
var reportBuilder = new ReportBuilder();
var report = reportBuilder.CreateReport();
var reportSender = new EmailReportSender();
reportSender.Send(report);
}
}
34. DIP / инверсия
зависимостей
public class Reporter
{
private readonly IReportBuilder _builder;
private readonly IReportSender _sender;
public Reporter(IReportBuilder builder,
IReportSender sender)
{
_builder = builder;
_sender = sender;
}
public void SendReports()
{
var report = _builder.CreateReport();
_sender.Send(report);
}
}
37. DIP / инверсия
зависимостей
Стремитесь нигде не зависеть от
конкретных реализаций, зависьте от
абстракций
Стремитесь выделять абстракции
Dependency Injection, особенно в
конструкторах
IoC контейнеры
38. Выводы
Хороший дизайн — это непросто, но достижимо
Вовремя избавляйтесь от плохих запахов, закрывайте
технические долги
Хороший дизайн почти всегда подразумевает слабое
связывание
Читайте книги и старайтесь применять знания на практике
Не бросайтесь сразу менять архитектуру вашего проекта,
применяйте принципы только тогда, когда это нужно