2008-10-28 15 views
6

Après avoir lu plusieurs des réponses à this thread, je vois que beaucoup de ceux qui ne l'aiment pas citent le potentiel d'abus du nouveau mot-clé. Ma question est, quel genre d'abus? Comment pourrait-on en abuser si fort que les gens ne l'aiment pas avec véhémence? Est-ce juste du purisme? Ou y a-t-il un vrai piège que je ne vois pas?C# 4 mot-clé dynamique - pourquoi pas?

Répondre

16

Certains le voient comme un outil qui sera abusé. Comme "Option Strict Off" et "On Error Resume Next" dans VB que les langages "purs" comme C# et Java n'ont jamais eu.

Beaucoup ont dit la même chose sur le « var » mot-clé, mais je ne vois pas l'objet d'abus, une fois qu'il est devenu entendu que ce n'était pas la même chose que « variante » de VB

Il pourrait être abusé des endroits où les développeurs paresseux ne veulent pas vérifier les types sur les classes et essayent juste d'attraper des appels dynamiques au lieu d'écrire "si blah est Blah ...".

Je pense personnellement qu'il pourrait être utilisé correctement dans des situations comme this question récente à laquelle j'ai répondu.

Je pense que ceux qui comprennent vraiment son pouvoir sont ceux lourdement dans les langages dynamiques .NET.

+3

var est abusé d'une manière différente - il réduit la lisibilité, pas la sécurité. – TraumaPony

+1

Je suis d'accord. Je ne voulais pas dire autrement. – TheSoftwareJedi

+0

Je l'ai vu abusé. Il réduit définitivement la lisibilité, bien que Jon Skeet ait dit dans un podcast .NET Rocks qu'il augmente la lisibilité .. ce dont je ne suis pas sûr comment c'est possible ... – BobbyShaftoe

6

Le véritable piège? Manque grave de documentation. L'architecture de l'application entière existe dans l'esprit de la personne (ou des personnes) qui l'a écrite. Au moins avec le typage fort, vous pouvez aller voir ce que fait l'objet via sa définition de classe. Avec le typage dynamique, vous devez inférer le sens de son utilisation, au mieux. Au pire, vous n'avez AUCUN IDÉE quel est l'objet. C'est comme programmer tout en JavaScript. ACK!

+2

Pour être honnête, c'était déjà un peu possible: les programmes C# lourds en interface peuvent faire de la détermination de la mise en œuvre effective d'un appel donné un exercice frustrant, lourd de suppositions et de recherches en texte intégral. – Shog9

+1

Oui, mais l'interface fournit QUELQUE contexte de l'opération. L'objet dynamique fournit aucun contexte. Qu'y a-t-il à l'autre bout du q dynamique? Qui sait? –

7

dynamique est mauvais parce que le code comme tout cela va apparaître sur la place:

public dynamic Foo(dynamic other) { 
    dynamic clone = other.Clone(); 
    clone.AssignData(this.Data); 
    return clone ; 
} 

au lieu de:

public T Foo<T>(T other) where T: ICloneable, IAssignData{ 
    T clone = (T)other.Clone(); 
    clone.AssignData(this.Data); 
    return clone; 
} 

Le premier, n'a pas d'info de type statique, pas de temps de compilation vérification, ce n'est pas auto-documenté, aucune inférence de type, les gens seront obligés d'utiliser une référence dynamique sur le site d'appel pour stocker le résultat, ce qui conduit à plus de perte de type, et toutes ces spirales vers le bas. Je commence déjà à craindre dynamique.

Modifier: Le danger est passé (! Ouf) ... et dynamique n'a pas été abusé après tout, pas besoin de voter contre moi après 3 ans :)

+2

Selon vous, qu'est-ce qui pourrait inciter les gens à écrire du code dynamique inutilement? Qu'est-ce qui pourrait les décourager? –

2

Quand les gens se rendent compte qu'ils don ne pas obtenir bon IntelliSense avec dynamic, ils vont revenir d'dynamic -happy à dynamic -le cas échéant-et-var -at-all-other-times. Les objectifs de dynamic incluent: l'interopérabilité avec les langages dynamiques et les plates-formes telles que COM/C++ et DLR/IronPython/IronRuby; ainsi que transformer C# lui-même en IronSmalltalkWithBraces avec tout ce qui implémente IDynamicObject.

