2008-10-28 12 views
6

Po przeczytaniu wielu odpowiedzi na this thread widzę, że wielu osobom, którym się to nie podoba, podają możliwość nadużycia nowego słowa kluczowego. Moje pytanie brzmi: jakiego rodzaju nadużycie? Jak to mogło być nadużywane tak bardzo, że ludzie gwałtownie tego nie lubili? Czy chodzi tylko o puryzm? Czy istnieje prawdziwa pułapka, której po prostu nie widzę?Dynamiczne słowo kluczowe C# 4 - dlaczego nie?

Odpowiedz

16

Niektórzy postrzegają to jako narzędzie, które będzie nadużywane. Podobnie jak "Option Strict Off" i "On Error Resume Next" w VB, których "czyste" języki, takie jak C# i Java, nigdy nie istniały.

Wiele mówi to samo o „var” słowo kluczowe, ale nie widzę, to jest nadużywany, gdy stało się zrozumiałe, że to nie była taka sama jak VB „wariant”

To może być nadużywane w umieszcza, że ​​leniwi programiści nie chcą sprawdzać klasy i po prostu próbować chwytać dynamiczne wywołania zamiast pisać "jeśli bla jest Blah ...".

Osobiście uważam, że można go poprawnie używać w takich sytuacjach, jak: this ostatnie pytanie, na które odpowiedziałem.

Myślę, że ci, którzy naprawdę rozumieją swoją moc, są tymi, którzy w bardzo dynamiczny sposób posługują się językami .NET.

+3

var jest nadużywany w inny sposób - zmniejsza czytelność, a nie bezpieczeństwo. – TraumaPony

+1

Zgadzam się. Nie chciałem sugerować inaczej. – TheSoftwareJedi

+0

Widziałem, jak było nadużywane. Z pewnością zmniejsza to czytelność, chociaż Jon Skeet powiedział w podcastie .NET Rocks, że zwiększa on czytelność ... co nie jest pewne jak to jest możliwe ... – BobbyShaftoe

6

Prawdziwa pułapka? Poważny brak dokumentacji. Cała architektura aplikacji istnieje w umyśle osoby (lub osób), która ją napisała. Przynajmniej dzięki silnemu pisaniu można zobaczyć, co robi obiekt poprzez definicję klasy. Dzięki dynamicznemu pisaniu musisz w najlepszym razie wywnioskować znaczenie z jego użycia. W najgorszym przypadku nie masz ŻADNEGO IDEA tego, czym jest obiekt. To jak programowanie wszystkiego w JavaScript. ACK!

+2

To prawda, było to już możliwe: programy C# z dużymi opcjami interfejsu mogą sprawić, że określanie rzeczywistej implementacji dla danego połączenia będzie działaniem frustrującym, pełnym domysłów i wyszukiwania pełnotekstowego. – Shog9

+1

Tak, ale interfejs zapewnia NIEKTÓRE znaczenie operacji. Obiekt dynamiczny nie zawiera ŻADNEGO kontekstu. Co znajduje się na drugim końcu dynamicznego q? Kto wie? –

7

dynamiczny jest złe, ponieważ kod jak ten pojawi wszędzie:

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

zamiast:

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

Pierwszy z nich, nie ma statycznej informacji typu, nie ma czasu kompilacji sprawdzanie, to nie jest dokumentacja własna, brak wnioskowania o typ, więc ludzie będą zmuszeni do korzystania z dynamicznego odniesienia na stronie połączenia, aby zapisać wynik, prowadząc do większej utraty typu, a wszystkie te spirale w dół.

Już zaczynam się bać dynamiczny.

Edytuj: Niebezpieczeństwo minęło (! Uff) ... i dynamiczny nie był nadużywany mimo wszystko, nie ma potrzeby, aby w dół głosu mnie po 3 latach :)

+2

Co twoim zdaniem może zachęcić ludzi do niepotrzebnego pisania dynamicznego kodu? Co może ich zniechęcić? –

2

Kiedy ludzie zdają sobie sprawę, że don nie dostaniesz dobrego IntelliSense z dynamic, powrócą oni z trybu dynamic - będą zadowoleni z dynamic -czas-konieczny-i-var -wszystko-innych-razy.

Do celów dynamic należą: zgodność operacyjna z dynamicznymi językami i platformami, takimi jak COM/C++ i DLR/IronPython/IronRuby; jak również przekształcanie samego C# w IronSmalltalkWithBraces ze wszystkim, co implementuje IDynamicObject.

