Definição: Uma entidade de software, como classes, módulos e funções, deve ser aberta a extensões e fechada a modificações.
A origem do problema: durante o ciclo de vida do software, quando o código original do software precisa ser modificado devido a alterações, atualizações e manutenção, os erros podem ser introduzidos no código antigo e também pode nos forçar a refatorar toda a função, e o código original precisa ser testado.
Solução: Quando o software precisar mudar, tente alcançar a alteração estendendo o comportamento da entidade do software, em vez de modificar o código existente.
O princípio de abertura e fechamento é o princípio de design mais básico no design orientado a objetos, que nos guia como estabelecer um sistema estável e flexível. O princípio de abertura e fechamento pode ser a definição mais vaga dos seis princípios do padrão de design. Ele apenas nos diz para abrir e fechar modificações, mas como podemos ser abertos e fechados e não nos dizer claramente. No passado, se alguém me dissesse: "Você deve cumprir o princípio de abrir e fechar ao projetar", eu sentiria que ele não disse nada, mas parecia que ele disse tudo. Porque o princípio de abrir e fechar é realmente muito vazio.
Depois de pensar e ler cuidadosamente muitos artigos sobre padrões de design, finalmente entendi um pouco do princípio de abrir e fechar. De fato, seguimos os cinco primeiros princípios dos padrões de design, e o objetivo de usar 23 padrões de design é seguir os princípios de abertura e fechamento. Em outras palavras, desde que cumprirmos os cinco primeiros princípios, o software projetado naturalmente se conforma com os princípios de abertura e fechamento. Esse princípio de abertura e fechamento é mais parecido com a "pontuação média" do grau de conformidade dos cinco primeiros princípios. Se os cinco princípios anteriores forem bem seguidos, a pontuação média será naturalmente maior, o que significa que os princípios de abertura e fechamento do design de software serão bem seguidos; Se os cinco princípios anteriores não forem respeitados, isso significa que os princípios de abertura e fechamento não são respeitados.
De fato, o autor acredita que o princípio de abertura e fechamento nada mais é do que expressar o significado: construir uma estrutura com abstração e expandir detalhes com a implementação. Devido à flexibilidade e ampla adaptabilidade da abstração, desde que a abstração seja razoável, a estabilidade da arquitetura de software pode ser basicamente mantida. Para os detalhes da variável no software, usamos a classe de implementação derivada de resumo para estender. Quando o software precisa mudar, precisamos apenas reabastecer uma classe de implementação de acordo com as necessidades de se estender. Obviamente, a premissa é que nossa abstração deve ser razoável e devemos estar com vista para a frente e preventiva nas mudanças na demanda.
Na definição do princípio de abertura e fechamento, uma entidade de software pode se referir a um módulo de software, uma estrutura local composta por várias classes ou uma classe independente.
Qualquer software precisa enfrentar um problema importante, ou seja, suas necessidades mudarão com o tempo. Quando o sistema de software precisa enfrentar novas necessidades, devemos tentar o possível para garantir que a estrutura de design do sistema seja estável. Se um design de software está em conformidade com o princípio de abertura e fechamento, pode ser muito conveniente expandir o sistema e não há necessidade de modificar o código existente ao expandir, para que o sistema de software tenha melhor estabilidade e continuidade, tendo adaptabilidade e flexibilidade. À medida que a escala de software se torna cada vez maior, a vida útil do software se torna mais longa e os custos de manutenção do software se tornam cada vez mais altos, e a criação de sistemas de software que atendem aos princípios de abertura e fechamento está se tornando cada vez mais importante.
Para atender ao princípio de abertura e fechamento, é necessário projetar abstrivelmente o sistema, e a abstração é a chave para o princípio de abertura e fechamento. Em linguagens de programação como Java e C#, uma camada de abstração relativamente estável pode ser definida para o sistema, e diferentes comportamentos de implementação podem ser movidos para a camada de implementação específica a ser concluída. Em muitas linguagens de programação orientadas a objetos, são fornecidos mecanismos como interfaces e classes abstratas, através das quais a camada de abstração do sistema pode ser definida e depois estendida através de classes de concreto. Se você precisar modificar o comportamento do sistema, não há necessidade de fazer alterações na camada de abstração. Você só precisa adicionar novas classes de concreto para implementar novas funções de negócios, de modo a expandir as funções do sistema sem modificar os códigos existentes e atender aos requisitos do princípio de abertura e fechamento.
O sistema CRM desenvolvido pelo Sunny Software pode exibir vários tipos de gráficos, como gráficos de pizza e gráficos de barras. Para suportar vários métodos de exibição de gráficos, o plano de design original é mostrado na figura abaixo:
O snippet de código a seguir existe no método Display () da classe ChartDisplay:
...... if (type.equals ("pie")) {Piechart Chart = new Piechart (); Chart.Display (); } else if (type.equals ("bar")) {Barchart Chart = new Barchart (); Chart.Display (); } ...... Neste código, se você precisar adicionar uma nova classe de gráfico, como LineChart, precisará modificar o código -fonte do método Display () da classe ChartDisplay e adicionar uma nova lógica de julgamento, que viola o princípio de abertura e fechamento.
O sistema agora está reconfigurado para torná -lo em conformidade com o princípio de abertura e fechamento.
Neste exemplo, como cada classe de gráfico é programada no método Display () da classe ChartDisplay, adicionar uma nova classe de gráfico precisa modificar o código -fonte. O sistema pode ser reformado de maneira abstrata, para que, ao adicionar novas classes de gráficos, não há necessidade de modificar o código -fonte, que satisfaz o princípio de abertura e fechamento. Os métodos específicos são os seguintes:
(1) Adicione uma classe de gráfico abstrato AbstractChart e use várias classes de gráficos de concreto como suas subclasses;
(2) A classe ChartDisplay é programada para classes de gráficos abstratas, e o cliente decide qual gráfico específico a ser usado.
A estrutura após a reconstrução é mostrada na figura abaixo:
Na Figura 2, introduzimos a classe de gráfico abstrato AbstractChart, e o ChartDisplay é programado para a classe de gráfico abstrato, e o cliente define o objeto de gráfico específico instanciado através do método setChart (). No método Display () do ChartDisplay, o método Display () do objeto do gráfico é chamado para exibir o gráfico. Se você precisar adicionar um novo gráfico, como LineChart, você só precisará usar o LineChart como uma subclasse do AbstractChart e injetar um objeto Linechart no ChartDisplay no cliente, sem modificar o código -fonte da biblioteca de classes existente.
Nota: Como os arquivos de configuração em formatos como XML e propriedades são arquivos de texto sem formatação, eles podem ser editados diretamente através do editor VI ou no bloco sem compilação, no desenvolvimento de software, a modificação dos arquivos de configuração geralmente não é considerada uma modificação do código -fonte do sistema. Se um sistema envolver apenas modificar o arquivo de configuração quando for estendido, e o código Java original ou o código C# não fez nenhuma modificação, o sistema poderá ser considerado um sistema que cumpre o princípio de abertura e fechamento.