Je regarde le MvcContrib Je suis fasciné, et en même temps dégoûté, par une astuce syntaxique utilisée dans le composant de la grille. Syntaxe de la grille :
.Attributes(style => "width:100%")
La syntaxe ci-dessus donne à l'attribut style du HTML généré la valeur suivante width:100%
. Si vous faites attention, le "style" n'est spécifié nulle part. Il est déduit du nom du paramètre dans l'expression ! J'ai dû creuser cette question et j'ai trouvé où la "magie" se produit :
Hash(params Func<object, TValue>[] hash)
{
foreach (var func in hash)
{
Add(func.Method.GetParameters()[0].Name, func(null));
}
}
Donc, en effet, le code utilise le nom formel, au moment de la compilation, des paramètres pour créer le dictionnaire des paires nom-valeur des attributs. La construction syntaxique qui en résulte est en effet très expressive, mais en même temps très dangereuse.
L'utilisation générale des expressions lambda permet de remplacer l'expression noms utilisé sans effet secondaire. Je vois un exemple dans un livre qui dit collection.ForEach(book => Fire.Burn(book))
Je sais que je peux écrire dans mon code collection.ForEach(log => Fire.Burn(log))
et cela signifie la même chose . Mais avec la syntaxe de la grille MvcContrib, tout d'un coup, je trouve du code qui regarde activement et prend des décisions basées sur les noms que je choisis pour mes variables !
S'agit-il d'une pratique courante au sein de la communauté C# 3.5/4.0 et des amateurs d'expressions lambda ? Ou s'agit-il d'un cas isolé dont je ne devrais pas m'inquiéter ?
10 votes
+1 pour avoir apporté le hashrocket à C#
2 votes
Changer foreach (var func in hash) en : Array.ForEarch(hash, func => Add(func.Method.GetParameters()[0].Name, func(null))) ;
34 votes
Je dirais que cela semble évident, tant que l'on est prêt à regarder l'intention du code, plutôt que de simplement analyser la syntaxe. Ce qui, si vous lisez du bon code, est ce que vous devriez faire de toute façon. La syntaxe n'est qu'un véhicule pour l'intention, et je dirais que c'est l'intention qui révèle le code.
4 votes
Étaient-ils d'anciens utilisateurs de Perl ? Là,
style => "width:100%"
est équivalent à"style", "width:100%"
dans tous les domaines.3 votes
@Eric C'est forcément mauvais quand un membre de l'équipe du compilateur fait un commentaire comme ça. Peut-être demander à Anders ce qu'il en pense ?
3 votes
J'attends stackoverflow.com/users/8560 pour intervenir et défendre son code...
0 votes
C'est juste demander des problèmes et des conséquences involontaires.
192 votes
Je viens de demander à Anders (et au reste de l'équipe de conception) ce qu'ils en pensent. Disons simplement que les résultats ne seraient pas imprimables dans un journal destiné aux familles.
4 votes
Eric Lippert : Il y a des journaux baudruches, grivois, racoleurs, bleus, colorés, vils et non familiaux ? Où puis-je les trouver ? En outre, pourriez-vous élaborer sur les détails de l'horreur ? J'aimerais vraiment savoir pourquoi vous pensez que c'est si mauvais...
14 votes
Bien sûr. Celui de Seattle est "The Stranger". Quant à savoir pourquoi c'est horrible, nous pourrions commencer par le non évident, l'intelligent (rappelez-vous, l'intelligent est mauvais Un code intelligent est difficile à maintenir), pas du tout dans les cas d'utilisation envisagés par les concepteurs des lambdas, lent, fragile, non portable et inutile.
22 votes
Le C# ne dispose pas actuellement d'une syntaxe propre et légère pour les maps, en particulier les maps passées dans les fonctions. Divers langages dynamiques (Ruby, Python, JavaScript, ColdFusion 9) disposent d'une syntaxe propre et légère pour cela, dans une certaine mesure.
1 votes
@Eric Merci de demander. J'ai fait valoir ci-dessous que cette syntaxe est agréable à regarder, mais je peux comprendre votre argument contre elle. Ce sont toutes des raisons valables de ne pas faire quelque chose.
28 votes
Oh, je pense que ça a l'air délicieux. En ce qui concerne la syntaxe des cartes, oui, ce serait génial si nous pouvions faire de nouvelles { {"Do", "A deer" } , {"Re", "soleil doré"} ... } et faire en sorte que le compilateur déduise la construction d'une map, tout comme new[] {1, 2, 3 } déduit la construction d'un tableau d'int. Nous envisageons ce genre de choses.
2 votes
Qu'est-ce qu'une carte syntaxique, au fait ?
15 votes
Un "map" est ce que la bibliothèque .NET appelle un "dictionnaire", c'est-à-dire un dispositif qui permet de "mapper" une clé (il peut s'agir d'une clé, d'une paire de clés, etc.) sur une valeur. Un grand nombre de concepts de programmation ne sont en fait qu'une façon fantaisiste de faire un mappage. Par exemple, vous pouvez considérer que someObject.SomeProperty est un mappage de la paire (valeur de someObject, nom de SomeProperty) vers la valeur de la propriété. Parce que cette idée est si fondamentale, il est agréable qu'un langage de programmation fournisse une syntaxe simple pour décrire une carte arbitraire. Les initialisateurs de collections sont un bon début.
6 votes
Vient d'être blogué par K. Scott Allen - "Votre abomination est mon astuce". odetocode.com/Blogs/scott/archive/2009/11/30/
1 votes
Je suppose donc que c'est ce qui se passe lorsque quelqu'un veut utiliser Rails mais connaît le C# ? Tout ce que vous pouvez faire dans Rails n'a pas besoin d'être porté vers d'autres langages et frameworks.
8 votes
J'ai essayé de répondre à certaines des questions soulevées ici sur mon blog : jeremyskinner.co.uk/2009/12/02/lambda-abuse-the-mvccontrib-hash
1 votes
Les lambdas vont devenir les expressions régulières de .NET. haussement d'épaules
19 votes
Eric Lippert, je vous respecte beaucoup, mais je pense que vous et le groupe (y compris Anders, pour qui j'ai un énorme respect) êtes trop sévères. Comme vous l'admettez, le C# manque d'une syntaxe précise pour les cartes, et d'autres langages (comme Ruby) en ont d'excellentes. Ce type a trouvé un moyen d'obtenir la syntaxe qu'il voulait. Je vous accorde qu'il y a des façons similaires de l'exprimer qui sont presque aussi expressif que sa syntaxe avec moins d'inconvénients. Mais sa syntaxe et le fait qu'il ait travaillé si dur pour l'obtenir montrent clairement la nécessité d'une amélioration du langage. Les performances passées indiquent que vous allez créer quelque chose de grand pour ce langage.
6 votes
Je me demande ce qui se passe lorsque l'on optimise un peu trop ce processus ou, pire encore, lorsqu'on l'obscurcit.
2 votes
Je n'embaucherais pas quelqu'un qui fait cela ou qui ne comprend pas immédiatement pourquoi il ne faut pas le faire.
9 votes
J'adore C#, mais ce n'est pas le langage le plus expressif qui soit. Il y a beaucoup de concepts de métaprogrammation que C# ne peut pas exprimer - pourtant, nous rencontrons des problèmes dont les solutions nécessitent ou pourraient grandement bénéficier de ces concepts. Le CLR cache toutes sortes d'abus magiques des niveaux inférieurs, et certaines personnes s'en plaignent également. Mais regardez ce qu'il nous permet de faire ! Même chose avec cette astuce lambda. Il s'agit d'une solution complète à une expression C# autrement laide, elle semble bien documentée et son usage/son objectif est évident visuellement, et elle nous aide à créer rapidement des sites web sympas.
1 votes
Le type anonyme en IDictionary<string,object> serait un meilleur choix IMHO. Et il est utilisé dans beaucoup d'endroits dans asp.net MVC. Un type map avec une syntaxe init simple serait très bien (syntaxe similaire à celle des types anonymes ?) edit : je n'ai pas vu la réponse de Marc Gravell...
1 votes
Qui est le contributeur et la contributrice ici ? :)
0 votes
Ceci est disqualifié par le seul fait, qu'un nom d'attribut html valide n'est pas nécessairement un nom d'identifiant c# valide, pensez aux mots-clés réservés.