Специфичный для домена язык для бизнес-объектов? - PullRequest
1 голос
/ 21 февраля 2009

Я думаю о написании предметно-ориентированного языка (DSL) для моделирования бизнес-объектов. DSL не будет выполнен, вместо этого он будет использоваться генератором кода на основе шаблонов (вероятно, CodeSmith) для генерации .NET & SQL.

DSL должен будет поддерживать определение следующих элементов:

  • Классы (название и описание)
  • Свойства (имя, понятное имя, тип, ноль / не ноль)
  • Простая проверка (требуется, регулярное выражение, диапазон и т. Д.)
  • Отношения между классами (от 1 до 1, от 1 до многих, от многих до многих)
  • Наследование (возможно, в версии 2)

Вот простой пример того, как может выглядеть код DSL:

Class: Insured
  Desc: "Represents a person covered by an insurance policy"
  Prop: FirstName, "First Name", String(20), not null
  Prop: LastName, "Last Name", String(20), not null
  Prop: MailAddress, "Mailing Address", Address, not null
  Prop: SSN, "Social Security Number", String(9), null      
  Rule: RegEx, SSN, ^\d{9}$

Class: Address
  Prop: Line1, "Line 1", String(30), not null
  Prop: City, "City", String(30), not null
  Prop: State, "State", String(2), not null
  ...

Ради простоты DSL более сложные правила проверки будут кодироваться на целевом языке. Текущий план состоит в том, чтобы запретить сгенерированный код и добавить более сложные правила в подклассы.

Кто-нибудь написал что-то подобное этому? Можете ли вы дать какие-либо советы или ссылки на аналогичные решения?

Ответы [ 4 ]

2 голосов
/ 21 февраля 2009

Довольно легко автоматически преобразовать структуру, которую вы представляете, в XML. Оттуда, я думаю, можно написать какое-то преобразование через XSLT или XQuery в любой конечный результат, который вы пожелаете. Я написал надстройку Visual Studio под названием CodeGenUtils , чтобы упростить выполнение преобразований.

Если вам действительно хочется написать собственный анализатор, я бы посоветовал взглянуть на существующие текстовые DSL-решения, такие как, например, JetBrains MPS .

1 голос
/ 23 февраля 2009

У меня есть проект под названием bdUnit , в котором я использовал части инфраструктуры Oslo при создании DSL, который моделирует пользовательские истории как интерфейсы C # и модульные тесты.

Часть примера ввода:

begin story "AUserStory":
begin setup 
    @Person to have a ~Spouse(@Person) 
            ~IsActive(true) 
            ~Age(0) 
            ~IsDead(false) 
            and several ~Children(@Person)
            and a ~Location(@Location)
        I want a @Person to be able to #Kill another @Person
        I want a @Person to be able to #Marry another @Person
        I want to be able to #Find all @Person
    @Location to have a ~Latitude(0.0)
            and a ~Longitude(0.0)
end setup

Соответствующий сгенерированный код C #:

[PluginFamily("bdUnit")]
public interface IPerson
{
    IPerson Spouse { get; set; }
    bool IsActive { get; set; }
    int Age { get; set; }
    bool IsDead { get; set; }
    IList<IPerson> Children { get; set; }
    ILocation Location { get; set; }
    void Kill(IPerson user);
    void Marry(IPerson user);
    void Find();
}

[PluginFamily("bdUnit")]
public interface ILocation
{
    decimal Latitude { get; set; }
    decimal Longitude { get; set; }
}

Я компилирую интерфейсы и тесты в dll, чтобы они были «запрещены». Эти интерфейсы могут быть реализованы только в наследующих классах. Затем я использую StructureMap , чтобы ввести необходимые зависимости в модульные тесты.

1 голос
/ 21 февраля 2009

Предлагаем вам взглянуть на OSLO , хотя бы для того, чтобы не изобретать его заново.

0 голосов
/ 13 января 2010

Хм, это из мира Java, однако с помощью проекта Eclipse TMF Xtext такая задача будет выполнена за считанные минуты. Посетите их домашнюю страницу, и приведите очень похожий пример.

...