Каковы основные различия в моделировании предметной области в .NET / Java и Ruby? - PullRequest
1 голос
/ 21 ноября 2010

Я опытный разработчик .NET (6 лет), и я действительно вхожу в (неанемичное) моделирование предметной области: объединение корней, размещение инвариантов в параметрах конструктора, больше методов, меньше открытых классов и членов.

Я показывал своему коллеге по Rubyist (разработчику, которого я действительно уважаю), над чем я работал, и он указал, что большая часть текста на экране будет необходима в Ruby, но я не совсем понял, что онозначало.Поэтому мой вопрос заключается в следующем:

Для приложения, достаточно сложного, для которого действительно требуется модель предметной области, каковы принципиальные различия между моделью предметной области, реализованной в строго типизированной корпоративной платформе типа .NET /J2EE против той же модели, реализованной в Ruby (в The Ruby Way)?Является ли Ruby подходящим инструментом для решения подобных проблем?

1 Ответ

0 голосов
/ 21 ноября 2010

Сильно типизированный vs not, по моему мнению, не имеет большого значения для объема кода. Я делаю много сложных моделей предметной области в javascript, и вы не можете воспользоваться преимуществами свободной типизации и поддерживать вменяемый код. Как правило, вы должны сохранять тип поля экземпляра одинаковым, иногда не иметь объекта, а другой - массив - смешивание яблок и груш просто смущает вас и других.

Один раз, когда это может быть уместно, это методы, принимающие разные аргументы. В Javascript нет перегрузки методов, поэтому принимать как яблоки, так и груши может уместно.

Что может означать ваш друг под ruby, так это краткий синтаксис объявления классов. Все поля экземпляра в ruby ​​являются закрытыми - и существует краткий синтаксис для объявления методов получения и установки, компараторов и т. Д. Сравните:

рубин

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+")";
    }
}
...