De bons moments seront passés par tous. (Sauf si vous avez besoin de maintenir le code que quelqu'un d'autre a écrit.

+0

J'ai fait un projet en actionscript, qui est à la fois dynamique et statique, et je dirais que les hybrides dynamiques/statiques ne fonctionnent pas bien. – FlySwat

+1

Toutes les personnes généralisent à partir d'un seul exemple. Ou, au moins, je le fais. :) –

+0

J'ai fait un projet dans QBASIC, et ça n'aurait pas dû être un langage non plus. Mais les points sur ActionScript et QBASIC n'ont vraiment aucune pertinence pour C#. C# restera, au cœur, orienté objet orienté statiquement, avec d'autres ensembles de fonctionnalités très utiles. – yfeldblum

17

Je pense que beaucoup de répulsion que les gens expriment à cette fonctionnalité se résume à "c'est une mauvaise fonctionnalité de langue, car il permettra aux mauvais développeurs d'écrire du mauvais code." Si vous pensez à ce sujet, par cette logique toutes les fonctionnalités sont mauvaises.

Lorsque je cours dans un bloc de code VB qu'un certain génie a préfixé avec On Error Resume Next, ce n'est pas VB que je maudis. Peut-être que je devrais, je suppose. Mais selon mon expérience, une personne qui est déterminée à mettre un sou dans la boîte à fusibles trouvera un moyen. Même si vous videz ses poches, il façonnera ses propres sous. Moi, je suis impatient de trouver un moyen plus utile d'interopérer entre C# et Python. J'écris de plus en plus de code qui fait ça. Le mot-clé dynamic ne peut pas venir assez tôt pour ce cas d'utilisation particulier, car la façon actuelle de le faire me donne l'impression d'être un universitaire soviétique dans les années 1950 qui se rend en Occident pour une conférence: il y a énormément de règles et de la paperasse avant de partir, je suis sûr que quelqu'un va me surveiller tout le temps que je suis là, et la plupart de ce que je ramasserai pendant que je serai là me sera enlevé à la frontière quand je reviendrai .

+0

Analogique intéressante –

-2

Je ne vois pas une raison pour laquelle la façon actuelle d'invoquer des méthodes est dynamicly imparfait:

Il prend trois lignes de le faire, ou vous pouvez ajouter une méthode d'extension sur System.Object de le faire pour vous :

class Program 
{ 
    static void Main(string[] args) 
    { 
     var foo = new Foo();    
     Console.WriteLine(foo.Invoke("Hello","Jonathan")); 
    }   
} 

static class DynamicDispatchHelper 
{ 
    static public object Invoke(this object ot, string methodName, params object[] args) 
    { 
     var t = ot.GetType(); 
     var m = t.GetMethod(methodName); 
     return m.Invoke(ot, args); 
    } 
} 

class Foo 
{ 
    public string Hello(string name) 
    { 
     return ("Hello World, " + name); 
    } 
} 
+2

Que faire si "Bonjour" est surchargé? Que faire si quelqu'un passe un int pendant un long moment? Qu'en est-il des performances? Lorsque vous descendez assez loin sur cette route, vous avez réécrit une bonne partie du DLR et vous n'avez pas encore manipulé Python ou COM interop. –

+0

... pour ne pas mentionner la syntaxe C# naturelle pour les opérateurs d'indexation ou d'infixe –

+0

Cela ne prend en charge que la liaison tardive basée sur Reflection. Cela ne fonctionne pas pour la liaison tardive basée sur IDynamicObject. Il ne fonctionne pas non plus pour les objets JSON ou XML. –

1

Ceci est un peu comme discuter des caméras publiques, bien sûr qu'ils peuvent et sera utilisé à mauvais escient, mais il y a des avantages pour les avoir aussi bien.

Il n'y a aucune raison pour laquelle vous ne pourriez pas interdire le mot-clé "dynamic" dans votre propre code de codage si vous n'en avez pas besoin. Donc quel est le problème? Je veux dire, si vous voulez faire des choses folles avec le mot-clé "dynamique" et prétendre que C# est le cousin mutant de JavaScript, soyez mon invité. Gardez ces expériences hors de mon code. ;)

-1

FUD. C'est peut-être la meilleure chose depuis le pain tranché, mais toute l'expérience que j'ai eu avec VB, JavaScript, etc., m'apporte le frisson de savoir que C# aura une liaison dynamique. Je sais que je serai en mesure de l'examiner rationnellement dans un proche avenir et de voir à quel point cette nouvelle fonctionnalité sera utile pour permettre l'interopérabilité avec les langages dynamiques. Mais cela prendra du temps. Je suis humain, d'accord? :-)