2008-10-28 25 views
6

Dopo aver letto molte delle risposte a this thread, vedo che molti di coloro che non amano citano il potenziale di abuso della nuova parola chiave. La mia domanda è, che tipo di abuso? Come potrebbe essere abusato così male da rendere la gente antipatia per ciò? Si tratta solo di purismo? O c'è una vera trappola che non vedo?C# 4 parola chiave dinamica - perché no?

risposta

16

Alcuni lo vedono come uno strumento che verrà abusato. Come "Option Strict Off" e "On Error Resume Next" in VB che lingue "pure" come C# e Java non hanno mai avuto.

Molti hanno detto la stessa cosa la parola chiave "var", ma io non lo vedo abusi, una volta che è diventato capito che non era lo stesso di "variante" di VB

Potrebbe essere abusata in posti che gli sviluppatori pigri non vogliono il controllo dei tipi sulle classi e solo provare a prendere chiamate dinamiche invece di scrivere "se blah è Blah ...".

Personalmente ritengo che potrebbe essere utilizzato correttamente in situazioni come la domanda recente this che ho risposto.

Penso che quelli che capiscono veramente il suo potere sono quelli pesantemente nei linguaggi .NET dinamici.

+3

var abusi in modo diverso - riduce la leggibilità, non sicurezza. – TraumaPony

+1

Sono d'accordo. Non intendevo implicare il contrario. – TheSoftwareJedi

+0

Ho visto che viene abusato. E 'sicuramente non riduce la leggibilità, anche se Jon Skeet ha detto in un NET Rocks podcast che aumenta la leggibilità .. che io non sono sicuro di come ciò sia possibile ... – BobbyShaftoe

6

Il vero trabocchetto? Grave mancanza di documentazione. L'architettura dell'intera applicazione esiste nella mente della persona (o delle persone) che l'ha scritta. Almeno con la tipizzazione forte, puoi andare a vedere cosa fa l'oggetto tramite la sua definizione di classe. Con la digitazione dinamica, nel migliore dei casi devi dedurne il significato dal suo utilizzo. Nel peggiore dei casi, non hai IDEA di quale sia l'oggetto. È come programmare tutto in JavaScript. ACK!

+2

Per essere onesti, questo era già in qualche modo possibile: i programmi C# interfaccia-pesanti possono rendere determinante l'effettiva implementazione di una determinata chiamata un esercizio di frustrazione, carico di ipotesi e ricerche full-text. – Shog9

+1

Sì, ma l'interfaccia fornisce un contesto SOME dell'operazione. L'oggetto dinamico non fornisce alcun contesto. Cosa c'è dall'altra parte della dinamica q? Chissà? –

7

dinamica è male perché il codice come questo apparirà in tutto il luogo:

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

invece di:

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

Il primo, non ha informazioni di tipo statico, non c'è tempo di compilazione controllando, non è auto-documentante, nessun tipo di inferenza, quindi le persone saranno costrette a usare un riferimento dinamico nel sito di chiamata per memorizzare il risultato, portando a una maggiore perdita di tipo, e tutte queste spirali verso il basso.

Sto già iniziando a temere dinamico.

Edit: il pericolo è passato (! Uff) ... e dinamico non era stato abusato, dopo tutto, non c'è bisogno di me votare dopo 3 anni :)

+2

Cosa pensi potrebbe incoraggiare le persone a scrivere codice dinamico senza necessità? Cosa potrebbe scoraggiarli? –

2

Quando le persone si rendono conto che don Otterrai una buona IntelliSense con dynamic, torneranno da dynamic -soddisfatti di dynamic -quando necessario-e-var -all-tutti-altri-tempi.

Le finalità di dynamic includono: interoperabilità con linguaggi e piattaforme dinamici come COM/C++ e DLR/IronPython/IronRuby; così come trasformare C# in se stesso in IronSmalltalkWithBraces con tutto ciò che implementa IDynamicObject.

