Eu sei que é caro, mas (IMO) acredito que é uma prática muito boa. Estou falando de regras como, digamos, você não pode salvar uma fatura se você não for um vendedor ... então, nesse caso, lançará uma exceção dizendo 'você não está autorizado' ou algo assim ...
Outra abordagem seria ter objetos com status ou algo assim
Existe alguma outra abordagem? Como você se sente com isso?
JamesPoulsonException
como uma subclasse deRuntimeException
e, em seguida, fornecer a exceção original como ocause
. Você pode simplesmente dizerif (exception instanceof JamesPoulsonException)...
para diferenciar. Use ogetCause()
método para alcançar a exceção original.No exemplo que você nos deu, acho que levantar uma exceção é uma má ideia. Se você sabe que o usuário não está autorizado antes de começar a trabalhar e você ainda permite que ele execute alguma função e depois bate com uma mensagem APÓS que eles já concluíram a tarefa, isso é apenas um projeto ruim.
Usar exceções para aplicar regras de negócios não é um bom design.
fonte
Não vejo qual o valor que gera uma exceção na criação de uma boa lógica de negócios. Existem dezenas de abordagens para lidar com a lógica de negócios que não envolvem o uso de um sistema destinado a tratar condições inesperadas na operação de um sistema.
Espera- se que, na lógica de negócios, as condições não sejam atendidas; esse é o motivo de tê-lo em primeiro lugar, e você não deseja usar o mesmo mecanismo que lida com falhas inesperadas de E / S, erros de falta de memória e referências nulas. Essas são falhas do sistema, mas detectar condições comerciais não atendidas é uma operação bem-sucedida do sistema.
Além disso, é um sistema que está maduro para conseqüências não intencionais. Como uma exceção precisa ser capturada em algum momento, você corre o risco de que uma nova exceção de regra de negócios seja capturada em algum lugar que não seja intencional ou você pode ter o código que procura regras de negócios que capturam exceções que não são realmente destinadas por isso. Sim, essas condições podem ser explicadas com boas práticas de codificação, mas em qualquer sistema não trivial no qual mais de um desenvolvedor esteja trabalhando, erros ocorrerão e você só precisa esperar que eles não sejam erros dispendiosos.
fonte
expressar regras de negócios é uma coisa, implementá-las é outra
pense na experiência do usuário; se o usuário não é um vendedor, por isso dar-lhes um botão que diz 'criar factura' em tudo ?
fonte
Isso depende inteiramente do que está sendo feito.
Primeiro, qual é o comportamento real que você deseja? Se alguém está inserindo suas próprias informações, uma rejeição e uma caixa de diálogo dizendo, essencialmente, "Você não pode fazer isso" provavelmente estão corretas. Se esta é uma pessoa de entrada de dados, trabalhando a partir de uma pilha de formulários, provavelmente uma caixa de diálogo também é boa e a pessoa de entrada de dados pode colocar os formulários inválidos em uma pilha especial. Se você estiver processando em lote, não deseja interromper as coisas, mas sinalize-as e vá para a próxima.
Depois de ter o comportamento, você precisa decidir como implementá-lo. Ter um verificador de regras de negócios que lança uma exceção é provavelmente uma boa ideia. Retornar um código de retorno e transmiti-lo é outra coisa que pode dar errado, e você certamente não deseja que as entradas erradas fiquem mais longe.
Não se preocupe com as despesas de desempenho. No caso de um indivíduo digitar dados, é trivial comparado aos outros momentos envolvidos. Normalmente, o humano leva mais tempo nesse sistema. No caso de um trabalho em lotes, se as exceções são um problema de desempenho, você está inserindo muitos registros incorretos e, na realidade, manipular e reinserir todos eles será mais um problema do que as exceções.
fonte
Ter uma API de exceção robusta e bem projetada que seja consistente é muito apropriado. Usar isso para impor regras de negócios também pode ser apropriado. De fato, na minha experiência, quanto mais complicada a regra de negócios, maior a probabilidade de ser tratada dessa maneira. Geralmente, é tão fácil, se não mais fácil, escrever um sistema em que são esperadas exceções do que escrever uma lógica de ramificação autorizada.
Isso significa que regras simples que podem ser descritas em uma única frase geralmente devem ser implementadas de maneira preventiva ou autoritária, dependendo de qual seja. No entanto, se você tiver uma regra que seja multidimensional e exija mais de três ou quatro fatores (especialmente se a seleção desses fatores for baseada em um ou mais dos outros fatores), a codificação de exceção poderá ser mais sustentável. Freqüentemente, nesses casos, o caminho lógico terá muitas exceções precursoras que precisam ser lançadas (verifica o motivo pelo qual a ação não pode ser executada); então (ou vice-versa) há uma falha na segurança (para verificar se a ação está autorizada). ), às vezes haverá alguma lógica de acumulação autorizada que precisa ser verificada (disponibilidade de descendente / ancestral, precursor declara que os objetos devem ser colocados etc.)
Um benefício que deriva desse tipo de lançamento de exceção é que ele permite separar e reutilizar as exceções precursoras em várias áreas do seu projeto. (Essa é a essência da programação orientada a aspectos.) Ao fazer isso, você está encapsulando um aspecto específico das regras gerais de negócios em um componente independente e sustentável. Em geral, esses componentes corresponderão 1-1 às mensagens de erro lançadas. (Embora às vezes você tenha um componente que lança várias exceções diferentes, quase nunca deve ter a mesma exceção lançada de vários componentes.)
Na minha opinião, é mais difícil projetar sistemas baseados em exceções e o tempo de desenvolvimento inicial é mais longo, pois é necessário criar o processo de exceção em todos os N níveis. No entanto, esses sistemas geralmente acabam sendo muito mais estáveis. Embora nunca seja possível projetar um sistema que 'não falhe', o benefício do design baseado em exceções é que você está sempre antecipando falhas. Para a maioria das pessoas, o processo pode ser contra-intuitivo. É como pedir orientações e pedir que alguém lhe diga todas as ruas que você não deve ligar.
fonte