Ao criar uma biblioteca, devo garantir que os métodos privados funcionem conforme o esperado quando chamados não por outros métodos da mesma classe, mas por outra biblioteca através da reflexão ?
Por exemplo, se um método privado private DoSomething(int number)
espera que:
number
é um número inteiro positivo diferente de zero e:- uma variável privada
string abc
não é nula e não é uma cadeia vazia,
e completamente, feio falha se estas duas condições não são correspondidos, devo lidar com essas falhas, mesmo que eu sei que todos os métodos na classe irá always¹ atribuir um valor não-vazio para abc
antes de chamar DoSomething
, e passar por um diferente de zero inteiro positivo a este método?
Em outras palavras, o código que não está protegido contra chamadas não seguras por meio da reflexão pode ser considerado como código de baixa qualidade ou pertence ao chamador que usa a reflexão para garantir que a chamada não interrompa nada?
Nota: minha pergunta cobre apenas um conjunto padrão de bibliotecas. Isso não cobre o código que deve ser altamente seguro (ou seja, quando alguém pode estar interessado usando a reflexão para fazê-la se comportar inesperadamente ou travar).
¹ Como a classe está documentada corretamente, porque há testes de unidade suficientes para garantir que qualquer outro desenvolvedor não quebre esse método, etc.
fonte
Respostas:
Ao marcar seu método como privado, você estabeleceu suas intenções e um contrato. Ao usar a reflexão, um código do cliente pode optar por romper com este contrato e, consequentemente, terá que suportar as consequências. O mesmo acontece com os protocolos, para que as coisas funcionem regras devem ser seguidas ou coisas ruins acontecerão.
O mesmo problema pode ocorrer com outras linguagens, como C ++, nas quais vi coisas como
Em resumo - você NÃO é obrigado a lidar com essas situações, o chamador deve saber melhor.
fonte
Se alguém estiver usando a reflexão para chamar seus métodos particulares, é um sinal de que alguém está fazendo algo errado. Ou ele está usando o código de maneiras para as quais não foi projetado, ou você está ocultando muito do trabalho interno e diminuindo a API.
Mas parece que você ainda não está nesse estágio e está apenas tentando ser preventivo. Então, minha opinião é: não se preocupe. Um método privado deve ser considerado fora dos limites; se alguém violar deliberadamente esses limites, é problema deles se as coisas explodirem.
fonte
Bem, é sempre uma boa ideia validar variáveis não locais antes de usá-las, mas, além disso, eu não me preocuparia. Como os outros disseram, você estabeleceu suas intenções tornando o método privado em primeiro lugar; qualquer pessoa que ligue de fora da sua classe não tem garantias. Ao trabalhar em Java, nem coloco comentários javadoc nos meus métodos particulares, porque não quero que outros desenvolvedores saibam que eles estão lá.
fonte