Buoni tempi si avranno tutti. (A meno che non sia necessario mantenere il codice scritto da qualcun altro.

+0

Ho fatto un progetto in actionscript, che è sia dinamico che statico, e dirò che gli ibridi dinamici/statici non funzionano bene. – FlySwat

+1

Tutte le persone si generalizzano da un solo esempio. O almeno lo faccio. :) –

+0

Ho fatto un progetto in QBASIC e non avrebbe dovuto essere una lingua. Ma i punti su ActionScript e QBASIC non hanno alcuna rilevanza per C#. C# rimarrà, al centro, orientato agli oggetti in modo statico, con miscele di funzioni alternative molto utili. – yfeldblum

17

Penso che un sacco di repulsione che le persone stanno esprimendo a questa funzione si riduce a "questa è una funzionalità di linguaggio non valido perché consentirà agli sviluppatori malintenzionati di scrivere codice non valido". Se ci pensi, con quella logica tutte le funzionalità della lingua sono sbagliate.

Quando mi imbatto in un blocco di codice VB che qualche genio ha prefisso con On Error Resume Next, non è VB che maledico. Forse dovrei, suppongo. Ma nella mia esperienza una persona che è determinata a mettere un penny nella scatola dei fusibili troverà un modo. Anche se ti svuoti le tasche, lui modellerà i suoi penny.

me, io sono in attesa di un modo più utile di interoperabilità tra C# e Python. Sto scrivendo sempre più codice che fa questo. Il dynamic parola chiave non può venire abbastanza presto per quel particolare caso d'uso, perché il modo attuale di fare mi fa sentire come se fossi un accademico sovietico nel 1950, che è in viaggio verso l'Occidente per una conferenza: c'è una quantità immensa di regole e documenti prima che me ne vada, sono abbastanza sicuro che qualcuno mi guarderà per tutto il tempo che sono lì, e la maggior parte di ciò che raccolgo mentre sono lì mi verrà portato via al confine quando tornerò .

+0

Analogia interessante –

-2

non vedo un motivo per cui l'attuale modo di invocare metodi dynamicly è imperfetto:

Ci vogliono tre linee di farlo, oppure si può aggiungere un metodo di estensione sul System.Object di farlo per voi :

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

Cosa succede se "Hello" è sovraccarico? Cosa succede se qualcuno passa un int per un lungo? Che dire delle prestazioni? Quando percorri questa strada abbastanza lontano, avrai riscritto buona parte del DLR e non hai ancora gestito Python o l'interoperabilità COM. –

+0

... per non parlare della sintassi C# naturale per gli operatori di indicizzazione o infisso –

+0

Supporta solo l'associazione tardiva basata su Reflection. Non funziona per l'associazione tardiva basata su IDynamicObject. Né funziona per oggetti JSON o basati su XML. –

1

Questo è un po 'come discutere telecamere pubbliche, in modo che può e vuole essere oggetto di abuso, ma ci sono vantaggi ad avere loro.

Non v'è alcun motivo per cui non si poteva mettere fuori legge la parola "dinamico" nella propria linea guida di codifica se non ne hanno bisogno. Allora, qual'è il problema? Voglio dire, se vuoi fare cose pazze con la parola chiave "dinamica" e fingere che C# sia un cugino mutante di JavaScript, sii mio ospite. Basta tenere questi esperimenti fuori dalla mia base di codice. ;)

-1

FUD. Potrebbe essere la cosa migliore dopo il pane a fette, ma tutta l'esperienza che ho avuto con VB, JavaScript, ecc. Mi porta i brividi a sapere che C# avrà un'associazione dinamica. So che potrò vederlo in modo razionale nel prossimo futuro e vedere quanto sia buona questa nuova funzionalità per consentire l'interoperabilità con i linguaggi dinamici. Ma ci vorrà del tempo. Sono umano, ok? :-)

Problemi correlati