Resumo : neste tutorial, você aprenderá sobre o princípio aberto-fechado para estender o sistema sem modificar diretamente o código existente.
Introdução ao princípio aberto-fechado
O princípio aberto-fechado é um dos cinco princípios do princípio SOLID. A letra O no SOLID representa o princípio aberto-fechado.
- S – Princípio da Responsabilidade Única
- O – Princípio Aberto-Fechado
- L – Princípio da Substituição de Liskov
- I – Princípio de Segregação de Interface
- D – Princípio de Inversão de Dependência
O princípio aberto-fechado afirma que uma classe, método e função devem ser abertos para extensão, mas fechados para modificação.
O princípio aberto-fechado parece contraditório.
O objetivo do princípio aberto-fechado é facilitar a adição de novos recursos (ou casos de uso) ao sistema sem modificar diretamente o código existente.
Considere o seguinte exemplo:
class Person:
def __init__(self, name):
self.name = name
def __repr__(self):
return f'Person(name={self.name})'
class PersonStorage:
def save_to_database(self, person):
print(f'Save the {person} to database')
def save_to_json(self, person):
print(f'Save the {person} to a JSON file')
if __name__ == '__main__':
person = Person('John Doe')
storage = PersonStorage()
storage.save_to_database(person)
Linguagem de código: Python ( python )
Neste exemplo, a PersonStorage
classe possui dois métodos:
- O
save_to_database()
método salva uma pessoa no banco de dados. - O
save_to_json()
método salva uma pessoa em um arquivo JSON.
Posteriormente, se quiser salvar o objeto Person em um arquivo XML, você deverá modificar a PersonStorage
classe. Isso significa que a PersonStorage
classe não está aberta para extensão, mas sim para modificação. Portanto, viola o princípio aberto-fechado.
O exemplo do princípio aberto-fechado
Fazer com que a PersonStorage
aula esteja em conformidade com o princípio aberto-fechado; você precisa projetar as classes para que, quando precisar salvar o objeto Person em um formato de arquivo diferente, não precise modificá-lo.
Veja o seguinte diagrama de classes:
Primeiro, defina a PersonStorage
classe abstrata que contém o save()
método abstrato:
from abc import ABC, abstractmethod
class PersonStorage(ABC):
@abstractmethod
def save(self, person):
pass
Linguagem de código: Python ( python )
Em segundo lugar, crie duas classes PersonDB
e PersonJSON
salve o Person
objeto no banco de dados e no arquivo JSON. Essas classes herdam da PersonStorage
classe:
class PersonDB(PersonStorage):
def save(self, person):
print(f'Save the {person} to database')
class PersonJSON(PersonStorage):
def save(self, person):
print(f'Save the {person} to a JSON file')
Linguagem de código: Python ( python )
Para salvar o Person
objeto em um arquivo XML, você pode definir uma nova classe PersonXML
que herda da PersonStorage
classe assim:
class PersonXML(PersonStorage):
def save(self, person):
print(f'Save the {person} to an XML file')
Linguagem de código: Python ( python )
E você pode salvar o Person
objeto em um arquivo XML usando a PersonXML
classe:
if __name__ == '__main__':
person = Person('John Doe')
storage = PersonXML()
storage.save(person)
Linguagem de código: Python ( python )
Junte tudo:
from abc import ABC, abstractmethod
class Person:
def __init__(self, name):
self.name = name
def __repr__(self):
return f'Person(name={self.name})'
class PersonStorage(ABC):
@abstractmethod
def save(self, person):
pass
class PersonDB(PersonStorage):
def save(self, person):
print(f'Save the {person} to database')
class PersonJSON(PersonStorage):
def save(self, person):
print(f'Save the {person} to a JSON file')
class PersonXML(PersonStorage):
def save(self, person):
print(f'Save the {person} to an XML file')
if __name__ == '__main__':
person = Person('John Doe')
storage = PersonXML()
storage.save(person)
Linguagem de código: Python ( python )
Resumo
- O princípio aberto-fechado permite projetar o sistema de modo que seja aberto para extensão, mas fechado para modificação.