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.
|
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.
|
||||||
|
|
Loading…
Reference in New Issue