Wikipedia diz
"entidades de software (classes, módulos, funções, etc.) devem estar abertas para extensão, mas fechadas para modificação"
A palavra funções chamou minha atenção, e agora me pergunto se podemos assumir que criar uma sobrecarga para um método pode ser considerado como um exemplo do princípio Aberto / Fechado ou não?
Deixe-me explicar um exemplo. Considere que você possui um método em sua camada de serviço, usado em quase 1000 locais. O método obtém userId e determina se o usuário é administrador ou não:
bool IsAdmin(userId)
Agora considere que em algum lugar é necessário determinar se o usuário é administrador ou não, com base no nome de usuário, não userId. Se mudarmos a assinatura do método mencionado acima, quebramos o código em 1000 lugares (as funções devem ser fechadas para modificação). Assim, podemos criar uma sobrecarga para obter o nome de usuário, encontrar o userId com base no nome de usuário e no método original:
public bool IsAdmin(string username)
{
int userId = UserManager.GetUser(username).Id;
return IsAdmin(userId);
}
Dessa forma, estendemos nossa função criando uma sobrecarga para ela (as funções devem estar abertas para extensão).
É um exemplo de princípio aberto / fechado?
fonte
Ao sobrecarregar seu método, você está estendendo a funcionalidade do módulo existente, atendendo assim às novas necessidades do seu aplicativo
Você não está fazendo alterações em um método existente, portanto não está violando a segunda regra.
Gostaria de ouvir o que os outros têm a dizer sobre não permitir alterar o método original. Sim, você pode colocar modificadores de acesso apropriados e aplicar o encapsulamento, mas o que mais pode ser feito?
Ref: http://www.objectmentor.com/resources/articles/ocp.pdf
fonte
Princípio Aberto-Fechado é uma meta, um caso ideal, nem sempre uma realidade. Particularmente ao procurar refatorar códigos antigos, o primeiro passo é muitas vezes uma modificação pesada para tornar o OCP uma possibilidade. A raiz do princípio é que o código de trabalho já funciona e a alteração possivelmente introduz bugs. Portanto, o melhor cenário é não alterar o código existente, apenas adicionar um novo código.
Mas digamos que você tenha uma função chamada
BigContrivedMethod(int1, int2, string1)
.BigContrivedMethod
faz três coisas: coisa1, coisa2 e coisa3. Neste ponto, a reutilização do BCM provavelmente é difícil, porque faz muito. A refatoração (se possível) emContrivedFunction1(int)
,ContrivedFunction2(int)
eContrivedFunction3(string)
fornece três métodos menores e mais focados que você pode combinar mais facilmente.E essa é a chave do OCP em relação a métodos / funções: composição. Você "estende" funções chamando-as de outras funções.
Lembre-se de que o OCP faz parte de outros 5 princípios, as diretrizes do SOLID. Essa primeira é a chave, a responsabilidade única. Se tudo na sua base de código fizesse apenas a coisa específica a ser executada, você nunca precisaria modificar o código. Você só precisará adicionar um novo código ou combinar o código antigo de novas maneiras. Como o código real raramente atende a essa diretriz, você geralmente precisa modificá-lo para obter o SRP antes de obter o OCP.
fonte
Você está seguindo o princípio de aberto-fechado se estiver alterando o comportamento do seu programa escrevendo novo código em vez de alterar o código antigo.
Como é praticamente impossível escrever código aberto a todas as alterações possíveis (e você não deseja porque entra em paralisia na análise), escreve um código que responde a todos os diferentes comportamentos nos quais você está trabalhando atualmente por extensão, em vez de modificação.
Quando você encontra algo que precisa mudar, em vez de simplesmente alterar algo para permitir o novo comportamento, descobre qual é o ponto da mudança, reestrutura o programa sem alterar o comportamento, para que possa mudar esse comportamento escrevendo novo código .
Então, como isso se aplica ao seu caso:
Se você estiver adicionando novas funções à sua classe, ela não será aberta / fechada, mas os clientes da função que você está sobrecarregando.
Se você está simplesmente adicionando novas funções que funcionam em sua classe, então ele e os clientes da sua função estão abertos / fechados.
fonte