Princípio aberto-fechado do Python

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.

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 PersonStorageclasse 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 PersonStorageclasse. Isso significa que a PersonStorageclasse 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 PersonStorageaula 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):
        passLinguagem de código:  Python  ( python )

Em segundo lugar, crie duas classes PersonDBe PersonJSONsalve o Personobjeto no banco de dados e no arquivo JSON. Essas classes herdam da PersonStorageclasse:

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 Personobjeto em um arquivo XML, você pode definir uma nova classe PersonXMLque herda da PersonStorageclasse 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 Personobjeto em um arquivo XML usando a PersonXMLclasse:

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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *