diff --git a/README.md b/README.md index e4d2801..9175bbf 100644 --- a/README.md +++ b/README.md @@ -750,7 +750,143 @@ print(person.name_as_first_and_last) # => ["Ryan", "McDermott"] ## **Don't repeat yourself (DRY)** -*Coming soon* +Try to observe the [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) principle. + +Do your absolute best to avoid duplicate code. Duplicate code is bad because +it means that there's more than one place to alter something if you need to +change some logic. + +Imagine if you run a restaurant and you keep track of your inventory: all your +tomatoes, onions, garlic, spices, etc. If you have multiple lists that +you keep this on, then all have to be updated when you serve a dish with +tomatoes in them. If you only have one list, there's only one place to update! + +Often you have duplicate code because you have two or more slightly +different things, that share a lot in common, but their differences force you +to have two or more separate functions that do much of the same things. Removing +duplicate code means creating an abstraction that can handle this set of different +things with just one function/module/class. + +Getting the abstraction right is critical. Bad abstractions can be +worse than duplicate code, so be careful! Having said this, if you can make +a good abstraction, do it! Don't repeat yourself, otherwise you'll find yourself +updating multiple places any time you want to change one thing. + +**Bad:** + +```python +from typing import List, Text, Dict +from dataclasses import dataclass + +@dataclass +class Developer: + def __init__(self, experience: float, github_link: Text) -> None: + self._experience = experience + self._github_link = github_link + + @property + def experience(self) -> float: + return self._experience + + @property + def github_link(self) -> Text: + return self._github_link + +@dataclass +class Manager: + def __init__(self, experience: float, github_link: Text) -> None: + self._experience = experience + self._github_link = github_link + + @property + def experience(self) -> float: + return self._experience + + @property + def github_link(self) -> Text: + return self._github_link + + +def get_developer_list(developers: List[Developer]) -> List[Dict]: + developers_list = [] + for developer in developers: + developers_list.append({ + 'experience' : developer.experience, + 'github_link' : developer.github_link + }) + return developers_list + +def get_manager_list(managers: List[Manager]) -> List[Dict]: + managers_list = [] + for manager in managers: + managers_list.append({ + 'experience' : manager.experience, + 'github_link' : manager.github_link + }) + return managers_list + +## create list objects of developers +company_developers = [ + Developer(experience=2.5, github_link='https://github.com/1'), + Developer(experience=1.5, github_link='https://github.com/2') +] +company_developers_list = get_developer_list(developers=company_developers) + +## create list objects of managers +company_managers = [ + Manager(experience=4.5, github_link='https://github.com/3'), + Manager(experience=5.7, github_link='https://github.com/4') +] +company_managers_list = get_manager_list(managers=company_managers) +``` + +**Good:** + +```python +from typing import List, Text, Dict +from dataclasses import dataclass + +@dataclass +class Employee: + def __init__(self, experience: float, github_link: Text) -> None: + self._experience = experience + self._github_link = github_link + + @property + def experience(self) -> float: + return self._experience + + @property + def github_link(self) -> Text: + return self._github_link + + + +def get_employee_list(employees: List[Employee]) -> List[Dict]: + employees_list = [] + for employee in employees: + employees_list.append({ + 'experience' : employee.experience, + 'github_link' : employee.github_link + }) + return employees_list + +## create list objects of developers +company_developers = [ + Employee(experience=2.5, github_link='https://github.com/1'), + Employee(experience=1.5, github_link='https://github.com/2') +] +company_developers_list = get_employee_list(employees=company_developers) + +## create list objects of managers +company_managers = [ + Employee(experience=4.5, github_link='https://github.com/3'), + Employee(experience=5.7, github_link='https://github.com/4') +] +company_managers_list = get_employee_list(employees=company_managers) +``` + + **[⬆ back to top](#table-of-contents)**