Pergunta

Depois de ler muitas das respostas para esta discussão , vejo que muitos daqueles que não gostam dele citar o potencial para o abuso da nova palavra-chave. Minha pergunta é: que tipo de abuso? Como isso pode ser abusado tão mal como fazer as pessoas veementemente não gostam dele? É apenas cerca de purismo? Ou há uma verdadeira armadilha que eu não estou vendo?

Foi útil?

Solução

Alguns o vêem como uma ferramenta que irá ser abusado. Como "Option Strict Off" e "On Error Resume Next" em VB que as línguas "puras", como C # e Java nunca tive.

Muitos disseram o mesmo sobre a palavra-chave "var", mas eu não vê-lo sendo abusado, uma vez que ficou entendido que não era a mesma do VB "Variante"

Pode ser abusado em lugares que os desenvolvedores preguiçosos não querem a verificação de tipo em classes e apenas tentar chamadas dinâmicas de captura em vez de escrever "se blah blah ...".

Eu, pessoalmente, sinto que poderia ser usado adequadamente em situações como este recente pergunta que eu respondi.

Eu acho que os que realmente entendê-lo do poder são aqueles pesadamente nas linguagens dinâmicas NET.

Outras dicas

Eu acho que um monte de repulsa que as pessoas estão expressando a esta característica se resume a "este é um recurso de linguagem ruim porque vai permitir que desenvolvedores ruins para escrever código ruim." Se você pensar sobre isso, por essa lógica todas recursos de linguagem são ruins.

Quando eu me deparo com um bloco de código VB que algum gênio tem prefixado com On Error Resume Next, não é VB que eu curse. Talvez eu devesse, eu suponho. Mas, na minha experiência uma pessoa que está determinado a colocar um centavo na caixa de fusíveis vai encontrar um caminho. Mesmo se você esvaziar seus bolsos, ele vai formar suas próprias moedas.

Me, eu estou ansioso para uma forma mais útil de interoperabilidade entre C # e Python. Eu estou escrevendo mais e mais código que faz isso. A palavra-chave dynamic não pode vir em breve para que caso de uso particular, porque a forma atual de fazer isso me faz sentir como se eu sou um Soviética acadêmica na década de 1950 que está viajando para o Ocidente para uma conferência: há uma imensa quantidade de regras e papelada antes de eu começar a sair, eu tenho certeza que alguém vai estar assistindo me toda a vez que eu estou lá, e mais do que eu pegar quando eu estou lá vai ser tirado de mim na fronteira quando eu voltar .

dinâmica é ruim porque um código como este irá aparecer em todo o lugar:

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

em vez de:

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

O primeiro, não tem nenhuma informação de tipo estático, nenhuma verificação de tempo de compilação, não é auto-documentação, nenhum tipo de inferência que as pessoas vão ser forçados a usar uma referência dinâmica no site da chamada para armazenar o resultado, levando a uma maior perda de tipo e todo este espirais para baixo.

Eu já estou começando a temer dinâmica .

Editar : O perigo passou (! Ufa) ... e dinâmica não foi sido abusado afinal de contas, não há necessidade de se vote me após 3 anos:)

A verdadeira armadilha? Grave falta de documentação. arquitetura inteira do aplicativo existe na mente da pessoa (ou pessoas) que o escreveu. Pelo menos com tipagem forte, você pode ir ver o que o objeto faz através da sua definição de classe. Com dinâmica de digitação, você deve inferir o significado de seu uso, na melhor das hipóteses. Na pior das hipóteses, você não tem idéia o que é o objeto. É como programar tudo em JavaScript. ACK!

Quando as pessoas percebem que eles não obter um bom IntelliSense com dynamic, eles vão voltar de ser dynamic-feliz em dynamic-quando-necessárias-e-var-em-todo-outro-tempo.

Os fins de dynamic incluem: interoperabilidade com linguagens dinâmicas e plataformas como COM / C ++ e DLR / IronPython / IronRuby; bem como transformar C em si # em IronSmalltalkWithBraces com tudo IDynamicObject de execução.

Os bons tempos vão ser tido por todos. (A menos que você precisa para manter o código alguém escreveu.)

Esta é uma espécie de discutir câmeras públicas, com certeza eles podem e vão ser mal utilizado, mas há benefícios para tê-los também.

Não há nenhuma razão para que você não poderia banir a palavra "dinâmica" em sua própria orientação de codificação se você não precisa deles. Então qual é o problema? Quer dizer, se você quer fazer coisas loucas com a palavra chave "dinâmico" e fingir C # é a algum primo mutante de JavaScript, seja meu convidado. Basta manter estas experiências da minha base de código. ;)

FUD. Pode ser a melhor coisa desde o pão fatiado, mas toda a experiência que eu tive com VB, JavaScript, etc., me traz calafrios saber que C # terá de ligação dinâmica. Eu sei que vou ser capaz de olhar para ele de forma racional no futuro próximo e ver o quão bom esse novo recurso será para permitir a interoperabilidade com linguagens dinâmicas. Mas vai demorar algum tempo. Eu sou humano, ok? : -)

Eu não vejo uma razão pela qual a atual forma de chamar métodos dynamicly é falho:

É preciso três linhas para fazê-lo, ou você pode adicionar um método de extensão em System.Object para fazer isso por você:

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);
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top