From 5d2a4e677e05b0c5e0a8f33bbafbb5dc55acc286 Mon Sep 17 00:00:00 2001
From: Yousri <54667@etu.he2b.be>
Date: Mon, 9 May 2022 12:12:37 +0200
Subject: [PATCH 1/8] Start- Intro_to_Solid.md
---
Intro_to_Solid.md | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
create mode 100644 Intro_to_Solid.md
diff --git a/Intro_to_Solid.md b/Intro_to_Solid.md
new file mode 100644
index 0000000..39d8381
--- /dev/null
+++ b/Intro_to_Solid.md
@@ -0,0 +1,29 @@
+# Object-Oriented class design
+
+
+## SOLID
+SOLID coding is a principle created by Robert C.Martin, he is a famous computer scientist.
+SOLID is an acronym for his five conventions of coding.
+With their conventions, you can improve the structure of your code, reduce time to implement changes and technical debts, etc.
+It is a collection of best practices.
+And it was developed through this decades.
+Principles of SOLID acronym are:
+
+* The Single-Responsibility Principle (**SRP**)
+* The Open-Closed Principle (**OCP**)
+* The Liskov Substitution Principle (**LSP**)
+* The Interface Segregation Principle (**ISP**)
+* The Dependency inversion Principle (**DIP**)
+
+The first conventions is **SRP**, that means that all classes of your code must do one thing.
+That is an important principle.
+That is the best way to work with others people in the same project.
+Version control is easier,
+You will never have _Merge conflicts_, because other people works in an another operations.
+So, he will never have two same things in the code.
+
+
+
+
+
+
From 1bc82d4956de57e567855365c1d6eb24f62aaf08 Mon Sep 17 00:00:00 2001
From: Yousri <54667@etu.he2b.be>
Date: Mon, 9 May 2022 17:04:21 +0200
Subject: [PATCH 2/8] Talk about OCP(not finish)
---
Intro_to_Solid.md | 111 ++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 108 insertions(+), 3 deletions(-)
diff --git a/Intro_to_Solid.md b/Intro_to_Solid.md
index 39d8381..49a0a03 100644
--- a/Intro_to_Solid.md
+++ b/Intro_to_Solid.md
@@ -6,7 +6,7 @@ SOLID coding is a principle created by Robert C.Martin, he is a famous computer
SOLID is an acronym for his five conventions of coding.
With their conventions, you can improve the structure of your code, reduce time to implement changes and technical debts, etc.
It is a collection of best practices.
-And it was developed through this decades.
+And it was developed through this decade.
Principles of SOLID acronym are:
* The Single-Responsibility Principle (**SRP**)
@@ -15,15 +15,120 @@ Principles of SOLID acronym are:
* The Interface Segregation Principle (**ISP**)
* The Dependency inversion Principle (**DIP**)
-The first conventions is **SRP**, that means that all classes of your code must do one thing.
+The first convention is **SRP**, that means that all classes of your code must do one thing.
That is an important principle.
That is the best way to work with others people in the same project.
Version control is easier,
-You will never have _Merge conflicts_, because other people works in an another operations.
+You will never have _Merge conflicts_, because other people work in other operations.
So, he will never have two same things in the code.
+### Single-Responsibility
+Let's start something !
+We will make common mistake that violate **SRP** and correct them.
+Let's code a bookstore invoice.
+
+```python
+class Book(object):
+ def __init__(self, name, authorName, year, price, isbn):
+ self.name = name
+ self.authorName = authorName
+ self.year = year
+ self.price = price
+ self.isbn = isbn
+```
+
+As you can see, there is a class named Book with some fields.
+This fields are public and characterize a book.
+
+OK ! Now we can start the invoice class.
+This class will calculate the final price for a customer.
+
+```python
+class Invoice:
+ def __init__(self, book, quantity, discountRate, taxRate, total):
+ self.book = book
+ self.quantity = quantity
+ self.discountRate = discountRate
+ self.taxRate = taxRate
+ self.total = total
+ def calculateTotal(self):
+ self.price = ((self.book.price - self.book.price * self.discountRate)*self.quantity)
+
+ self.priceWithTaxes = self.price * (1 + self.taxRate)
+
+ return self.priceWithTaxes
+
+ def printInvoice(self):
+ print(self.quantity, "x", self.book.name,"", self.book.price, "$");
+ print("Discount Rate: ", self.discountRate)
+ print("Tax Rate: ", self.taxRate)
+ print("Total: ", self.total)
+ def saveToFile(self, fileName):
+ pass
+```
+
+Alright, now we have the _Invoice_ class, he had 3 methods (calculateTotal, printInvoice, saveToFile) and some fields too.
+Why this code violate the first convention of **SOLID** ?
+
+
+The _printInvoice_ method violate this one because the **SRP** told us to make just one thing per classes.
+Here, our printing logic is in the same class than _calculateTotal_ method.
+So, the printing logic is mixed with business logic in the same class.
+As you think, the _saveToFile_ method violate this convention too.
+
+Let's correct this example.
+```python
+class InvoicePrinter(object):
+ def __init__(self, invoice):
+ self.invoice = invoice
+ def printInvoice(self):
+ print(self.invoice.quantity, "x", self.invoice.book.name,"", self.invoice.book.price, "$");
+ print("Discount Rate: ", self.invoice.discountRate)
+ print("Tax Rate: ", self.invoice.taxRate)
+ print("Total: ", self.invoice.total)
+```
+
+```python
+class InvoicePersistence(object):
+ def __init__(self, invoice):
+ self.invoice = invoice
+
+ def saveToFile(self):
+ pass
+```
+
+We have now two others classes, _InvoicePrinter_ class and _InvoicePersistence_ class.
+The _InvoicePrinter_ is used to print information.
+And the _InvoicePersistence_ is used to save information.
+
+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.
+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.
+
+Ok so, let's add new functionality in the _InvoicePersistence_ class.
+
+```python
+class InvoicePersistence(object):
+ def __init__(self, invoice):
+ self.invoice = invoice
+
+ def saveToFile(self):
+ pass
+
+ def saveToDataBase(self):
+ pass
+```
+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
From 6a7f4d1205e80b8e440c8977f2a7f029e12722a5 Mon Sep 17 00:00:00 2001
From: Yousri <54667@etu.he2b.be>
Date: Tue, 10 May 2022 10:54:02 +0200
Subject: [PATCH 3/8] OCP UML Starting
---
Intro_to_Solid.md | 38 +++++++++++++++++++++++++++++++++++---
1 file changed, 35 insertions(+), 3 deletions(-)
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 ...")
+```
From a52ad438557d258fc4bc6b2edf7b3ec9fee65c2f Mon Sep 17 00:00:00 2001
From: Yousri <54667@etu.he2b.be>
Date: Tue, 10 May 2022 11:15:24 +0200
Subject: [PATCH 4/8] UML OCP finished, Start with Liskov Substitution
Principle
---
Intro_to_Solid.md | 14 ++++++++++++--
assets/UML_Solid | Bin 0 -> 32602 bytes
2 files changed, 12 insertions(+), 2 deletions(-)
create mode 100644 assets/UML_Solid
diff --git a/Intro_to_Solid.md b/Intro_to_Solid.md
index adc6da5..32c79c5 100644
--- a/Intro_to_Solid.md
+++ b/Intro_to_Solid.md
@@ -144,7 +144,7 @@ class InvoicePersistence(abc.ABC):
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.
+And for example, we will create a _DataBasePersistence_ class, and this class inherits the abstract _InvoicePersistence_ class.
```python
class DatabasePersistence(InvoicePersistence):
def __init__(self, invoice):
@@ -154,7 +154,7 @@ class DatabasePersistence(InvoicePersistence):
def save(self, invoice):
print("Save in database ...")
```
-Let's make the same thing with _FilePersistence_ class.
+Let's do the same thing with _FilePersistence_ class.
```python
class FilePersistence(InvoicePersistence):
def __init__(self, invoice):
@@ -164,3 +164,13 @@ class FilePersistence(InvoicePersistence):
def save(self, invoice):
print("Save to file ...")
```
+Ok, we do a lot of things, let's make a UML to represent our class structure.
+
+
+
+
+
+That will be more simple to do extension.
+
+### Liskov Substitution Principle
+
diff --git a/assets/UML_Solid b/assets/UML_Solid
new file mode 100644
index 0000000000000000000000000000000000000000..a2581d6c6937b4506260e883f680715e3f2415e2
GIT binary patch
literal 32602
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
Zz`m{PRBUcsgER5xhYlXmOw%|K^k4d|Moj
Date: Tue, 10 May 2022 12:03:43 +0200
Subject: [PATCH 5/8] Information of Liskov Substitution Principle and
Interface Segregation Principle: make example
---
Intro_to_Solid.md | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/Intro_to_Solid.md b/Intro_to_Solid.md
index 32c79c5..4522e8b 100644
--- a/Intro_to_Solid.md
+++ b/Intro_to_Solid.md
@@ -174,3 +174,12 @@ That will be more simple to do extension.
### Liskov Substitution Principle
+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.
+
+### 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.
+
+### Dependency Inversion Principle
From 93422cad7f588383f2e81a4b062bd04a23f7e844 Mon Sep 17 00:00:00 2001
From: Yousri <54667@etu.he2b.be>
Date: Tue, 10 May 2022 12:07:39 +0200
Subject: [PATCH 6/8] Resize Images
---
Intro_to_Solid.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Intro_to_Solid.md b/Intro_to_Solid.md
index 4522e8b..6811078 100644
--- a/Intro_to_Solid.md
+++ b/Intro_to_Solid.md
@@ -167,7 +167,7 @@ class FilePersistence(InvoicePersistence):
Ok, we do a lot of things, let's make a UML to represent our class structure.
-
+
That will be more simple to do extension.
From 920982a7413ed7cb64e448f35d5ea94ae3916c8f Mon Sep 17 00:00:00 2001
From: Yousri <54667@etu.he2b.be>
Date: Tue, 10 May 2022 15:28:26 +0200
Subject: [PATCH 7/8] DIP explication starting
---
Intro_to_Solid.md | 153 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 153 insertions(+)
diff --git a/Intro_to_Solid.md b/Intro_to_Solid.md
index 6811078..e668b80 100644
--- a/Intro_to_Solid.md
+++ b/Intro_to_Solid.md
@@ -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.
+
+
+
+Subclasses
+
+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
+
+```
+
+
+
### 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.
From 9a09ff821f48555859f9b74da30f94b85ad2c2fa Mon Sep 17 00:00:00 2001
From: Yousri <54667@etu.he2b.be>
Date: Tue, 10 May 2022 16:08:05 +0200
Subject: [PATCH 8/8] Quote Added
---
Intro_to_Solid.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/Intro_to_Solid.md b/Intro_to_Solid.md
index e668b80..a2c228c 100644
--- a/Intro_to_Solid.md
+++ b/Intro_to_Solid.md
@@ -336,3 +336,6 @@ You have to create a new mother class for these two classes like the preceding e
This convention says that all classes that we use depends on the interface or abstract classes.
Like precedents example, all methods was abstracts.
+
+>The Dependency Inversion principle states that our classes should depend upon interfaces or abstract classes instead of concrete classes and functions.
+>We want our classes to be open to extension, so we have reorganized our dependencies to depend on interfaces instead of concrete classes.
\ No newline at end of file