diff --git a/Intro_to_Solid.md b/Intro_to_Solid.md index 49a0a03..adc6da5 100644 --- a/Intro_to_Solid.md +++ b/Intro_to_Solid.md @@ -44,7 +44,7 @@ OK ! Now we can start the invoice class. This class will calculate the final price for a customer. ```python -class Invoice: +class Invoice(object): def __init__(self, book, quantity, discountRate, taxRate, total): self.book = book self.quantity = quantity @@ -111,7 +111,7 @@ With these three classes, we respect the first principle of **SOLID**. ### Open-Closed Principle This principle says that classes are open for extension and closed to modification. -Extension mean news functionality and modification mean modifying your code. +Extension mean news functionalities and modification mean modifying your code. If you want to add new functionalities, you are able to add it without manipulating the existing program. If you touch the existing code, you have a risk to have news bugs. So, if you want to add something else, you can use abstract classes and help of interface. @@ -131,4 +131,36 @@ class InvoicePersistence(object): ``` The _saveToDataBase_ method is used to save information in a Data Base. We have modified the _InvoicePersistence_ class. -This class will be more difficult to make easily extendable. \ No newline at end of file +And this class will be more difficult to make easily extendable. +So, we violate the **OCP** convention. +If you want to respect this principle, you have to create a new class. + +```python +class InvoicePersistence(abc.ABC): + @abstractmethod + def save(self, invoice): + pass +``` +The new _InvoicePersistence_ class has an abstract method. +So, if a class inherits the _InvoicePersistence_ class, you have to implement the _save_ method. + +And for example, we will create a _DataBasePersistence_ class, and this class inherit the abstract _InvoicePersistence_ class. +```python +class DatabasePersistence(InvoicePersistence): + def __init__(self, invoice): + self.invoice = invoice + self.save(self.invoice) + + def save(self, invoice): + print("Save in database ...") +``` +Let's make the same thing with _FilePersistence_ class. +```python +class FilePersistence(InvoicePersistence): + def __init__(self, invoice): + self.invoice = invoice + self.save(self.invoice) + + def save(self, invoice): + print("Save to file ...") +```