As classes estáticas com métodos estáticos são consideradas SOLID?


27

O SOLID inclui o princípio de substituição de Liskov, que tem a noção de que "objetos em um programa devem ser substituíveis por instâncias de seus subtipos sem alterar a correção desse programa".

Como as classes estáticas com métodos estáticos (um pouco como a Mathclasse) não possuem instâncias, meu sistema é considerado SOLID se eu tiver classes estáticas com métodos estáticos?


Eu acho essa pergunta ótima. Vamos ver o que a comunidade tem a oferecer.
Saeed Neamati 15/08/11

1
Uma classe de matemática não inclui estado. Então você nunca está realmente passando objetos desse tipo. Portanto, não tenho certeza de como isso é relevante.
Martin York

Eu não acho que as classes estáticas realmente possam ser consideradas como SOLID puro (muitas das mesmas razões já mencionadas), no entanto, eu as consideraria uma grande defensora e ferramenta para o princípio DRY.
dreza

2
Como assim? Pela minha experiência, o uso excessivo de classes estáticas resulta principalmente em pessoas se repetindo o tempo todo com metade do código manipulando permanentemente um objeto deus estático global.
Aug2

1
Acho que estou pensando mais em termos de classes de utilitário para fornecer código comum. Eu concordo que eles são facilmente e muitas vezes são mal-utilizados, mas ainda acho que o pode fornecer meios útil para grupo de códigos em conjunto comum onde o estado não é um problema
dreza

Respostas:


27

O LSP se aplica à passagem de uma instância de uma classe para um método, fazendo com que o método faça algumas coisas com essa instância e geralmente produza algum tipo de resultado. Isso não importa para classes estáticas, pois em C # você não pode criar uma instância de uma classe estática.

Ainda mais importante, as classes estáticas são seladas e, portanto, não podem ser herdadas. Isso torna sua pergunta discutível no que diz respeito ao C #.

Você poderia dizer que as classes estáticas são sempre compatíveis com LSP, pois você nunca pode produzir uma subclasse que viole esse princípio. Você também pode dizer que as classes estáticas nunca são compatíveis com LSP pelo mesmo motivo.


Em Java, as classes estáticas são um pouco diferentes. Você não pode marcar uma classe de nível superior como "estática"; portanto, se você quiser criar uma classe de utilitário semelhante às classes estáticas do C #, precisará declará-la como finale ocultar seu construtor. Depois de fazer isso, no entanto, eles se comportam de maneira semelhante ao C # - você não pode instanciar ou subclassificar. Você pode declarar uma classe interna como static, mas isso não significa o mesmo que em C #: simplesmente denota uma classe de nível superior aninhada .

O VB.NET se comporta exatamente da mesma maneira que o C #, neste caso, até onde eu sei.


Você não mencionou se está interessado nos outros princípios, mas vou incluí-los de qualquer maneira para garantir a integridade.

S princípio da responsabilidade ingle : uma classe estática facilmente seguir esse princípio.
O princípio caneta / fechado : como as classes estáticas são seladas, elas nunca podem seguir esse princípio.
L iskov princípio de substituição : como acima.
I princípio nterface segregação : não se aplica a uma única classe, mas dividindo uma classe estática grande em partes menores, mais especializado poderia ser um passo na direção seguindo este princípio.
D princípio ependency inversão : classes estáticas não podem implementar interfaces, portanto, qualquer classe de usá-lo dependerá sempre o que quer implementação existe no momento. As classes estáticas, portanto, violam esse princípio.

Como as classes estáticas não atendem a todos os 5 critérios, elas não são SOLID.


como ser sólido significa que temos de atender a todos os cinco critérios, isso não significa que eles não sejam sólidos?
Pacerier 15/08/11

1
@Pacerier Sim, mas não se deve tentar colocar uma classe no SOLID o tempo todo, se não for necessário; depende do contexto da classe. Se é uma classe de utilitário ou algo assim, está tudo bem IMO para não ser "sólida", mas se é uma classe real de domínio que tem o uso de domínio específico ...
Wayne Molina

4

Eu não classificaria uma classe como orientada a objetos e, portanto, diria que ela não pode (e não deve tentar) atender aos princípios do design orientado a objetos.

Essas classes são apenas uma solução alternativa para a incapacidade de fornecer código fora de uma classe em linguagens como Java e C #. Se possível, devem ser definidos como funções independentes, pois não obtêm nenhum benefício com a orientação a objetos.


Eu discordaria em colocar funções independentes fora da classe. A simples capacidade de agrupar funções relacionadas (estáticas ou não) sob um nome comum é útil para facilitar a leitura. As funções matemáticas se encaixam perfeitamente.
jojo

2
@jojo Concordou. Os idiomas que suportam funções definidas fora das classes também suportam o agrupamento lógico dessas funções, por exemplo, namespaces em C ++.
Gyan aka Gary Buyn

2

Vale ressaltar, como você não especificou nenhuma linguagem, que em C ++ é possível passar classes em torno das quais apenas membros estáticos e acessá-los via modelo e, portanto, é possível substituir uma classe com apenas membros estáticos e, sem dúvida, os métodos chamado formulário é "interface".


vb.net / c # / java
Pacerier
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.