Как да настроя шаблоните Builder и Decorator за конфигурируем софтуер?

Работя върху част от софтуера, предназначен да създава документ, подобен на книга. Приложих го с помощта на декоратори за добавяне на различни функции. Ето пример за инициализацията

$this->chapter[i] = new ChapDecorator1(new ChapDecorator2(new Chapter(i)));

Предизвикателството е, че тези декоратори са твърдо кодирани и че има потенциал за много итерации на софтуера. Интересни промени, направени в нови проекти, често се пренасят обратно към по-старите (което сега не е ужасно с декораторите, тъй като всичко, което се изисква, е добавянето на друг декоратор към дефиницията). Това обаче все още изисква да редактирам кода на подкласа. Оптималната ситуация е действителните създатели на съдържание да избират какви функции имат нужда, без да се налага програмист да редактира каквото и да било.

Ясно е, че по-доброто нещо, което трябва да направите в този случай, е книгата да използва обект, изпълняващ модела Builder, за да създаде обекта Chapter и да го обвие в правилните декоратори за проекта.

И накрая, стигаме до моя въпрос, който е как мога да накарам обекта за изграждане да обработва конфигурационния ред динамично и правилно? Редът, в който декораторите са обвити, предполага ред за разрешаване на извикванията на интерфейс (LIFO). Пример е, че проследяването на редактиране на документ е внедрено като декоратор, но по очевидни причини винаги трябва първо да се оценява, за да се запази състоянието, преди да се направят промени (това трябва да е последната обвивка). За бъдещо развитие, ако приемем, че ще има много декоратори, някои от които може да се наложи първо да разрешат, ако всеки декоратор има нещо като член с приоритетни данни (цяло число?), по който Builder може да сортира? Изглежда като работещо решение, но се притеснявам, че внедряването няма да е много стабилно, ако бъдат създадени голям брой чувствителни към приоритета декоратори/модули. Конфликтните приоритети може да изискват преномериране на много класове например. Както и да е, ще съм благодарен за всяко мнение на хората по въпроса.

Вторият проблем е, ако двама декоратори променят една и съща функция по някакъв начин. Трябва ли изобщо да е възможна тази ситуация? Трябва ли всеки декоратор да посочи своя домейн и да премине през списъка с декоратори, търсейки конфликти?

Всичко това се предполага, че ще има много декоратори и че някои редактори на проекти ще изберат едни, но не и други. Благодаря!


person Hath995    schedule 19.12.2011    source източник


Отговори (1)


Можете да използвате модифициран builder за това, където връщате различен builder клас за всяко извикване на builder метод и този върнат builder клас има само подмножество от всички методи за изграждане на цялостния клас.

Това ви позволява да избегнете извикването на един и същ метод многократно и също така ви позволява да контролирате цялостния ред на изграждане. Пример за това може да бъде намерен тук.

person JRL    schedule 20.12.2011
comment
Благодаря, мисля, че това е начало, но все още не е идеално за моята ситуация. Има два въпроса - излишък и ред. За строителя аз съм загрижен преди всичко за реда. Мога да отговоря на въпроса си кой декоратор ще разреши първо. Последният нанесен и след това работи навътре. Това ми дава поръчка, но след това как да накарам строителя да ги приложи в ред въз основа на настройките на базата данни, без да прибягва до цяло число със статичен приоритет. Излишъкът е по отношение на декоратора. Когато се направи извикване на интерфейс към него, трябва ли да се разреши на двама декоратори, които редактират една и съща функция? - person Hath995; 20.12.2011
comment
Съжалявам, но мисля, че не го казах достатъчно ясно. Ще преформулирам въпроса. - person Hath995; 20.12.2011