2010-11-21 5 views
1

Ich bin ein erfahrener .NET-Entwickler (6 Jahre) und ich bin wirklich in (nicht anämischen) Domain-Modellierung: Aggregat-Wurzeln, setzen Invarianten in Konstruktor-Parameter, mehr Methoden, weniger öffentliche Klassen und Mitglieder.Was sind die Hauptunterschiede in der Domänenmodellierung in .NET/Java im Vergleich zu Ruby?

Ich zeigte meinem Rubyist-Mitarbeiter (ein Entwickler, den ich wirklich respektiere), woran ich gearbeitet habe und er deutete an, dass ein Großteil des Textes auf dem Bildschirm in Ruby notwendig sein würde, aber ich verstand nicht genau, was er tat gemeint. Meine Frage ist also:

Für eine App, die ausreichend komplex ist, dass ein Domänenmodell wirklich aufgerufen wird, sind die wichtigsten Unterschiede zwischen dem Domänenmodell in einer stark typisierten, Enterprise-y-Plattform wie .NET/J2EE versus das gleiche Modell in Ruby implementiert (in The Ruby Way)? Ist Ruby ein geeignetes Werkzeug für diese Art von Problem?

Antwort

0

Stark typisierte vs nicht, macht meiner Meinung nach keinen großen Unterschied auf die Menge an Code. Ich mache viele komplexe Domain-Modelle in Javascript, und Sie können nicht wirklich von der losen Typisierung profitieren und vernünftigen Code beibehalten. In der Regel sollten Sie den Typ eines Instanzfeldes gleich halten, ein Objekt manchmal nicht und Array andere Zeiten - das Mischen von Äpfeln und Birnen verwirrt nur Sie selbst und andere.

Die eine Zeit, die es möglicherweise angebracht ist, ist in Methoden, die verschiedene Argumente nehmen. Javascript hat keine Methode überladen, so akzeptiert sowohl Äpfel und Birnen kann geeignet sein.

Was Ihr Freund mit Ruby gemeint haben könnte, ist die knappe Syntax zum Deklarieren von Klassen. Alle Instanzfelder in Ruby sind privat - und es gibt eine kurze Hand Syntax für Getter und Setter, Komparatoren usw. vergleichen erklärt:

Rubin

class Person 
    attr_reader :name, :age 
    attr_writer :name, :age 
    def initialize(name, age) 
    @name, @age = name, age 
    end 
    def <=>(person) # Comparison operator for sorting 
    @age <=> person.age 
    end 
    def to_s 
    "#@name (#@age)" 
    end 
end 

Java

public class Person implements Comparable<Person> { 
    private String name; 
    private int age; 
    public Person(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 
    public int compareTo(Person other) { 
     return this.age - other.getAge(); 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public int getAge() { 
     return age; 
    } 
    public void setAge(int age) { 
     this.age = age; 
    } 
    public String toString() { 
     return name + " ("+age+")"; 
    } 
} 
+0

Seit C# hat auto-Eigenschaften, die eine Eigenschaft mit getters/setters deklarieren, ist nicht viel länger als ein Feld zu deklarieren. – CodesInChaos

+0

"Stark typisierte vs nicht, macht meiner Meinung nach keinen großen Unterschied auf die Menge an Code." Ich stimme zu. Wir schreiben irgendwo Code, um das wieder gut zu machen. Der wirkliche Unterschied zu mir zwischen den verschiedenen Sprachen ist, wie einfach ich den Code schreiben kann, der die Unterschiede abdeckt, und fließt er oder muss ich ihn auswählen und aushebeln. –

+0

Worauf ich hinaus wollte, war eher: "Machen Sie in Ruby die gleichen Dinge, die Sie in .NET tun würden, damit das Design die Clients dazu zwingt, den Code auf bestimmte Arten zu verwenden: Aggregatwurzeln, erzwungene Invarianten über Konstruktor-Parameter, Factory-Klassen usw. Das würde ich als gutes Domänen-Design bezeichnen (zumindest in einer statischen Sprache) und ich frage mich, ob diese Ideen auf Ruby übertragen werden. –

Verwandte Themen