DIP explication starting
This commit is contained in:
parent
93422cad7f
commit
920982a741
|
@ -177,9 +177,162 @@ That will be more simple to do extension.
|
|||
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.
|
||||
|
||||
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
|
||||
|
||||
The _Interface Segregation Principle_ means that all interfaces have to be separated.
|
||||
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
|
||||
|
||||
This convention says that all classes that we use depends on the interface or abstract classes.
|
||||
Like precedents example, all methods was abstracts.
|
||||
|
|
Loading…
Reference in New Issue