Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

MVC: Posso usar o controller dentro do modelo?

Durante os exercícios, gosto de fazê-los sozinho antes de ver o gabarito. Assim, no meu código surgiu essa dúvida acima, rs.

obterNegociacoesMyWay(controller){
        // Resolve todas essas promises em uma ordem dentro de uma lista array
        return Promise.all([
                this.obterNegociacoesDaSemana(),
                this.obterNegociacoesDaSemanaAnterior(),
                this.obterNegociacoesDaSemanaRetrasada()
            ])
                .then(negociacoes => {
                    negociacoes
                        .reduce((arrayAchatado, array) => {
                                // eu vou dizer: "arrayAchatado, concatena aí com esse array."
                                return arrayAchatado.concat(array);
                            }, [])
                        .forEach(negociacao => controller._listaNegociacoes.adiciona(negociacao));
                     controller._mensagem.texto = "Negociações importadas com sucesso. :D";
                })
                .catch(erro => this._mensagem.texto = erro); 

    }

Então no controller bastaria passar o this:

let service = new NegociacaoService();
        service.obterNegociacoesMyWay(this);
6 respostas
solução!

Bom dia!

O que você acabou de fazer é justamente a antítese do modelo MVC! Esse modelo existe para que você possa separa o modelo da view e realizar a ligação entre ambos através de um controller.

Seu serviço esta amarrado a um controller específico, por mais que você tenha passado-o como parâmetro para seu serviço.

Veja a linha:

controller._listaNegociacoes.adiciona(negociacao));

Se você mudar de controller para poder usar seu serviço ele não funcionará, pois ele deve ter um listaNegociacoes.

Além disso, se você não quiser usar o miniframework que você criou e quiser usar seu serviço com React ou outro framework, não conseguirá porque ficou totalmente dependente de um controller.

A ideia do Modelo e as classes de serviço serem independentes de um controller ou view é a possibilidade de você o reutilizar em outros sistemas. Porém, no seu exemplo, você nem conseguirá reutilizar a classe de Serviço dentro do mesmo sistema, por exemplo, em outro controller, porque se amarrou a um controller desde o início. Uma alteração se propagará em cascata e é justamente isso que queremos evitar.

Todavia, só pelo fato de você ter tentado resolver o problema sozinho já vale muito, porque sem isso, essa discussão não existiria.

Sucesso e bom estudo meu aluno!

Alef, tudo bem?

Programaticamente, seu código está bom!

Agora numa questão de manutenabilidade e padrões, o ideal é a separação entre o modelo e o controller. O modelo MVC prega fortemente a separação desses métodos por ser mais fácil de dar manutenção e encontrar erros quando eles estão separados.

Isso não quer dizer que você não pode fazer desse jeito, ok?

Padrões existem como modelos de negócio pra facilitar a nossa vida.

A dica é: se você quer seguir o padrão e manter a facilidade de manutenção do seu site, o certo e separar eles em arquivos diferentes Se você acredita que pode usar um modelo mais MC-V, não tem problema, pode ir com fé :)

Só lembra que também é bom você sempre usar controller junto com modelo em todos os arquivos se for executar assim

Espero ter te ajudado :D

O Model é a parte mais reutilizável do seu código, se você fizer ela depender da View ou Controller, você perde a chance de utilizá-lo em um framework JS como Angular ou React.

Pense nisso como se você precisasse migrar o sistema para um framework.

Ual! Imaginava mesmo que o professor ia me dar uns cascudos! hahaha

Bom, apesar de ter feito a primeira versão do código desse jeito, preferi seguir a versão do professor pelo fato de usar o padrão MVC da melhor forma. A ideia de reutilização é o principal objetivo de trabalhar com a orientação a objetos. Além de que deixa o código mais elegante.

Entretando, como o Allan Pinheiro disse, existe exceções. Dependendo da regra de negócio e, do tempo para desenvolvimento, o cliente aperta os desenvolvedores para entregar uma versão mais simplificada.

Em fim, sou a favor de pensar na lógica apenas uma vez. Com esses treinamentos vou dominar esses conceitos! :)

Muito Obrigado Pessoal!

"Ual! Imaginava mesmo que o professor ia me dar uns cascudos! hahaha"

KKK! Boa! "Cascudo do bem" seria se você tivesse misturado tudo em um lugar só e isso você não fez :)

Sucesso e bom estudo! Ainda tem mais coisa pela frente! Continue na trilha do cangaceiro!

Estamos só começando...

Em rumo a formação em Angular 2 /o/

O mais interessante é que toda vez que estou produzindo um código, eu lembro da sua linha de pensamento e me pergunto: "Como o Flávio resolveria?". ^-^

Agora eu passo algumas horas a mais no loop daquela questão épica: "Está funcionando, mas será que podemos melhorar?". Muito bom!!!

Ah, é super legal a interatividade aqui!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software