Caros colegas estou com dúvida e gostaria da experiência para me auxiliar.
Supondo que estamos desenvolvendo uma aplicação desktop utilizando o padrão MVC. Ao capturar os dados na camada view qual a abordagem geralmente utilizada para trasnferí-los para a camada controller?
Me refiro a uma tela que possui aproximadamente uns 40 campos, por exemplo.
A solução com HashMap é uma boa? Digo é profissional em termos tantos de implementação quanto de manutenção?
Por exemplo:
//criando um hashmap na camada view para receber os dados
HashMap<String,Object> dados = new HashMap<>();
dados.put("nome", "marcos");
dados.put("cpf", "123.456.789-00");
dados.put("valorPedido", 1200.00);
A partir daí chamar o método da respectiva classe da camada controller passando esse hashmap para ela.
Agora na camada controller, ficaria assim:
public static boolean salvar(HashMap<String,Object> dados){
Cliente cliente = new Cliente();
cliente.setNome( (String) dados.get("nome"));
cliente.setCpf( (String) dados.get("cpf"));
cliente.setValorPedido( (double) dados.get("valorPedido"));
//continuação do método
}
Essa pode ser considerada como uma boa solução?
E porque não criar as entidade já na View e enviá-las preenchidas para o controller ?
Senão estou enganado sua sugestão foge ao padrão MVC, e mesmo que fizer isso o problema contínua, pois veja só e na hora de recuperar um registro para edição? De novo temos vários campos para serem transferidos do controller para a view.
Seu objetivo é diminuir o acoplamento?
Sim, também. E consequentemente ficará um código mais fácil de dar manutenção e permite um entendimento mais fácil sobre o funcionamento da classe/método já que outros desenvolvedores terão acesso.
Na verdade o MVC é a separação do controle, view e modelo, e não está relacionado a comunicação ou iteração entre eles, a classe Cliente é dado (informação) assim como o HashMap, usar um ou o outro seria quase a mesma coisa.
O problema é q a maioria usa uma forma ruim de fazer isso.
Um exemplo bom sem passar o Cliente como parametro:
class ControleCadastro implements Controle {
FormCadastro form;
void salvar() {
Cliente = new Cliente();
cliente.setNome(form.getNomeCliente());
/* ... */
}
}
interface FormCadastro {
void setNomeCliente(String nome);
String getNomeCliente();
/* ... */
}
class ViewCadastro extends JFrame implements FormCadastro {
void setControleCadastro(ControleCadastro controle);
void salvar() {
controle.salvar();
}
}
Existem outras formas boas de se fazer isso, mas essa é a q prefiro.
Usar o HashMap não é bom pois fica dificil fazer manutenção, usar uma interface como FormCadastro facilita na visualização do que a view pode ou não fazer e facilita a manutenção pois qualquer alteração dará erro antes de compilar e não em execução como usando o HasMap