Se o estado do objeto é inválido, devo lançar uma exceção ou retornar nulo ?  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
Thiago Senna
GUJ Master
[Avatar]

Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline

Olá Guj's!

Tenho uma pequena dúvida. Tenho uma classe Aluno que calcula a idade do mesmo dependendo de sua data de nascimento. Como o nascimento não é um campo obrigatório, não sei se é mais elegante retornar nulo ou lançar uma exceção caso o atributo nascimento esteja nulo. Segue abaixo um exemplo do código:



IMHO acho essa situação delicada. Na view por exemplo, se lançar uma exceção ia aparecer um stack trace na cara do usuário, mas se retornar nulo, a minha camada de negócio teria que ficar checando se o valor retornado pelo método getIdade é igual a nulo.

O que vocês tem feito nessas situações?


Abraços
Thiago
[Email]
maquiavelbona
JWizard
[Avatar]

Membro desde: 29/06/2006 09:06:51
Mensagens: 2447
Localização: São Paulo - SP
Offline

Bom dia!

Primeiramente, quando uma exceção é lançada, não há a necessidade explícita de mostrar o que aparece para o usuário.

Não sei se te ajuda, mas vai um exemplo abaixo do que pode-se fazer:

Se conseguir processar, devolve idade com o valor correto, senão lança null. Sobre a classe de negócios ter que ficar verificando toda hora o se é nulo, não tem muito o que se fazer, a não ser que você devolva outro tipo de dado(tipo String) e inicialize com um valor que não vá afetar outras partes do programa(no caso "").

Deu para ajudar?
Até!

----------------------------------------------------------------
"Within a few years a simple and inexpensive device, readily carried about, will enable one to receive on land or sea the principal news, to hear a speech, a lecture, a song or play of a musical instrument, conveyed from any other region of the globe. "
Nikola Tesla - A means for furthering Peace (1905)

"Gedanken ohne Inhalt sind leer, Anschauungen ohne Begriffe sind blind."
Immanuel Kant - Kritik der reinen Vernunft (1781)
luis.soares
JavaEvangelist
[Avatar]

Membro desde: 01/08/2006 09:48:47
Mensagens: 310
Localização: São Paulo
Offline

Olá !

Considere que se não há uma entrada válida para o sistema, isto deve ser tratado. Retornar null, neste caso pode não ocasionar maiores problemas além da classe de negócio ter que controlar isso. Mas de maneira geral, o ideal é tratar como exceção. Não que esta tenha que ser exibida ao usuário, mas deve ser tratada. Em muitas situações, um retorno nulo acarreta problemas na aplicação no fluxo do processo.

Abraço.

Luis Soares
Analista Desenvolvedor Java
luishsoares@gmail.com
[Email]
Thiago Senna
GUJ Master
[Avatar]

Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline

humm, não era bem essa a minha dúvida.. vou tentar exemplificar melhor..

1º - Lançando uma exceção:


1º - Retornando nulo


Eu não sou muito fã de 'silenciar' a exceção utilizando o try catch. IMHO, deve definir um padrão onde, ou lanço a exceção ou retorno nulo se nascimento estiver nulo.
[Email]
Thiago Senna
GUJ Master
[Avatar]

Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline

luis.soares wrote:Olá !

Mas de maneira geral, o ideal é tratar como exceção. Não que esta tenha que ser exibida ao usuário, mas deve ser tratada. Em muitas situações, um retorno nulo acarreta problemas na aplicação no fluxo do processo.

Abraço.


Blz, também concordo que retornar nulo acarreta em problemas.

O principal fator de eu me questionar se deveria retornar nulo é por causa da view que chama o método getIdade. Exemplo:



Se eu retornar nulo, o trecho de código acima se mantém inalterado, mas se lançar uma exceção ficaria assim:



Essa complexidade adicionada a view vale a pena?
[Email]
pcalcado
Moderador
[Avatar]

Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline

Simples:

Todo aluno deve sempre ter uma idade? isto é uma invariante?

- Se sim, quando não existir lance uma exceção (IllegalStateException é a clássica)
- Se não, retorne null

Mais sobre isso em:

http://fragmental.com.br/wiki/index.php?title=Contratos_Nulos

Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
[Email] [WWW] [Yahoo!] [MSN]
Thiago Senna
GUJ Master
[Avatar]

Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline

no meu caso, nascimento não é uma invariante. Thanks, acho que minha questão foi esclarecida.
[Email]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team