Se o MVC é "Separação de preocupações", por que o Razor Syntax foi introduzido?

22

Minha pergunta está relacionada ao padrão de design do MVC e à Razor Syntax, apresentada pela Microsoft.

Enquanto aprendia o padrão de design do MVC, foi-me dito que a idéia se baseia em um princípio conhecido como Separação de Preocupações .

Mas a Razor Syntax nos permite usar o C # diretamente no Views .

Não é esse cruzamento de preocupações?

John Strowsky
fonte
7
Vale ressaltar que o ASP.NET MVC na verdade não implementa o padrão de design do MVC. O MVC determina que o modelo seja observado pela exibição de alterações, o que claramente não é o caso no ASP.NET MVC.
Benjamin Gruenbaum
11
Também pode ajudar se você mudar a maneira como pensa sobre o Views. As visualizações não são um código do lado do cliente. São modelos do lado do servidor que, quando processados, geram html do lado do cliente. E como código do lado do servidor, é perfeitamente aceitável que exista código C # lá.
Eric King
6
@EricKing, exceto na parte em que os sistemas de modelagem que permitem código arbitrário sempre levam, via caminho de menor resistência, a um design ruim, violação de camadas horrível e impossibilidade de manutenção. Infelizmente, parece ser uma lição que toda comunidade precisa aprender sozinha.
hobbs
12
@ Hobbs Uau, ok. Não na minha experiência. Certamente nem sempre, e (é claro) há alguma responsabilidade profissional exigida por parte do programador. Eu não culpo a ferramenta.
Eric King
7
@BenjaminGruenbaum Hoje em dia, não é diferente de todos os quadros "MVC" na maneira como gerenciam interdependências? Até o ponto em que não é mais produtivo falar sobre o único e verdadeiro estilo MVC, mas onde seria mais pragmático usar o termo para qualquer sistema que divida razoavelmente a responsabilidade em Modelos , Vistas e Controladores, porém estes são interdependentes?
30414 Alex

Respostas:

66

Você está confundindo a sintaxe do Razor com a separação de preocupações.

A separação de preocupações tem a ver com a estrutura do seu código.

Ser capaz de usar C # em modos de exibição não impede isso. Não tem nada a ver com a separação de preocupações enquanto tais.

Claro, você pode estruturar o código em sua exibição para não obedecer à separação de preocupações, mas e o código C # usado apenas para fins de exibição? Onde isso iria morar?

Oded
fonte
1
Mas c # é a linguagem do lado do servidor?
John Strowsky
6
@John - então? Se você precisar formatar datas para exibição (e exibição significa sempre do lado do cliente), onde você as formataria? O modelo? O controlador? Nem. Você faria isso na exibição.
Oded
16
@ John - então, sua data é armazenada no banco de dados, você a passa pelo modelo / controlador para sua visualização. Você precisa estar lá no HTML, para que você possa, de alguma forma, gerar JS para formatar, em vez de formatar diretamente com C #? Por quê? Por que isso é melhor? Ou melhor, como essa abordagem é mais uma separação de preocupações?
Oded
25
@ NPSF3000 - um idioma não é "servidor" ou "cliente". Essa é uma separação arquitetural - e possivelmente uma das implementações de linguagem (o JavaScript é um servidor ou um idioma do cliente - lembre-se do node.js).
Oded
14
@FreeAsInBeer - esse é o tipo de lógica que pertence ao cliente - alguém na França gostaria de ver datas (e moeda / números) formatados de forma diferente para alguém nos EUA. O cliente "saberia" melhor como eles devem ser exibidos. Essa é a lógica da apresentação e, como tal, pertence à exibição.
Oded
35

Em vez de responder diretamente à pergunta, minha resposta questiona a suposição feita na pergunta. Ou seja, a suposição de que o Razor foi criado para o MVC está incorreta. Eu trabalho na Microsoft na equipe do ASP.NET e tenho conhecimento em primeira mão disso.

