DIP explication starting

This commit is contained in:
Yousri 2022-05-10 15:28:26 +02:00
parent 93422cad7f
commit 920982a741
1 changed files with 153 additions and 0 deletions

View File

@ -177,9 +177,162 @@ That will be more simple to do extension.
This convention tells us to create a substitutable subclass for their parents. This convention tells us to create a substitutable subclass for their parents.
So, if you want to create an object in the subclass, you have to be able to pass it in the interface. So, if you want to create an object in the subclass, you have to be able to pass it in the interface.
Let's make an example !
We will write a _Walk_ class and his subclass, _Jump_ class.
```python
class Walk(abc.ABC):
def __init__(self):
abc.ABC.__init__(self)
@abc.abstractmethod
def Speed(self):
pass
@abc.abstractmethod
def Ahead(self):
pass
'''the player walk ahead'''
@abc.abstractmethod
def Behind(self):
pass
'''the player walk behind'''
```
And the _Jump_ subclass.
```python
class Jump(Walk):
def __init__(self):
pass
def Speed(self):
pass
def Ahead(self):
pass
def Behind(self):
pass
```
As you can see, the _Jump_ subclass has all abstract method of _Walk_ class.
But we have a big problem !
The _Jump_ subclass need a new method, the _height_ method.
And he does not need the _Ahead_ and _Behind_ method.
If you remove abstract method and add a new method in _Jump_ subclass, you will be in a big trouble.
This subclass will be different about mother class.
The simple way to resolve this trouble is to create a new mother class for _Walk_ and _Jump_ class.
```python
class Movement(abc.ABC):
def __init__(self):
abc.ABC.__init__(self)
@abc.abstractmethod
def Speed(self):
pass
@abc.abstractmethod
def Animation(self):
pass
@abc.abstractmethod
def Direction(self):
pass
```
The _Movement_ class will be the mother class of _Walk_ and _Jump_ classes.
These subclasses will have three methods (_Speed_, _Animation_ and _Direction_ methods).
The problems that we had is resolved with the _Direction_ method.
With this method, you have choices to go ahead, behind, height, etc.
<details>
<summary>
Subclasses
</summary>
The _Walk_ subclass:
```python
class Walk(Movement):
def __init__(self):
pass
def Speed(self):
pass
def Animation(self):
pass
def Direction(self):
pass
```
And the _Jump_ subclass:
```python
class Jump(Movement):
def __init__(self):
pass
def Speed(self):
pass
def Animation(self):
pass
def Direction(self):
pass
```
</details>
### Interface Segregation Principle ### Interface Segregation Principle
The _Interface Segregation Principle_ means that all interfaces have to be separated. The _Interface Segregation Principle_ means that all interfaces have to be separated.
That means that clients has not functions that they do not need. That means that clients has not functions that they do not need.
OK ! So, let's make an example with client manager.
```python
class GoodCustomer(abc.ABC):
def __init__(self):
abc.ABC.__init__(self)
@abc.abstractmethod
def FirstName(self):
pass
@abc.abstractmethod
def LastName(self):
pass
@abc.abstractmethod
def Address(self):
pass
@abc.abstractmethod
def Work(self):
pass
```
The _GoodCustomer_ mother class is a class where good customer information are saved.
```python
class BadCustomer(GoodCustomer):
def __init__(self):
pass
def FirstName(self):
pass
def LastName(self):
pass
def Address(self):
pass
def Work(self):
pass
```
The _BadCustomer_ subclass is a class where bad customer information are saved.
For this example, we don't want to know the addresses of bad guys.
So what can we do ?
You have to create a new mother class for these two classes like the preceding example.
### Dependency Inversion Principle ### Dependency Inversion Principle
This convention says that all classes that we use depends on the interface or abstract classes.
Like precedents example, all methods was abstracts.