2010-05-26 4 views
4

Je suis nouveau Ruby mais j'ai été un développeur .net pendant de nombreuses années. Je veux mettre en œuvre la composition dans un couple de mon modèle pour m'assurer qu'ils sont aussi lâchement couplés que possible, mais n'ont aucune idée par où commencer, ou si cela est vraiment nécessaire et je pense toujours à un peu comme. Dev dev. Quelqu'un peut-il me donner quelques indications sur par où commencer.Utilisation de la composition en ruby ​​

Vive Colin G

Répondre

2

Ruby est un orienté objet, mais le langage typé dynamiquement. Étant un langage dynamique, les rubis ont tendance à utiliser les réflexions et la modification dynamique du code beaucoup plus que les développeurs .net. Bien sûr, parce que c'est un langage orienté objet, vous pouvez utiliser principalement les mêmes principes que dans .net, et vous devriez aussi, mais toujours regarder autour et voir comment la même chose pourrait être mise en œuvre de manière plus dynamique. Par exemple, l'ORM ActiveRecord résout la composition en utilisant un composé de method qui ajoutera dynamiquement les champs et propriétés appropriés à votre classe. Je ne dis pas que c'est comme ça que ça doit être fait (par exemple DataMapper, qui est un autre ORM pour ruby, choisissez une approche plus "conservatrice", et ressemble donc plus à (Fluent) NHibernate), c'est juste un exemple de comment les choses peuvent être faites différemment.

Des choses comme AOP, ou DI, ne sont pas un concept étranger pour les langages dynamiques, ils sont généralement faits d'une manière alternative. Gardez un esprit ouvert sur les aspects dynamiques de la langue, mais ne les exagérez pas.

+1

Malheureusement, 'composé_of' a été retiré d'ActiveRecord il y a environ 6 mois. Voir https://github.com/rails/rails/pull/6743 – Blackcoat

8

Voulez-vous dire ce genre de chose?

 
class Engine 
    attr_reader :horsepower, :litres 
end 

class Gearbox 
    attr_reader :manufacturer, :model_no 
end 

class Car 
    def initialize(engine, gearbox) 
     raise "Invalid Engine Object" if !engine.kind_of(Engine) 
     raise "Invalid Gearbox Object" if !gearbox.kind_of(Gearbox) 
     @engine = engine 
     @gearbox = gearbox 
    end 
end 


car = Car.new(Engine.new, Gearbox.new) 
+0

Juste une petite amélioration: Je supprimerais les contrôles 'kind_of?' En faveur de Duch Typing https://en.wikipedia.org/wiki/Duck_typing. Autrement 'Car' est marié avec les classes' Engine' et 'Gearbox' pour toujours. Il peut facilement arriver qu'un 'Car' commence à utiliser un' PetrolEngine' ou une autre entité de type moteur, qui ne doit pas nécessairement être une sorte de classe 'Engine', mais qui doit implémenter une interface. –