2009-06-11 1 views
1

У меня проблема, связанная с дизайном составной структуры. У меня есть абстрактный класс Expression, который описывает общее математическое выражение. Идея состоит в том, что выражение может быть атомным выражением (например, «x» или «3») или какой-либо агрегацией атомных выражений (например, сборы, модели, экспоненции и т. Д.). Это, оказывается, хорошо описывается композитным шаблоном, поэтому, например, класс Summatory наследует от OperationTerm, который, в свою очередь, наследуется от Expression и содержит список «augends» терминов Expression.Наследование в составной структуре

Все в порядке, пока я не попытаюсь специализировать некоторые из этих выражений на основе некоторых свойств; например, если выражение вырабатывается суммированием мономиальных терминов, оно должно быть «помечено» как полином, чтобы оптимизировать определенные виды операций (например, интегралы или производные) таким образом, который прозрачен для кода клиента (который должен обрабатывать только объекты Expression).

У кого-нибудь есть идея, как я мог бы спроектировать такую ​​структуру (возможно, расширяемой)?

ответ

0

Я думаю, что вы идете по этому пути неправильно. Не беспокойтесь о маркировке вещей как о полиномии и т. Д.

Просто убедитесь, что ваш перевод с любого ввода в фактическую структуру данных прост и прост.

Такие вещи, как Polynomial, могут быть добавлены позже или помечены позже в общую структуру, которую вы создали изначально.

Этот вид шаблона дизайна очень много подходит для компиляторов/переводчиков как для компьютерных, так и для естественных языков. В основном, первый шаг - синтаксический анализ, когда вы создаете структуру синтаксиса, например. дерево синтаксиса. Затем существует семантический анализ, где значение привязывается к синтаксису. Судя по вашим описательным терминам, вы, вероятно, используете интерпретатор математических выражений, поэтому это будет очень близкое совпадение.

Взгляните на Керниган и Пайк для своего примера (настольный калькулятор), примеры Ахо Хопкрофта и книги Ульмана о структурах данных/интерпретаторах языка/компиляторах, примеры некоторых современных простых компиляторов и т. Д. Они являются плодотворным источником шаблонов проектирования (хотя они и предшествовали популярности этого термина).

0

Если выражения инвариантны, то есть они никогда не записываются после создания, тогда вы можете просто создавать экземпляры специализированного класса (используя шаблон Factory, если вы хотите сохранить данные из клиентского кода). Если они не являются инвариантными, вы можете использовать State pattern и просто относиться к «меткам», о которых вы говорите, как о разных состояниях выражения.

1

Вы не можете. Поскольку вы хотите иметь разные специализированные выражения, вам придется подклассифицировать тип выражения.

Обычно, когда вы определяете типы, которые могут быть использованы для создания абстрактных деревьев синтаксиса, вы также предоставляете Visitor и/или модификатор, который клиентский код может использовать для просмотра/изменения составного выражения из корня.

Что касается построения нового составного дерева выражений, это не должно быть проблематичным, поскольку код клиента знает, какие выражения он хочет собрать.

0

Если CompositeExpression происходит от Expression и Polynomial происходит от CompositeExpression, то Polynomial также Expression (как вы сказали, прозрачно для клиентского кода).

Смежные вопросы