Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Andre Luizao

Dúvida em quando usar throw ou retornar false

Recommended Posts

Ola pessoal, estou estudando OO a fundo e me deparei com essa dúvida, se algum desenvolvedor OO poder me ajudar agradeço.

então a dúvida é quando devo usar throw ou retornar um false, vejas os exemplos abaixo

 

Exemplo 01:

public function fazAlgumaCoisa() {
    // código aqui
    // verifica se é valido, caso não for dispara um exception
    throw new Excpetion('ocorreu um erro aqui');
}
OU

 

Exemplo 02:

public function fazAlgumaCoisa() {
    // código aqui
    // verifica se é valido, caso não for retorna false
    return false;
}
No exemplo 02 poderia retornar um false e depois disparar um exception

 

Obs.: estou publicando está dúvida pois vi alguns frameworks que eles fazem isso,

retorna false as vezes, então por isso que me veio essa dúvida

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resumidamente, é uma questão de coesão e coerência (sim, do português).

Métodos só devem retornar algo, quando é "pedido". Ou seja, se vocês perguntar ao método algo, ele deve retornar.

O que é perguntar?
Basicamente são os métodos com prefixo: is (é), has (tem), can (pode), get (pegar).

Em suma, os que será retornado também difere pela nomenclatura:

$class->isClass();//boolean
$class->hasProperties() //boolean
$class->canSave(); //boolean
$class->getSomething()//mixed|anything

Exceções:

fluente interface

Um exemplo é o método com prefixo add (adicionar), normalmente é utilizado em conjunto com fluente interface, ou seja, retornará o próprio objeto.

$list->add('string 1')
     ->add('string 2')
     ->add('string 3');

Alguns métodos de execução.

Como o PHP não utilizava lançamento de exception (agora no 7 usa por padrão), ele apenas retornava true ou false. Dessa forma, o método ficava responsável por retornar o resultado da execução.

 

Um exemplo prático é o método PDOStatement::execute(), que, dependendo da configuração, pode lançar uma exception ao invés de retornar false. Como pode ser visto no exemplo do link abaixo:

http://forum.imasters.com.br/topic/519213-transacoes-pdo-em-php/?p=2064505

 

Por outro lado, quando você "mandar" o método fazer algo, ele deve fazê-lo. Ele só não poderá realizar a sua função, quando ocorrer um erro.

 

Erro, do ponto de vista da engenharia de software, é algo que sai do percurso de execução do software (conhecido como caminho feliz). Essa saída de percurso é conhecido como exceção (pois pode ocorrer em determinados momentos atípicos).

Se ocorrer um desses momentos atípicos, deve retornar uma exceção.

try {
    $transaction->beginTrasaction():
   
    $transaction->execute();

    $transaction->commit():

    echo 'transação realizada com sucesso';
} catch (Exception $exception) {
    $transaction->rollBack():

    echo 'Erro: '.$exception->getMessage();
}

Depois, existem outros problemas, que é a questão de validar os retornos e o encadeamento de validações. O Null object, etc..

O livro Clean Code do Robert C. Martin trata muito bem dessa questão. É um capítulo inteiro somente sobre essa questão.

No exemplo 02 poderia retornar um false e depois disparar um exception

Não, é um ou outro. Os dois é impossível.

Obs.: estou publicando está dúvida pois vi alguns frameworks que eles fazem isso,
retorna false as vezes, então por isso que me veio essa dúvida

Essa é uma questão a parte. Pois os métodos do PHP por si só são controversos. Dessa forma, os frameworks são construídos tentando manter uma similaridade com a linguagem.

Já a mudança de métodos antigos para um padrão mais aceitável é sempre muito difícil por causa da compatibilidade e a rigidez em não querer se alterar algo.
Sobre isso, você pode ver mais no tópico linkado abaixo (o que é comum de se ver em pessoa atípicas a mudanças):
http://forum.imasters.com.br/topic/550177-mudanca-para-mysqli/

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.