[color=red]Boa noite Bruno,[/color] tudo beleza por aí?
MUITÍSSIMO OBRIGADO por continuar colaborando com o tópico!
[quote=Bruno Laturner][quote=pedromuyala]
Pronto, então a pergunta de hoje: (1) Como a mensagem da exceção que ocorrer no modelo deverá ser mostrada ao usuário na visão?
Ou seja, como o JLabel lblCad de ClienteView vai receber a mensagem [color=blue]“O nome não pode ser nulo.”[/color] caso ela seja lançada no Cliente?
Ou como o mesmo JLabel vai receber a mensagem [color=blue]“CPF inválido.”[/color] caso ela seja lançada na classe CPF?
Lembrando que ambas são [color=red]IllegalArgumentException[/color] e quando ocorrem são mostradas no console![/quote]
Mude os tipos das exceções para alguma do domínio da tua aplicação, ou dê um catch nesse IllegalArgumentException, ou mesmo em Exception. Esses dois últimos não recomentdo.[/quote]
:arrow: Portanto, vamos ao código-exemplo, na maneira que entendi:
[color=red]OBS IMPORTANTE:[/color] Como ainda não quero entrar na persistencia dos dados, não estou aplicando até este momento nenhuma chamada as classes de persistencia no código-exemplo, limitando o entendimento somente entre a comunicação M-V-C com Exception’s, ok?
MODELO: abstract Documento
public abstract class Documento {}
MODELO: CPF
public class CPF extends Documento {
String numero;
public CPF(String numero)
{
if(!Util.validaCPF(numero))
throw new CPFException();
this.numero = numero;
}
}
MODELO: Cliente
public class Cliente {
private String nome;
private Documento cpf;
public Cliente() {
}
public Cliente(Documento cpf, String nome)
{
this.setCPF(cpf);
this.setNome(nome);
}
Documento getCPF() {
return this.cpf;
}
void setCPF(Documento cpf) {
this.cpf = cpf;
}
String getNome() {
return this.nome;
}
void setNome(String nome) {
if (nome == null)
throw new ClienteException("O nome não pode ser nulo.");
nome = nome.trim();
if (nome.isEmpty())
throw new ClienteException("O nome não pode estar em branco.");
this.nome = nome;
}
}
CONTROLE:
public class ClienteControl {
private Cliente cli = null;
ClienteControl(Cliente cli) {
this.cli = cli;
}
public void cadastrar(String nome, String cpf) throws CadastrarClienteException {
try {
CPF doc = new CPF(cpf);
this.cli = new Cliente(doc, nome);
}
catch(CPFException e) {
throw new CadastrarClienteException(e.getMessage());
}
catch(ClienteException e) {
throw new CadastrarClienteException(e.getMessage());
}
}
}
VISÃO:
public class View extends JPanel {
private ClienteControl controller = null;
private JButton btnExecute;
private JTextField nome;
private JTextField cpf;
private JLabel lblCad;
public View(ClienteControl controller) {
this.controller = controller;
this.initialize();
}
private void initialize() {
nome = new JTextField(10);
add(nome);
cpf = new JTextField(10);
add(cpf);
btnExecute = new JButton("Cadastrar");
btnExecute.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
View.this.cadastrar();
}
});
add(btnExecute);
lblCad = new JLabel();
add(lblCad);
}
private void cadastrar() {
try {
this.controller.cadastrar(nome.getText(), cpf.getText());
lblCad.setText("Cadastro realizado com sucesso");
}
catch (CadastrarClienteException e) {
lblCad.setText(e.getMessage());
}
}
}
ClienteJaCadastradoException é uma CadastroDeClienteException. Este, por sua vez, pode ser o que você quiser, desde ele seja algo que faça parte da hierarquia de Exception (Throwable para falar a verdade).
[/quote]
Exceções: CPFException
public class CPFException extends RuntimeException{
public CPFException() {
super("CPF Inválido");
}
}
Exceções: ClienteException
public class ClienteException extends RuntimeException {
public ClienteException(String msg) {
super(msg);
}
}
Exceções: CadastrarClienteException
public class CadastrarClienteException extends RuntimeException {
public CadastrarClienteException(String msg) {
super(msg);
}
}
:arrow: OQ EU FIZ: Tentei seguir o conselho de usar RuntimeException no lugar de Exception e de separar “fronteiras entre nações” ([color=blue]Ver linhas vermelhas na imagem em anexo[/color])
Dessa forma, ClienteException trabalha para a classe Cliente e CPFException trabalha para a classe CPF. No controle, como é ele quem transfere os dados da visão para o modelo (cadastra os dados informados nos campos da visão para o BEAN Cliente no modelo) então é encapsulada as mensagens das exceções que aparecerem entre o try{}…catch(){} como CadastrarClienteException. A visão, por sua vez, faz a leitura final de CadastrarClienteException mostrando as mensagens ao usuário, caso elas ocorram.
Agora a pergunta é, com toda humildade do mundo: Estou causando confusão na cabeça dos programadores ou realmente dessa vez ficou certo? Estou fazendo má prática em algum lugar? :shock:
Volto a pedir a todos muita calma e paciência comigo. É uma coisa que estou fazendo todo esforço possível para conseguir entender e não sair por aí vida afora desenvolvendo aqueles famosos códigos que nem o cara que desenvolveu vai entender!
Como já havia dito em postagens anteriores eu quero mesmo aprender e não me aproveitar da boa vontade das pessoas que estão ajudando fazendo essas como “empregados”. Pode ter certeza que a sua ajuda aqui será importante não só para mim mas para muitas pessoas que sofrem em entender o padrão MVC. 
[size=15]
Obrigado a todos que estão lendo ou tentando ajudar no tópico! Não deixem de opinar, criticar, sugerir… é muito importante sua participação!
Um abração especial aí para o pessoal do GUJ, para os usuários fantomas, Bruno Laturner, André e todos aqueles que postaram também no início do tópico!
[/size]
