Last active
February 6, 2023 12:01
Revisions
-
Barolina revised this gist
Feb 6, 2023 . 1 changed file with 17 additions and 11 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -76,12 +76,14 @@ _____ ### 5. D - Dependency inversion principle Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба типа модулей обязаны зависеть от абстракций. Абстракции не должны зависеть от подробностей. Подробностям следует зависеть от абстракций. В классическом программирование классы инициируются через new Class(). Подменить реализацию нижнего уровня не возможно. Как результат уровни зависят друг от друга, логику абстракций сложно удержать в одном месте и не размывать по разным слоям Невозможно написать хорошие юнит тесты. **Плохой пример** - прямая зависсимость @@ -93,7 +95,9 @@ _____  Тут видно что все наши зависимости стали инвертируемы. То есть теперь не верхние модули зависят от нижних, а нижние от верхних. На этом рисунки у каждого компонента есть свой собственный интерфейс, и этот компонент знает о нижнем классе, только то что может знать интерфейс. При этом модуль нижнего уровня не может общаться с модулем верхнего уровня напрямую, только через его интерфейс. ``` class PdfFormatter @@ -113,12 +117,14 @@ class Printer **Особенности принципа** изменения реализации модулей низкого уровня не должны изменить модули высокого уровня (проблема абстракции или отсутствие инверсии) - Языки программирования предостовляют свои классы высокого уровня такие как String, Date, Time, и т.п. И их использование не создает ни какой проблемы зависимостей. Потому что эти зависимости статичны, в них ничего не меняется. - В идеале интерфейс должен быть общим и не от кого ни зависить. - Всегда помните, изменяя интерфейс абстракции, меняется реализация нижнего слоя. - Данный принцип позволяет создать слоистость приложения. - Более высокие модули реализуют бизнес модель приложения. - Низкие модули реализуют конкретные действия (запросы в БД, сложные вычисления и т.д.) Их удобно переиспользовать в других программах в виде библиотек и общих модулей. **Суть принципа** -
Barolina revised this gist
Feb 6, 2023 . 1 changed file with 5 additions and 5 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -8,7 +8,7 @@ ___ ### 1. S - Single responsibility principle - у компонента должна быть только одна причина для изменения - соберите водеино, то что меняется по тем же причинам и отделите те вещи, которые меняются по разным причинам. @@ -26,7 +26,7 @@ ___ ____ ### 2. O - Open-close principle - Программные объекты (классы, модули, функции и т.п.) должны быть открыты для расширения, но в то же время закрыты для модификации. @@ -50,7 +50,7 @@ switch (name) { ____ ### 3. L - Liskov substitution principle Данный принцип касается наследование классов. Точнее он описывает то, как надо правильно создавать наследование. @@ -60,7 +60,7 @@ ____ ____ ### 4. I - Interface segregation principle **Кратко** - универсальность не всегда хороша @@ -74,7 +74,7 @@ ____ _____ ### 5. D - Dependency inversion principle Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба типа модулей обязаны зависеть от абстракций. Абстракции не должны зависеть от подробностей. Подробностям следует зависеть от абстракций -
Barolina revised this gist
Feb 6, 2023 . 1 changed file with 31 additions and 19 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,36 +1,39 @@ ### Все принципы дядюшки Боба: - Single responsibility principle - Open-close principle - Liskov substitution principle - Interface segregation principle - Dependency inversion principle ___ ### 1. S - у компонента должна быть только одна причина для изменения - соберите водеино, то что меняется по тем же причинам и отделите те вещи, которые меняются по разным причинам. **Когда нужен:** - Нужно сделать код гибким и легко изменяемым. - Сложно заранее определить вектор изменений. - Разделение функционала — долгая и сложная операция, нежели его объединение, поэтому отдавайте предпочтение декомпозиции. То есть старайтесь сразу создать архитектуру из небольших, независимых друг от друга сущностей. **Когда нет** - Заранее известно о неизменяемости кода в конкретном месте - Решение сильно усложняет разработку и поддержку кода. Всегда нужно сохранять баланс между количеством классов и их необходимостью. ____ ### 2. O - Программные объекты (классы, модули, функции и т.п.) должны быть открыты для расширения, но в то же время закрыты для модификации. - То есть класс должен быть создан таким образом, что бы поведение класса можно было бы дополнить в любой момент. По мере изменения требований мы должны иметь возможность дополнить класс новым функционалом. - При добавление нового функционала нельзя вносить изменения в исходный код такого класса. То есть весь новый код не должен затрагивать старый. **Сигнал, когда нарушается данный принцип** ``` switch (name) { @@ -41,30 +44,37 @@ switch (name) { } ``` **Суть принципа** Изменения в программе должны происходить при написание нового кода, а не модификации старого. ____ ### 3. L Данный принцип касается наследование классов. Точнее он описывает то, как надо правильно создавать наследование. **Цель принципа** Помогает сделать правильное наследование классов. ____ ### 4. I **Кратко** - универсальность не всегда хороша Клиенты не должны попадать в зависимость от методов, которыми они не пользуются **Цель принципа:** - Принцип борется с толстыми интерфейсами (то есть интерфейсами на все случаи жизни) - По сути это принцип персональной отвественности, но для интерфейсов (то есть каждый интерфейс должен делать одну свою задачу) - Интерфейс должен быть абстрактным (иметь универсальное имя и никому не принадлежать) _____ ### 5. D Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба типа модулей обязаны зависеть от абстракций. Абстракции не должны зависеть от подробностей. Подробностям следует зависеть от абстракций @@ -73,12 +83,12 @@ switch (name) { Как результат уровни зависят друг от друга, логику абстракций сложно удержать в одном месте и не размывать по разным слоям Невозможно написать хорошие юнит тесты **Плохой пример** - прямая зависсимость  **Хороший пример**  @@ -100,7 +110,8 @@ class Printer function print(PdfFormatter formatter) ``` **Особенности принципа** изменения реализации модулей низкого уровня не должны изменить модули высокого уровня (проблема абстракции или отсутствие инверсии) Языки программирования предостовляют свои классы высокого уровня такие как String, Date, Time, и т.п. И их использование не создает ни какой проблемы зависимостей. Потому что эти зависимости статичны, в них ничего не меняется. В идеале интерфейс должен быть общим и не от кого ни зависить @@ -110,7 +121,8 @@ class Printer Низкие модули реализуют конкретные действия (запросы в БД, сложные вычисления и т.д.) Их удобно переиспользовать в других программах в виде библиотек и общих модулей. **Суть принципа** Зависимости должны строиться относительно абстракций, а не деталей. -
Barolina created this gist
Feb 6, 2023 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,117 @@ Все принципы дядюшки Боба: - Single responsibility principle - Open-close principle - Liskov substitution principle - Interface segregation principle - Dependency inversion principle 1. S - у компонента должна быть только одна причина для изменения - соберите водеино, то что меняется по тем же причинам и отделите те вещи, которые меняются по разным причинам. Когда нужен: - Нужно сделать код гибким и легко изменяемым. - Сложно заранее определить вектор изменений. - Разделение функционала — долгая и сложная операция, нежели его объединение, поэтому отдавайте предпочтение декомпозиции. То есть старайтесь сразу создать архитектуру из небольших, независимых друг от друга сущностей. Когда нет - Заранее известно о неизменяемости кода в конкретном месте - Решение сильно усложняет разработку и поддержку кода. Всегда нужно сохранять баланс между количеством классов и их необходимостью. 2. O - Программные объекты (классы, модули, функции и т.п.) должны быть открыты для расширения, но в то же время закрыты для модификации. - То есть класс должен быть создан таким образом, что бы поведение класса можно было бы дополнить в любой момент. По мере изменения требований мы должны иметь возможность дополнить класс новым функционалом. - При добавление нового функционала нельзя вносить изменения в исходный код такого класса. То есть весь новый код не должен затрагивать старый. Сигнал, когда нарушается данный принцип ``` switch (name) { case 'Shape': return new Shape() case 'Rectangle': return new Rectangle() } ``` Суть принципа Изменения в программе должны происходить при написание нового кода, а не модификации старого. - L Данный принцип касается наследование классов. Точнее он описывает то, как надо правильно создавать наследование. Цель принципа Помогает сделать правильное наследование классов. - I Кратко - универсальность не всегда хороша Клиенты не должны попадать в зависимость от методов, которыми они не пользуются Цель принципа: - Принцип борется с толстыми интерфейсами (то есть интерфейсами на все случаи жизни) - По сути это принцип персональной отвественности, но для интерфейсов (то есть каждый интерфейс должен делать одну свою задачу) - Интерфейс должен быть абстрактным (иметь универсальное имя и никому не принадлежать) - D Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба типа модулей обязаны зависеть от абстракций. Абстракции не должны зависеть от подробностей. Подробностям следует зависеть от абстракций В классическом программирование классы инициируются через new Class() Подменить реализацию нижнего уровня не возможно Как результат уровни зависят друг от друга, логику абстракций сложно удержать в одном месте и не размывать по разным слоям Невозможно написать хорошие юнит тесты Плохой пример - прямая зависсимость  Хороший пример  Тут видно что все наши зависимости стали инвертируемы. То есть теперь не верхние модули зависят от нижних, а нижние от верхних. На этом рисунки у каждого компонента есть свой собственный интерфейс, и этот компонент знает о нижнем классе, только то что может знать интерфейс. При этом модуль нижнего уровня не может общаться с модулем верхнего уровня напрямую, только через его интерфейс. ``` class PdfFormatter function format(data) # format data to Pdf logic class HtmlFormatter function format(data) # format data to Html logic class Printer function Printer(data) this.data = data function print(PdfFormatter formatter) ``` Особенности принципа изменения реализации модулей низкого уровня не должны изменить модули высокого уровня (проблема абстракции или отсутствие инверсии) Языки программирования предостовляют свои классы высокого уровня такие как String, Date, Time, и т.п. И их использование не создает ни какой проблемы зависимостей. Потому что эти зависимости статичны, в них ничего не меняется. В идеале интерфейс должен быть общим и не от кого ни зависить Всегда помните, изменяя интерфейс абстракции, меняется реализация нижнего слоя Данный принцип позволяет создать слоистость приложения Более высокие модули реализуют бизнес модель приложения. Низкие модули реализуют конкретные действия (запросы в БД, сложные вычисления и т.д.) Их удобно переиспользовать в других программах в виде библиотек и общих модулей. Суть принципа Зависимости должны строиться относительно абстракций, а не деталей.