Permita-me começar dizendo que estou falando principalmente sobre o acesso ao método aqui e, em menor grau, marcando as classes como finais, e não como membro.
A velha sabedoria
"marque-o como privado, a menos que você tenha um bom motivo para não"
fazia sentido nos dias em que foi escrito, antes que o código aberto dominasse o espaço da biblioteca do desenvolvedor e o VCS / mgmt de dependência. tornou-se hiper colaborativo graças ao Github, Maven, etc. Naquela época, também havia dinheiro a ser ganho, restringindo a (s) maneira (s) em que uma biblioteca poderia ser utilizada. Passei provavelmente os primeiros 8 ou 9 anos da minha carreira aderindo estritamente a essa "melhor prática".
Hoje, acredito que seja um mau conselho. Às vezes, existe um argumento razoável para marcar um método como privado ou como final de aula, mas é extremamente raro e, mesmo assim, provavelmente não está melhorando nada.
Você já:
- Ficou desapontado, surpreso ou magoado por uma biblioteca, etc. que tinha um bug que poderia ter sido corrigido com herança e poucas linhas de código, mas devido a métodos / classes particulares / finais, foram forçados a esperar por um patch oficial que talvez nunca viesse? Eu tenho.
- Queria usar uma biblioteca para um caso de uso ligeiramente diferente do que foi imaginado pelos autores, mas não conseguiu fazê-lo devido a métodos e classes particulares / finais? Eu tenho.
- Ficou decepcionado, surpreso ou magoado com uma biblioteca etc. que era excessivamente permissiva em sua extensibilidade? Eu não tenho.
Estas são as três maiores racionalizações que ouvi sobre como marcar métodos privados por padrão:
Racionalização nº 1: não é seguro e não há motivo para substituir um método específico
Não posso contar o número de vezes que me enganei sobre a necessidade ou não de substituir um método específico que escrevi. Tendo trabalhado em várias bibliotecas populares de código aberto, aprendi da maneira mais difícil o verdadeiro custo de marcar as coisas como privadas. Geralmente, elimina a única solução prática para problemas imprevistos ou casos de uso. Por outro lado, nunca em mais de 16 anos de desenvolvimento profissional me arrependi de marcar um método protegido em vez de privado por motivos relacionados à segurança da API. Quando um desenvolvedor decide estender uma classe e substituir um método, conscientemente está dizendo "eu sei o que estou fazendo". e por uma questão de produtividade que deve ser suficiente. período. Se for perigoso, observe nos Javadocs de classe / método, não basta fechar a porta às cegas.
Os métodos de marcação protegidos por padrão são uma atenuação para um dos principais problemas no desenvolvimento moderno de SW: falta de imaginação.
Racionalização # 2: mantém a API / Javadocs públicos limpos
Essa é mais razoável e, dependendo do público-alvo, pode até ser a coisa certa a se fazer, mas vale a pena considerar qual é o custo de manter a API "limpa": extensibilidade. Pelas razões mencionadas acima, provavelmente faz mais sentido marcar itens protegidos por padrão por precaução.
Racionalização nº 3: meu software é comercial e preciso restringir seu uso.
Isso também é razoável, mas como consumidor, eu iria sempre com o concorrente menos restritivo (assumindo que não existem diferenças significativas de qualidade).
Nunca diga nunca
Não estou dizendo que nunca marque métodos como particulares. Estou dizendo que a melhor regra é "tornar os métodos protegidos, a menos que haja uma boa razão para não fazê-lo".
Este conselho é mais adequado para quem trabalha em bibliotecas ou projetos de maior escala que foram divididos em módulos. Para projetos menores ou mais monolíticos, isso não costuma importar muito, já que você controla todo o código e é fácil alterar o nível de acesso do seu código, se / quando você precisar. Mesmo assim, eu ainda daria o mesmo conselho :-)