Skip to content

Commit 3a43e28

Browse files
committed
feat: add solid page
1 parent 7bff4df commit 3a43e28

1 file changed

Lines changed: 166 additions & 0 deletions

File tree

docs/python/solid.md

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
# SOLID
2+
3+
!!! note ""
4+
**SOLID** - мнемоническая аббревиатура, состоящая из пяти принципов, призванных сделать исходный код более понятным, гибким и поддерживаемым.
5+
6+
## Принципы SOLID
7+
8+
<span class="badge">S</span> **Single Responsibility Principle** *[SRP]* — принцип единственной ответственности.
9+
10+
<span class="badge">O</span> **Open Closed Principle** *[OCP]* — принцип открытости-закрытости.
11+
12+
<span class="badge">L</span> **Liskov Substitution Principle** *[LSP]* — принцип подстановки Барбары Лисков (Заменяемость объектов на экземпляры).
13+
14+
<span class="badge">I</span> **Interface Segregation Principle** *[ISP]* — принцип разделения интерфейса.
15+
16+
<span class="badge">D</span> **Dependency Inversion Principle** *[DIP]* — принцип инверсии зависимостей.
17+
18+
![solid](https://habrastorage.org/getpro/habr/upload_files/dbc/582/da9/dbc582da9e391cca96f4ad0c978154f7.png)
19+
20+
### **S**, Принцип единственной отвественности [SRP]
21+
22+
!!! note ""
23+
**Single Responsibility Principle** - Каждый класс должен отвечать только за одну зону ответственности (действий), чтобы его было проще дополнять и менять. Изменение должно минимально затрагивать код. Надо разделять функциональность большого класса на более мелкие части, отвечающие за конкретные задачи.
24+
25+
```python
26+
class Movement:
27+
def move(self):
28+
pass
29+
30+
class Speaker:
31+
def speak(self):
32+
pass
33+
34+
class Robot:
35+
def __init__(self):
36+
self._movement = Movement()
37+
self._speaker = Speaker()
38+
39+
def move(self):
40+
self._movement.move()
41+
42+
def speak(self):
43+
self._speaker.speak()
44+
```
45+
46+
### **O**, Принцип Открытости-Закрытости [OCP]
47+
48+
!!! note ""
49+
**Open Closed Principle** - Класс должен быть закрыт для изменения, но открыт для расширения. Пишем код так, чтобы другие могли легко расширить функционал, не меняя написанный (оттестированный, понравившийся твоему начальнику) код.
50+
51+
```python
52+
class Character(ABC):
53+
@abstractmethod
54+
def display_info(self):
55+
pass
56+
57+
class Knight(Character):
58+
def display_info(self):
59+
print("Я Рыцарь")
60+
61+
class Wizard(Character):
62+
def display_info(self):
63+
print("Я Маг")
64+
65+
if __name__ == "__main__":
66+
character = Knight()
67+
character.display_info() # Я Рыцарь
68+
69+
character = Wizard()
70+
character.display_info() # Я Маг
71+
72+
```
73+
74+
### **L**, Принцип подстановки Барбары Лисков [LSP]
75+
76+
!!! note ""
77+
**Liskov Substitution Principle** - Если в коде программы Базовый класс заменить на его Наследника, то программа должна работать, так как в Наследнике есть все операции, которые были в Базовом. В Базовый класс нужно выносить только общую логику, которую наследники будут реализовывать. Наследников создаем только тогда, когда они правильно реализуют логику Базового класса.
78+
79+
```python
80+
class Bird(ABC):
81+
@abstractmethod
82+
def move(self):
83+
pass
84+
85+
class FlyingBird(Bird):
86+
def move(self):
87+
self.fly()
88+
89+
def fly(self):
90+
print("Летаю!")
91+
92+
class Sparrow(FlyingBird):
93+
def fly(self):
94+
print("Воробей летит")
95+
96+
class Penguin(Bird):
97+
def move(self):
98+
self.swim()
99+
100+
def swim(self):
101+
print("Пингвин плывёт")
102+
103+
def make_bird_move(bird: Bird):
104+
bird.move()
105+
```
106+
107+
### **I**, Принцип Разделения Интерфейса [ISP]
108+
109+
!!! note ""
110+
**Interface Segregation Principle** - Клиенты не должны зависеть от интерфейсов, которые они не используют. Большие интерфейсы следует разбивать на интерфейсы поменьше. Так клиенты смогут использовать только те интерфейсы, которые им нужны. Это делает менее связанный код, уменьшает зависимости между элементами системы, упрощает изменения в коде.
111+
112+
```python
113+
class Movable(ABC):
114+
@abstractmethod
115+
def move(self):
116+
pass
117+
118+
class Speakable(ABC):
119+
@abstractmethod
120+
def speak(self):
121+
pass
122+
123+
class Flyable(ABC):
124+
@abstractmethod
125+
def fly(self):
126+
pass
127+
128+
class Robot(Movable, Speakable):
129+
def move(self):
130+
pass
131+
132+
def speak(self):
133+
pass
134+
135+
class Drone(Flyable):
136+
def fly(self):
137+
pass
138+
```
139+
140+
### **D**, Принцип Инверсии Зависимостей [DIP]
141+
142+
!!! note ""
143+
**Dependency Inversion Principle** - Зависьте от интерфейсов, а не от конкретных классов. Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций. Интерфейсы не должны зависеть от реализации, а вот реализация должна зависеть от интерфейсов.
144+
145+
```python
146+
class User:
147+
pass
148+
149+
class IDatabase(ABC):
150+
@abstractmethod
151+
def save_data(self, user: User):
152+
pass
153+
154+
class Database(IDatabase):
155+
def save_data(self, user: User):
156+
# Сохранение данных в БД
157+
pass
158+
159+
class UserService:
160+
def __init__(self, database: IDatabase):
161+
self._database = database
162+
163+
def add_user(self, user: User):
164+
self._database.save_data(user)
165+
pass
166+
```

0 commit comments

Comments
 (0)