Essa pergunta sobre quando usar o privado e quando usar o protegido nas aulas me fez pensar. (Vou estender essa pergunta também para as classes e métodos finais, pois estão relacionados. Estou programando em Java, mas acho que isso é relevante para todas as linguagens OOP)
Uma boa regra geral é: torne tudo o mais privado possível.
- Torne todas as aulas finais, a menos que você precise subclassificá-las imediatamente.
- Torne todos os métodos finais, a menos que você precise subclassificar e substituí-los imediatamente.
- Torne todos os parâmetros do método final, a menos que você precise alterá-los no corpo do método, o que é meio estranho na maioria das vezes.
Isso é bem direto e claro, mas e se eu estiver escrevendo principalmente bibliotecas (código-fonte aberto no GitHub) em vez de aplicativos?
Eu poderia citar muitas bibliotecas e situações em que
- Uma biblioteca foi estendida de uma maneira que os desenvolvedores nunca pensariam em
- Isso tinha que ser feito com a "magia do carregador de classes" e outros hacks devido a restrições de visibilidade
- As bibliotecas foram usadas de uma maneira para a qual não foram criadas e a maneira necessária de funcionalidade "invadida" em
- As bibliotecas não puderam ser usadas devido a um pequeno problema (erro, falta de funcionalidade, comportamento "errado") que não pôde ser alterado devido à visibilidade reduzida
- Um problema que não pôde ser corrigido levou a soluções alternativas enormes, feias e com erros, em que substituir uma função simples (privada ou final) poderia ter ajudado
Na verdade, comecei a nomear esses nomes até que a pergunta ficasse muito longa e resolvi removê-los.
Eu gosto da ideia de não ter mais código do que o necessário, mais visibilidade do que o necessário, mais abstração do que o necessário. E isso pode funcionar ao escrever um aplicativo para o usuário final, onde o código é usado apenas por quem o escreve. Mas como isso acontece se o código for usado por outros desenvolvedores, onde é improvável que o desenvolvedor original tenha pensado em todos os casos de uso possíveis com antecedência e que mudanças / refatores sejam difíceis / impossíveis de realizar?
Como as grandes bibliotecas de código aberto não são novidade, qual é a maneira mais comum de lidar com a visibilidade nesses projetos com linguagens orientadas a objetos?