Validação de padrão de objeto nulo e entrada - copie a implementação real ou aceite tudo silenciosamente?


8

Eu tenho um WifiComponentno meu Cameraaplicativo no meu cliente. É responsável por lidar com a funcionalidade relacionada à Wifi da câmera. A câmera representa uma câmera do mundo real.

Isso WifiComponentpode ser ativado (nesse caso, eu posso fazer coisas com ele, como verificar o status e a verificação da conexão) ou desativado (nesse caso, você não pode fazer nada com isso, além de perguntar se está ativado).

Ao criar um Camerano meu aplicativo cliente , pergunto à câmera se ela WifiComponentestá ativada. Então eu construo a subclasse apropriada de WifiComponent, ou WifiComponentImplou NullWifiComponent.

A implementação dos métodos supportedWifiTypes()e wifiScan()é fácil. O NullWifiComponentnão suporta nenhum tipo, é feito instantaneamente com a verificação e não encontra resultados.

Mas agora eu tenho que implementar um bool connect(WifiNetwork network, String password)método. Quero dizer que não consegui conectar ... Mas eu nem apoio o WifiEncryptionTypefornecido no WifiNetwork! A implementação real lança um IllegalArgumentExceptionse você passar uma WifiEncryptionTyperede wifi não suportada .

Eu ...

  • Jogue IllegalArgumentException, porque eu não apoio o WifiEncryptionTypesolicitado?
  • Falha silenciosamente ao conectar ( return false), não importa o que for fornecido?

Pergunta generalizada:

Se a implementação real cumprir um contrato, e parte deste contrato for lançar exceções para determinadas entradas, uma implementação nula deve priorizar sua neutralidade ou o contrato?


De um ponto de vista estritamente lógico, você poderia dizer que, como não possui câmera, sua câmera não rejeita a câmera e não a WifiEncriptionTypelança IllegalArgumentException. Portanto, acho que não jogá-lo seria uma quebra de contrato.
— precisa

Eu tenho uma câmera, ela simplesmente não suporta Wifi por meio da minha API, porque ela não está implementada na câmera na API do dispositivo ou porque a câmera realmente não possui um adaptador Wifi. Eu entendi o seu ponto.
— Pimgd

Nunca quebre o contrato de uma turma. Sua capacidade de raciocinar sobre o que um programa faz depende de cada componente fazer o que ele diz que faz. Às vezes, você precisa alterar o contrato ou o design geral para fazer o que deseja, mas nunca quebra o contrato.
— Doval

1
Mas por que você não pode apenas cumprir o contrato para cobrir a situação do wifi desativado? Basta lançar alguma WifiDisabledException (por exemplo, estendendo IllegalStateException) nesse caso. Isso permitirá que o código do cliente reconheça essa situação e responda a ela corretamente (por exemplo, com indicação adequada).
— Lorus

@lorus eu não tinha pensado nisso.
— Pimgd

Respostas:


4

Como a implementação nula deve substituir a implementação totalmente funcional, a implementação nula deve aderir totalmente à interface implementada.

Se a WifiComponentinterface especificar que connect()lança uma exceção se for invocada com uma incompatível WifiEncryptionType, é exatamente isso que sua implementação nula deve fazer, especialmente se o aplicativo precisar usar a mesma WifiComponentinterface para saber quais WifiEncryptionTypesão suportados.

Se a lista de WifiEncryptionTypes suportados não vier de sua implementação nula, sua implementação nula somente lançará uma exceção se uma implementação funcional também for necessária para lançá-la.

Se a WifiComponentinterface não especificar que uma exceção deve ser lançada, é melhor assumir que o valor seria aceitável para uma implementação funcional e relatar uma falha de conexão genérica ( return false).


Estou autorizado a modificar a interface do WifiComponent, mas estou procurando um equilíbrio entre não ser difícil de trabalhar e fornecer erros no momento em que você faz algo que só pode dar errado. Eu acho que lançar a exceção seria o caminho a seguir, pois é um erro do desenvolvedor passar em um tipo de criptografia não suportada , e o uso do padrão de objeto nulo é simplificar o tratamento nulo, não simplificando o uso do contrato.
— Pimgd

@ pimgd Eu concordo com você aqui. É claramente um erro de lógica do programa se for especificado um tipo de criptografia que não veio da lista de tipos suportados, portanto, lançar a exceção é definitivamente a melhor opção.
— Jules

@Pimgd: Se o WifiComponent ainda não estiver definido, recomendo que você primeiro defina um contrato sensato para ele e depois crie sua implementação nula com a funcionalidade mínima absoluta absoluta que não viola o contrato que você estabeleceu.
— Bart van Ingen Schenau
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.