O Razor não começou como um mecanismo de exibição para o MVC. Foi criado para páginas da Web do ASP.NET , que provavelmente é o mais longe possível do lado do espectro, com as preocupações menos separadas. Foi criado como uma alternativa moderna ao ASP.NET Web Forms / ASP clássico e, é claro, a muitas outras estruturas de programação de servidores semelhantes. A idéia do Razor era criar transições quase perfeitas entre HTML (marcação) e C # (código).

Somente mais tarde a equipe (que me incluí) decidiu que a sintaxe do Razor faria muito sentido em prol de um mecanismo de exibição para MVC, que estava sendo escrito pela mesma equipe.

Quanto ao Razor ativar, dificultar, melhorar ou alterar o conceito de separação de preocupações no ASP.NET MVC, a resposta de Oded é imediata.

Eilon
fonte
2
Yay, voto negativo sem um comentário. Alterei minha resposta para deixar claro que estou questionando a suposição feita na pergunta original. A meu ver, a pergunta não é diretamente respondível porque tem uma premissa inválida.
Eilon
Por curiosidade, outros mecanismos de modelagem foram considerados para o ASP MVC?
NWard
2
@NWard Havia vários mecanismos de exibição de terceiros para o ASP.NET MVC na época, mas não os consideramos com muita força. Achamos que o Razor era mais fácil de entender (o HTML é HTML, o C # é C #) e também ganhamos melhor com o projeto ASP.NET Web Pages.
Eilon
1
@ Alex oh eu certamente não posso ter crédito por todo o Razor, mas agradeço o seu comentário!
Eilon
1
@ateri Depois de um tempo, é o grande número no canto superior esquerdo da resposta.
Mark Hurd
9

Você está confundindo "separação de tecnologias" com "separação de preocupações". A idéia básica por trás da parte "View" do MVC é que o código na "View" não está executando nenhum acesso a dados ou lógica pesada diretamente, mas é deixado para as partes "Model" e "Controller", respectivamente. O "Controlador" transforma os dados, executa qualquer lógica necessária e os encaminha para a "Visualização" correta. A exibição também pode fazer transformações de dados, mas eu tendem a mantê-las puramente cosméticas, como a transformação de data mencionada acima.

whoisthemachine
fonte
isso não parece oferecer nada substancial sobre os pontos apresentados e explicados em respostas anteriores, particularmente este
gnat
4
+1 Formulado de forma concisa e clara e com um foco de explicação diferente das respostas anteriores.
31414 Alex
@gnat Eu só queria deixar claro onde estava sua confusão e depois explicar rapidamente como o princípio da separação de preocupações se aplica ao padrão de design do MVC. Talvez eu devesse ter passado mais tempo com o que significa "separação de preocupações"?
Whoisthemachine
0

Eu posso pensar em um Don't do itexemplo perfeito .

Vamos dizer que temos um ProductController:

public class ProductController()
{
    public ViewResult Discontinued()
    {
        var db = new ProductsDb();
        var products = db.Products.Where(x => x.Discontinued).ToList();
        return new ViewResult(products);
    }
}

Com o barbeador, temos uma alternativa

public class ProductController()
{
    public ViewResult Discontinued()
    {
        var db = new ProductsDb();
        var products = db.Products.ToList();
        return new ViewResult(products);
    }
}

e em nossa opinião:

@model IEnumerable<Product> 

@foreach (var item in Model.Where(x => x.Discontinued)) {
    ....
}

Eu acho que é bastante óbvio que a segunda solução parece tão errada. Se você fizer algo assim, não culpe a navalha - culpe a si mesmo.

E não se esqueça: a capacidade de usar o C # nas visualizações não é um recurso básico, mas também era possível com as visualizações do ASP.NET. Com o barbeador, é um pouco mais simples.

Se você estiver procurando por um mecanismo de modelo com mais trilhos, consulte o nancy.fx com o mecanismo de visualização Super simples.

Jürgen Steinblock
fonte