Transferência de dados entre as camadas da aplicação

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