2009-02-23 2 views
7

Je donne une série de conférences à une équipe de développement .NET (C#) sur le langage et l'environnement Ruby. Je l'aborde comme une opportunité pour mettre en évidence les avantages de Ruby sur C#. Au début, je veux me concentrer sur la langue elle-même avant de passer à l'environnement (RoR vs ASP MVC, etc). Quelles caractéristiques de la langue Ruby couvririez-vous?Quelles caractéristiques linguistiques de Ruby mettriez-vous en évidence par rapport à C#?

+0

La culture de SO est telle que nous n'aimons pas les guerres de langue. "Avantages de Ruby sur C#" est susceptible de faire travailler certaines personnes. Je suggère un montage pour être un peu moins subjectif et argumentatif. –

+0

Je n'essaie pas de déclencher une guerre linguistique, mais je souhaite obtenir des réponses diverses sur ce qui différencie une langue (ruby) d'une autre (C#). – jsmorris

Répondre

1

Mélange ins et héritage multiple.

C'est dangereux dans de mauvaises mains, mais plutôt bénéfique pour l'encapsulation correcte des choses, par opposition à avoir à hériter de beaucoup de choses dont vous n'avez pas nécessairement besoin.

+2

Ni C# ni ruby ​​n'ont d'héritage multiple ... –

5

Dactylographie du canard! Ce sera moins un problème dans C# 4.0, mais il y a eu des moments où j'ai dû dupliquer des blocs entiers de code parce que deux classes liées avec (à mes fins) des API identiques ne partageaient pas une classe de base.

Aussi, blocs. C# a lambdas, mais la syntaxe de Ruby est plus jolie et ils sont utilisés de manière omniprésente dans les bibliothèques standard. Ils font bien plus partie de Ruby idiomatique que de C# idiomatique, et cela compte pour quelque chose.

Modifier
Les littéraux de hachage méritent une mention, aussi. En général, je soulignerais à quel point vous pouvez être concis dans Ruby, et comment cela vous permet d'exprimer mieux l'intention et de passer moins de temps à essayer de rendre le compilateur heureux

+0

+1 pour le typage statique du canard, comme dans les contraintes de membre – MichaelGG

+0

+1 pour les blocs. C'est une caractéristique puissante de Ruby. –

11

J'ai parlé à un groupe d'utilisateurs .NET il y a quelque temps à propos de IronRuby, et fait face à des problèmes similaires. Les choses sur lesquelles je me suis concentré étaient:

  • Duck tapant. Il n'y a rien de plus stupide que List<string> stringList = new List<string>();

  • Syntaxe expressive et concise. Des choses simples comme omettre des parenthèses, des tableaux et des littéraux de hachage, etc. (combiné avec le typage de canard, vous obtenez string_list = [] qui est évidemment plus agréable). Toutes les petites choses qui s'additionnent de façon importante.

  • Métaprogrammation. En commençant par des choses simples comme attr_accessor, alors peut-être quelque chose d'un peu plus avancé si elles ne voient pas immédiatement les avantages. N'essayez pas de comparer les choses à des histoires sur les programmes qui écrivent d'autres programmes ... les gens penseront que vous fumez quelque chose. Restez simple et marteler le point que vous ne devez pas continuer à écrire le même code merdique boilerplate plus

  • Comme une bonne « finale », leur montrer quelques tests de style NUnit normales avec tout le désordre de Assert.NotEqual<string> blah que ils ont généralement, puis disent "voici le même code écrit en rubis" et leur montrent qu'il est écrit en utilisant rspec (ce sera la moitié de la longueur et 10 fois plus facile à lire ... si cela ne les vend pas, rien ne le fera).

+0

Il n'y a rien de plus stupide que Liste stringList = new Liste (); <- Ce n'est pas le typage du canard, c'est l'inférence de type. – MichaelGG

+0

Je veux dire, contourner c'est l'inférence, c'est-à-dire, (var x = new List ()). Et +1 pour plus de littéraux et de métaprogrammation. – MichaelGG

+0

L'inférence de type Sure est excellente, mais elle est toujours limitée aux variables locales. J'ai de nombreuses définitions de classe contenant la liste m_strings = new Liste () qui ne semblent pas vouloir disparaître de sitôt :-( –

5

J'aborde comme une occasion de mettre en évidence les avantages de Ruby sur C#.

Je ne suis pas sûr que ce soit la bonne chose à faire. Si le ton de vos discussions est, "Ruby est cool parce que vous pouvez faire x dedans!" vous allez perdre votre audience C# très rapidement.Ils vont répondre, "Nous pouvons simuler x en C# si nous voulons, mais nous n'avons pas beaucoup d'utilisation pour x dans nos conceptions." ou peut-être, "Si vous pensez que vous devez faire x alors vous le faites mal!"

Ils ne comprendront pas comment Ruby peut les aider jusqu'à ce qu'ils comprennent Ruby. Pourquoi ne pas les emmener à travers des problèmes de jouets et leur montrer comment un programmeur Ruby les résoudrait? Enseignez-leur la méthode Ruby. Une semaine plus tard, quand ils sont confrontés à un problème, l'un d'entre eux dira: «Eh bien, je sais comment résoudre ça, mais si j'utilisais Ruby, ce serait beaucoup plus facile ... . »

1

En plus de ce que tout le monde a dit, classes ouvertes est une caractéristique importante de Ruby qui convient de mentionner: (exemple volé Ruby From Other Languages)

class Fixnum 
    def hours 
    self * 3600 # number of seconds in an hour 
    end 
    alias hour hours 
end 

# 14 hours from 00:00 January 1st 
# (aka when you finally wake up ;) 
Time.mktime(2006, 01, 01) + 14.hours # => Sun Jan 01 14:00:00 

Je sais, patching like a monkey should be avoided, mais je pense que mettre en évidence cette fonctionnalité pour les nouveaux arrivants devrait leur donner une idée de la philosophie derrière Ruby. N'oubliez pas de dire: "Enfants, ne pas essayer à la maison!"

+0

hmmm, quelque peu équivalent aux méthodes d'extensions de C# (mais peut être différent dans les détails d'implémentation) – niceman

Questions connexes