Dobre czasy będą wszystkim. (Chyba że potrzebujesz kodu, który napisał ktoś inny.)

+0

Zrobiłem projekt w actionscript, który jest zarówno dynamiczny, jak i statyczny, i powiem, że dynamiczne/statyczne hybrydy nie działają dobrze. – FlySwat

+1

Wszyscy ludzie uogólniają się z jednego przykładu. Lub przynajmniej ja. :) –

+0

Zrobiłem projekt w QBASIC-ie, który nie powinien być również językiem. Ale punkty dotyczące ActionScript i QBASIC naprawdę nie mają żadnego znaczenia dla C#. C# pozostanie, rdzeń, statycznie wpisany obiektowo, z bardzo przydatnymi alternatywnymi zestawami funkcji wymieszanymi. – yfeldblum

17

Myślę, że wiele odraza, że ​​ludzie wyrażają się do tej funkcji sprowadza się do "jest to funkcja złego języka, ponieważ pozwoli złym programistom pisać zły kod." Jeśli się nad tym zastanowisz, przez tę logikę wszystkie funkcje językowe są złe.

Po napotkaniu bloku kodu VB, że jakiś geniusz ma przedrostek On Error Resume Next, nie przeklinam VB. Może powinienem, jak sądzę. Ale z mojego doświadczenia wynika, że ​​osoba, która jest zdecydowana postawić pensa w skrzynce z bezpiecznikami, znajdzie sposób. Nawet jeśli opróżnisz mu kieszenie, wymodeluje własne grosze.

Ja, nie mogę się doczekać, aby bardziej przydatny sposób współpracy między C# i Python. Piszę coraz więcej kodu, który to robi. Słowo kluczowe dynamic nie może nadejść niedługo na ten konkretny przypadek użycia, ponieważ obecny sposób robienia tego sprawia, że ​​czuję się jak sowiecki naukowiec w latach 50., który podróżuje na Zachód na konferencję: jest ogromna ilość reguł i papierkowa robota, zanim wyjdę, jestem prawie pewna, że ​​ktoś będzie mnie obserwował przez cały czas, kiedy tam będę, a większość tego, co znajdę, gdy tam będę, zostanie mi odebrana na granicy, kiedy wrócę .

+0

Interesująca analogia –

-2

Nie widzę powodu, dlaczego obecny sposób wywoływania metod dynamicznie jest błędna:

trwa trzy linie to zrobić, czy można dodać metodę rozszerzenia na System.Object zrobi to za Ciebie :

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

Co się stanie, jeśli "Hello" jest przeciążone? Co jeśli ktoś przejdzie przez int? A co z wydajnością? Kiedy pokonasz tę drogę wystarczająco daleko, będziesz przepisał znaczną część DLR i nadal nie będziesz obsługiwać interakcji Pythona lub COM. –

+0

... nie wspominając o naturalnej składni C# dla operatorów indeksujących lub infiksujących. –

+0

To obsługuje tylko opóźnione wiązanie oparte na odbiciu. To nie działa dla późnego wiązania opartego na IDynamicObject. Nie działa również w przypadku obiektów JSON lub opartych na XML. –

1

To jest coś w rodzaju dyskusji aparatów publicznych, na pewno mogą i będą nadużywane ale istnieją korzyści mając je dobrze.

Nie ma powodu, dla którego nie mogliby Państwo zabronić stosowania słowa kluczowego "dynamiczny" w swoich wytycznych dotyczących kodowania, jeśli ich nie potrzebujesz. Więc w czym problem? Chodzi mi o to, że jeśli chcesz robić szalone rzeczy za pomocą słowa kluczowego "dynamic" i udawać C#, jesteś mutantem kuzyna JavaScript, bądź moim gościem. Po prostu wyłącz te eksperymenty z mojej bazy kodów. ;)

-1

FUD. To może być najlepsza rzecz od czasu krojonego chleba, ale wszystkie doświadczenia jakie miałem z VB, JavaScript itp., Przynosi mi dreszcze, aby wiedzieć, że C# będzie miało wiązanie dynamiczne. Wiem, że będę mógł spojrzeć na to racjonalnie w najbliższej przyszłości i zobaczyć, jak dobra będzie ta nowa funkcja, aby umożliwić współdziałanie z dynamicznymi językami. Ale zajmie to trochę czasu. Jestem człowiekiem, ok? :-)

Powiązane problemy