Вам нужно реализовать форму наследования, точно такую же, как наследование в объектно-ориентированных языках программирования или CSS, в которой вы начинаете с набора общих параметров, а затем позволяете переопределять его другими параметрами в более конкретных наборах.
Вы устанавливаете иерархию наборов опций, начиная сверху с опций, общих для всех пользователей, затем наборов опций, которые вы идентифицировали как общие для многих типов пользователей, и, наконец, опции для конкретных пользователей. Это должно быть представлено в виде дерева в вашем XML-файле конфигурации, когда вы даете каждому набору параметров имя и родителя. В нижней части дерева находятся наборы опций, названные в честь конкретных типов пользователей (As, Bs и т. д.).
В вашей программе вам нужно прочитать этот файл и собрать дерево в памяти. Затем перемещайтесь по нему сверху вниз, собирая параметры и переопределяя их по мере продвижения. Когда вы дойдете до пользовательских опций на листьях дерева и выполните последние переопределения, вы закончите.
Когда вы факторизуете свои варианты, вы можете обнаружить, что некоторые наборы должны иметь более одного родителя, потому что они объединяют варианты из более чем одного набора. Если это так, ваше дерево становится DAG, и вам нужно топологически отсортировать его, прежде чем вы его пройдете.
Я понимаю, что это сложное решение, но могу заверить вас, что это наиболее гибкий способ работы с несколькими конфигурациями, имеющими общие элементы. Я успешно применил его для настройки нескольких веб-сайтов электронной коммерции, которые использовали один и тот же сервер.
person
Martin Broadhurst
schedule
15.11.2010