sexta-feira, setembro 21, 2007

.Net 3.X

Encontrei este link que considero interessante sobre as novas funcionalidades do .NET 3.0 e 3.5. Apesar de achar que vamos ter grande evoluções (LINQ, Lambda expressions, etc), existe um sintatic sugar que não me "passa no goto" porque vai dar origem a mais "lixo" no meio do código, que pode ser facilmente evitado. Veja-se um exemplo simples:
Club club = new club();
club.name = "xpto";
A nova funcionalidade a que me refiro permite o seguinte:
Club club = new club(name = "xpto");
Aparentemente é uma boa evolução, menos linhas de código, menos chamadas ao objecto, agora porquê estou contra esta funcionalidade? Porque na minha perspectiva o que fica realmente elegante é o seguinte:
Club club = new club("xpto");
Têm é de existir construtores que possibilitem afectar os campos que se julguem necessários quando se cria o objecto.

3 comentários:

  1. Grinning Monkey, em honra dos bons velhos tempos, aqui vai um peido mental...

    Mas antes, um pouco de Lisp.

    Trust me, I know what I'm doing.

    (defclass code-monkey ()
    ((name :initarg :name)
    (iq :initarg :iq)))

    Agora posso fazer

    (make-instance 'code-monkey :name "Jimmy" :iq -150)

    ou

    (make-instance 'code-monkey :iq -150 :name "Jimmy")

    ou

    (make-instance 'code-monkey :iq -150)

    ou

    (make-instance 'code-monkey :name "Jimmy")

    Quantos construtores é que eu defini? Nicles. No entanto, ó maravilha, dá para instanciar um objecto da todos os feitios e maneiras. SMOKIN'!!! como dizem os Albaneses.

    Toca a lançar o torpedo!!!

    O pessoal da Microshite além de dar a banana, aínda a tenta descascar e em troca da gentileza a macacada é só guinchos e mordidelas.

    Assim, até eu fico com pena daqueles fdps.

    :p

    ResponderEliminar
  2. Finalmente dás sinais de vida :D
    Isto são apenas opiniões, nem sabia que o teu tão amado lisp tinha esta funcionalidade. Continuo a ter a minha opinião e a não gostar disto, no caso que apresentaste tinhas de fazer 4 construtores, se tivesses que criar 20 instâncias do objecto, o que é um número razoável, o que ficava mais elegante ter 4 construtores ou "lixo" extra nas 20 instanciações?

    ResponderEliminar
  3. Tou a ver que Lisp e code monkeys não se dão bem. ;)

    Não confundas o que fiz no meu exemplo com um construtor com N parâmetros, em que é preciso definir valores para todos os parâmetros de cada vez que se instancia um objecto.

    Aqui vai a tentativa #2, num C# imaginário que sabe fazer umas piruetas.

    class CodeMonkey {
    string name;
    int IQ;
    }

    Não defino qualquer construtor.

    Para instanciar com nome e QI podias fazer:

    ...
    foreach (int i in IQList)
    foreach (string n in NameList)
    CodeMonkeys.add(new CodeMonkey(IQ = i name = n));
    ...

    se só quisesses instanciar com QI:

    ...
    foreach (int i in IQList)
    CodeMonkeys.add(new CodeMonkey(IQ = i));
    ...

    e caso só quisesses instanciar só com o nome:

    ...
    foreach (int n in NameList)
    CodeMonkeys.add(new CodeMonkey(name = n));
    ...

    Como vês, nicles de "lixo". Defines valores apenas para os parâmetros que te interessam. E não necessitas de estar a definir construtores. Claro que precisas de teclar um pouco mais quando fazes a instanciação, mas nada é perfeito.

    Talvez a Microshite esteja a caminhar nesta direcção. O Evil Empire tem estado a investigar linguagens funcionais e dinâmicas ultimamente, e já incorporou várias ideias oriundas dessas linguagens no C#. Portanto, nunca se sabe. Se for este o caso, acho uma boa ideia.

    ResponderEliminar