Работя върху част от софтуера, предназначен да създава документ, подобен на книга. Приложих го с помощта на декоратори за добавяне на различни функции. Ето пример за инициализацията
$this->chapter[i] = new ChapDecorator1(new ChapDecorator2(new Chapter(i)));
Предизвикателството е, че тези декоратори са твърдо кодирани и че има потенциал за много итерации на софтуера. Интересни промени, направени в нови проекти, често се пренасят обратно към по-старите (което сега не е ужасно с декораторите, тъй като всичко, което се изисква, е добавянето на друг декоратор към дефиницията). Това обаче все още изисква да редактирам кода на подкласа. Оптималната ситуация е действителните създатели на съдържание да избират какви функции имат нужда, без да се налага програмист да редактира каквото и да било.
Ясно е, че по-доброто нещо, което трябва да направите в този случай, е книгата да използва обект, изпълняващ модела Builder, за да създаде обекта Chapter и да го обвие в правилните декоратори за проекта.
И накрая, стигаме до моя въпрос, който е как мога да накарам обекта за изграждане да обработва конфигурационния ред динамично и правилно? Редът, в който декораторите са обвити, предполага ред за разрешаване на извикванията на интерфейс (LIFO). Пример е, че проследяването на редактиране на документ е внедрено като декоратор, но по очевидни причини винаги трябва първо да се оценява, за да се запази състоянието, преди да се направят промени (това трябва да е последната обвивка). За бъдещо развитие, ако приемем, че ще има много декоратори, някои от които може да се наложи първо да разрешат, ако всеки декоратор има нещо като член с приоритетни данни (цяло число?), по който Builder може да сортира? Изглежда като работещо решение, но се притеснявам, че внедряването няма да е много стабилно, ако бъдат създадени голям брой чувствителни към приоритета декоратори/модули. Конфликтните приоритети може да изискват преномериране на много класове например. Както и да е, ще съм благодарен за всяко мнение на хората по въпроса.
Вторият проблем е, ако двама декоратори променят една и съща функция по някакъв начин. Трябва ли изобщо да е възможна тази ситуация? Трябва ли всеки декоратор да посочи своя домейн и да премине през списъка с декоратори, търсейки конфликти?
Всичко това се предполага, че ще има много декоратори и че някои редактори на проекти ще изберат едни, но не и други. Благодаря!