Por que o mundo .Net parece adotar cordas mágicas em vez de alternativas de tipo estático?

47

Então, eu trabalho no .Net. Eu faço projetos de código aberto em .Net. Um dos meus maiores problemas não é necessariamente o .Net, mas a comunidade e as estruturas em torno dele. Parece que em todos os lugares que esquemas e seqüências de nomes mágicos são tratados como a melhor maneira de fazer tudo. Declaração em negrito, mas veja:

MVC do ASP.Net:

Olá rota mundial:

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

O que isso significa é que o ASP.Net MVC irá, de alguma forma, procurar HomeControllerno seu código. De alguma forma, crie uma nova instância e, em seguida, chame a função Index aparentemente com um idparâmetro de algum tipo. E depois há outras coisas como:

RenderView("Categories", categories);
...or..
ViewData["Foobar"]="meh";

E também existem coisas semelhantes com o XAML. DataContexté tratado como um objeto e você tem que esperar e orar para que ele resolva o tipo que você deseja. As DependencyProperties devem usar seqüências de caracteres mágicas e convenções de nomenclatura mágica. E coisas assim:

  MyData myDataObject = new MyData(DateTime.Now);      
  Binding myBinding = new Binding("MyDataProperty");
  myBinding.Source = myDataObject;

Embora confie mais no elenco e em vários suportes mágicos de tempo de execução.

Enfim, digo tudo isso para terminar aqui: por que isso é tão bem tolerado no mundo .Net? Não estamos usando linguagens de tipo estaticamente para quase sempre saber qual é o tipo de coisa? Por que a reflexão e o tipo / método / propriedade / quaisquer nomes (como seqüências de caracteres) preferem tanto em comparação a genéricos e delegados ou até mesmo a geração de código?

Há motivos de herança que estou faltando, por que a sintaxe de roteamento do ASP.Net depende quase exclusivamente da reflexão para realmente resolver como lidar com uma rota? Eu odeio quando mudo o nome de um método ou propriedade e de repente as coisas quebram, mas não parece haver nenhuma referência a esse método ou propriedade e, é claro, não há erros de compilação. Por que a aparente conveniência das cordas mágicas foi considerada "vale a pena"?

Eu sei que também existem alternativas tipicamente tipadas para algumas coisas, mas elas geralmente ficam no banco de trás e parecem nunca estar em tutoriais ou outro material para iniciantes.

Earlz
fonte
14
O dinamismo sem sentido tem sido a fúria desde que nossas CPUs foram rápidas o suficiente para executá-lo.
23413 DeadMG
7
Como assim? Eu não vi nenhum exemplo com o LINQ.
DeadMG
6
Meu humilde palpite é que a alternativa digitada estaticamente corretamente é muito inconveniente. Esse é um tema que aparece muito na maioria dos sistemas de tipos: "Gostaríamos de fazer isso no sistema de tipos, mas não é expressivo o suficiente". (Ou o inverso: "Expressamos isso com êxito no sistema de tipos, mas tornou as coisas três vezes mais complexas.") @ GlenH7 Não estou muito familiarizado com todo o LINQ, mas os bits que usei não exibem qualquer coisa perto do que este post descreve. Gostaria de dar um exemplo?
2
@Earlz Mais importante, objetos anônimos são digitados estaticamente. Não há cordas mágicas, o compilador sabe o nome e o tipo de tudo envolvido. Salve para qualquer outro uso de var.
1
@Earlz isso é interessante, embora se possa argumentar que a sintaxe lambda é o inchaço adicional aqui. Meu palpite é que eles adotaram a abordagem de cordas / convenções mágicas porque é simples, "bom o suficiente" para muitos, e eles sempre podem adaptar as ferramentas para fornecer alguma orientação / segurança. É uma troca entre segurança e conveniência, IMHO. O uso de um ViewBag dinâmico também sugere essa mentalidade (não que eu concorde totalmente com ela).
Daniel B

Respostas:

31

Na verdade, há um empurrão no mundo .NET contra essas mesmas coisas que você mencionou. No primeiro exemplo que você deu, no entanto, o mecanismo de roteamento recebe uma convenção para mapear a rota padrão. O fato de as rotas serem dinâmicas torna quase impossível o uso de uma configuração estática.

Você também mencionou o XAML / WPF, ambos em desenvolvimento bem antes da introdução dos genéricos no .NET e voltar ao suporte aos genéricos atrasaria ainda mais um produto já muito tardio (Longhorn / Vista).

Existem exemplos na estrutura do ASP.NET MVC de usar expressões lambda no lugar de seqüências de caracteres mágicas e o Entity Framework / LINQ leva ainda mais longe onde a linguagem e a estrutura fornecem suporte nativo para compor consultas SQL em um gráfico de objeto estático (em vez de construir seqüências mágicas de SQL, você obtém a validação em tempo de compilação de suas consultas).

Para outros exemplos de configuração estática, consulte o mapa de estrutura e outros contêineres modernos de injeção de dependência e outras estruturas que precisam inspecionar o gráfico de objetos em tempo de execução, mas permitem que o desenvolvedor forneça sugestões estaticamente usando expressões lambda.

Portanto, a resposta curta é que, historicamente, o .NET não suportava a travessia estática de um gráfico de objetos até a versão 3.5. Agora que o temos, muitos desenvolvedores preferem isso a seqüências de caracteres mágicas e muitos têm buscado um suporte ainda mais profundo, como um operador symbolOf que funciona de maneira semelhante ao operador typeOf.

Michael Brown
fonte
3
XAML é detalhado como é ... adicionar suporte a genéricos tornaria ainda mais (sim, eu sei que o XAML inteiro não é feito para humanos Argumento). Além disso, vejo o XAML como mais semelhante ao HTML do que uma linguagem de programação real. Ele não deve se preocupar com o tipo de objetos que está exibindo, apenas como exibi-lo.
Michael Brown
2
Os genéricos chegaram na versão 2.0, mas não recebemos Expressões até 3.5 (com LINQ). Expressões são o poder que o LINQ e a comunidade pegaram nesse poder e executaram com ele. A técnica é conhecida como reflexão estática
Michael Brown
1
Bom ponto sobre reflexão estática. Eu esqueci que isso foi introduzido no 3.5
Earlz
2
Esta é uma ótima resposta e eu definitivamente concordo com a resposta. Evito todas essas coisas, como a praga, porque se houver um erro de digitação ou erro, elas são capturadas apenas em tempo de execução, o que significa que elas podem ser facilmente esquecidas. Eles também tornam a refatoração extremamente diferente. Evite, evite, evite!
Rocklan
2
Concorde com a resposta. O T4MVC é um projeto que vem à mente e aspira a remover muitas seqüências de caracteres e substituí-las por códigos fortemente tipados.
Carson63000