привет.
есть некое дерево, каждая нода которого имеет Н свойств.
В зависимости от этого набора свойств к элементу должен быть применен свой обработчик (генератор).
Реалии таковы, что этот набор свойств далеко неизвестен и варьируется от 1 до 10000000, и нужно построить систему так, чтобы расширение не привело к головной боли.
Чтобы было более понятно и привязано к чему-то, допустим, что это дерево — XML. может иметь Н различных тегов, в зависимости от которых выбирается свой обработчик.
Сами свойства могут быть настолько разнообразны, что можно даже грабить корованы..
(Если кто начнет говорить про ТЗ и т.д., то есть его часть, а система все равно будет расширяться заказчиком, и нужно к этому быть готовым)
При чем внутри свойства может понадобиться информация о другом свойстве и о другом элементе.
В виду того, что будет много уровней абстракции самих свойств, как написать сам обработчик?
Элемент будет хранить массив IProperty и нужно будет получать конкретный тип, а в зависимости от этого набора уже как-то выбирать генератор
из этого 2 проблемы (как минимум):
1. получать тип. варианты — визитор или кастовать
2. пока вменяемых идей нет.
Re: Гибкий генератор
От:
Аноним
Дата:
22.08.11 08:09
Оценка:
А кто принимает решение, подходит этому набору свойств обработчик или нет?
Т.е. однозначно ли обработчик определяется набором свойств, может ли быть так что одна и та же комбинация свойств подходит 2м разным обработчикам?
И могут ли быть лишние или опциональные свойства, которые можно игнорировать при выборе обработчика?
Может ли обработчик иметь состояние, т.е. создается ли один инстанс для всех узлов, или новый инстанс для каждого?
Если нет состояния, и набор однозначно определен — то
самое простое решение — иметь хеш-таблицу обработчиков, где хеш-код вычисляется по именам свойств (отсортированным).
Таким образом имея массив IProperty, и имея имя каждой, можно вычислить искомый хеш. Для обработки коллизии
можно сделать метод IProperty.CanBeHandledBy(IHandler), и выцеплять только тот обработчик, для которого все проперти сказали true.
Re[2]: Гибкий генератор
От:
Аноним
Дата:
22.08.11 08:59
Оценка:
Здравствуйте, Аноним, Вы писали:
А>А кто принимает решение, подходит этому набору свойств обработчик или нет? А>Т.е. однозначно ли обработчик определяется набором свойств, может ли быть так что одна и та же комбинация свойств подходит 2м разным обработчикам? А>И могут ли быть лишние или опциональные свойства, которые можно игнорировать при выборе обработчика?
А>Может ли обработчик иметь состояние, т.е. создается ли один инстанс для всех узлов, или новый инстанс для каждого?
Немного нужно уточнить. не полностью описал суть.
Можно считать, что при старте вы выбираете тип обработчика. он в свою очередь умеет работать со стандартными свойствами (как и любой другой обработчик) и специфическими (можно считать, что это комплект обработчик + его обрабатываемые свойства). если попадаются свойства, которые он не умеет обрабатывать, то ассерт — такого не может быть).
Но само множество свойств, которое обрабатывается отдельным обработчиком бесконечно. и нужно сделать так, чтобы расширение свойств и самого обработчика было максимально комфортным.