Что практический путь состоит в том, чтобы смоделировать справочные таблицы в Доменном управляемом дизайне (DDD)?

В зависимости от того, что вы на самом деле хотите от этих строк, вы можете использовать парсер, например, parsimonious:

from parsimonious.nodes import NodeVisitor
from parsimonious.grammar import Grammar

grammar = Grammar(
    r"""
    command     = set operand to? number (operator number)* middle? to? numsys? number
    operand     = (~r"words?" / "speed") ws
    middle      = (~r"[Ww]ords" / "bits")+ ws number
    to          = ws "to" ws
    number      = ws ~r"[-\d.]+" "kts"? ws
    numsys      = ws ("oct" / "hex") ws
    operator    = ws "and" ws
    set         = ~"[Ss]et" ws
    ws          = ~r"\s*"
    """
)

class HorribleStuff(NodeVisitor):
    def __init__(self):
        self.cmds = []

    def generic_visit(self, node, visited_children):
        pass

    def visit_operand(self, node, visited_children):
        self.cmds.append(('operand', node.text))

    def visit_number(self, node, visited_children):
        self.cmds.append(('number', node.text))


examples = ['Set word 45 and 46 to hex 331',
            'set words 45 and 46 bits 3..7 to 280',
            'set word 45 to oct 332',
            'set speed to 60kts Words 3-4 to hex 34']


for example in examples:
    tree = grammar.parse(example)
    hs = HorribleStuff()
    hs.visit(tree)
    print(hs.cmds)

Это даст

[('operand', 'word '), ('number', '45 '), ('number', '46 '), ('number', '331')]
[('operand', 'words '), ('number', '45 '), ('number', '46 '), ('number', '3..7 '), ('number', '280')]
[('operand', 'word '), ('number', '45 '), ('number', '332')]
[('operand', 'speed '), ('number', '60kts '), ('number', '3-4 '), ('number', '34')]
43
задан John 11 May 2011 в 15:51
поделиться

4 ответа

Возможно, вы захотите изучить концепцию Разделение запросов команд . Я бы не стал беспокоиться о типизированных репозиториях для поиска значений, но я все же, вероятно, использовал бы классы типов DTO над наборами данных и т. Д.

Вы можете потратить некоторое время на чтение блогов Грега Янга, начиная с этого по настоящее время. Он не говорит конкретно о заполнении справочных данных, но часто говорит о том, что не обрабатывает функции чтения / отчетности вашего приложения с помощью типизированных методов в хранилище.

7
ответ дан 26 November 2019 в 23:11
поделиться

Использование DDD У меня есть нечто похожее со следующим:

interface IAddressService
{
  IList<Country> GetCountries ();
  IList<State> GetStatesByCountry (string country);
  IList<City> GetCitiesByState (string state);
  // snip
}

Страна, штат и город - это объекты-ценности, которые поступают из таблицы поиска в базе данных.

6
ответ дан 26 November 2019 в 23:11
поделиться

Государство и округ являются не объектами, а ценными объектами. Они не являются предметом вашей системы. То, как вы сказали, что обращались с ними ранее, в порядке. Когда вы измените записи штата или округа в своей базе данных, основываясь на изменениях в состоянии вашей доменной модели? Нет, поэтому им не понадобится хранилище.

2
ответ дан 26 November 2019 в 23:11
поделиться

Вы читаете не ту книгу, если хотите научиться делать DDD, не усложняя его. : -)

Самое простое решение, которое вы предлагаете, подойдет, если оно отвечает вашим потребностям. Инкапсуляция данных адресов в бизнес-объектах может быть настолько простой или сложной, насколько этого требует ваше приложение. Например, объект State имеет отношение один-ко-многим с округом, поэтому сотруднику просто нужно указать округ, если вы решили смоделировать его таким образом. Я бы представил такую ​​сложность только в случае необходимости.

Кроме того, я не думаю, что можно многого добиться, определяя интерфейсы для ваших репозиториев, если только они не существуют ».

2
ответ дан 26 November 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: