Включение пользовательских функций приложения в модули

Мое приложение для упрощенных целей имеет

  • заявка
    • включают functions.cfm
    • объект кеша application.o
      • cfcomponent каждый модуль с созданием / обновлением / просмотром типа модели
        • каждый компонент включает functions.cfm так что он может использовать их, в результате чего каждый модуль содержит UDF, которые они не используют.
        • пример будет
          • application.o.items = new cfcs.items()
            • включает в себя functions.cfm
          • application.o.categories = new cfcs.categories()
            • включает в себя functions.cfm

В результате каждый из 10 модулей полностью дублирует functions.cfm в каждый модуль.

Я переделал, превратив функции в компонент (он называется application._, который копируется в variarables._ внутри каждого модуля и вызова функций, таких как _.myUDF() который должен звонить application._ по ссылке, а не воссоздание каждой функции в файле для каждого компонента.

Это должен быть самый быстрый и легкий способ сделать это, не так ли? Может кто-нибудь предложить улучшения этого стиля, или объяснить, почему include может быть предпочтительнее, за исключением необходимости воссоздать компонент, если я изменю функции добавления компонента functions.cfc?

3 ответа

Решение

Ваш файл functions.cfm был включен в ваши файлы CFC, так что вы можете позвонить functionA() в любом из этих ХФУ.

Если вы преобразуете в functions.cfc и вставить этот объект в другие ваши CFC, то вам придется ссылаться на functions объекты в ваших других файлах CFC:

<cfset functions.functionA()>

Так что это много кода для рефакторинга.

Похоже, вы должны extend ваши существующие ХФУ с functions.cfc:

<cfcomponent extends="cfc.functions">

Это делает ваши другие компоненты дочерними объектами functions.cfcкоторые поэтому наследуют содержимое functions.cfc, Теперь из любого дочернего CFC вы можете позвонить functionA() как и когда вы включали functions.cfm,

Если это больше соответствует тому, что вы хотите, и вы хотите, чтобы ВСЕ ваши CFC включили эти функции, вы можете сделать более плавный ход и обновить ядро ​​вашего CF-сервера. component.cfc из которого все ХФУ расширены. Этот файл должен быть найден в <CF_ROOT>\WEB-INF\cftags, Я делал это в прошлом, чтобы добавить дополнительные "нативные" функции в приложения ColdBox. Просто убедитесь, что вы отслеживаете эти изменения в системе контроля версий.

Если я правильно понял, вы уже перенесли все свои функции из functions.cfm к компоненту под названием functions.cfc? Так что ваши functions.cfc выглядит так:

component {

    function doSomething()    { ... }
    function doAnotherThing() { ... }
    ...

}

Теперь давайте перейдем к месту, где вы инициализируете компоненты:

// create an instance of your "functions" component.
helperFunctions          = new functions();

// pass this instance to the others components using the constructor
// (components are passed by reference, so make sure your "functions" component is stateless)
application.o.items      = new cfcs.items(helperFunctions);
application.o.categories = new cfcs.categories(helperFunctions);

И вот как ваш items.cfc а также categories.cfc должен выглядеть так:

component {

    function init(functionsInstance) {

        // keep the reference to the "functions" component
        variables._ = arguments.functionsInstance;
    }

    function someFunction() {

        // use the passed "functions" component's functions
        variables._.doSomething();
        variables._.doAnotherThing();
    }

    ...

}

Теперь, если вы что-то изменили в своих компонентах, вам просто нужно снова запустить "процедуру инициализации". Это обновит / переопределит компоненты, хранящиеся в application.o структура. Поэтому поместите эти строки в отдельный файл, который будет включен при запуске приложения и в шаблон "перезагрузки", который вы вызываете, когда вам нужно обновление в режиме реального времени.

С использованием include Метод должен (насколько я понимаю) позволять вам на лету вносить обновления в файлы и заставлять их отражать мгновенно, без перезапуска приложения. Храня их как объект в application scope, потребует перезапуска приложения, чтобы обновить их. Но важно ли иметь эту способность? Обычно плохая практика - частое изменение кода в производственной среде.

загрузка functions.cfm в переменную поместит его в память, что означает, что он будет присутствовать, пока приложение работает. Это будет использовать более долгосрочные ресурсы, но это также сделает их доступ к ним быстрее. При использовании include будет использовать меньше ресурсов в долгосрочной перспективе, но это должно было бы загрузить functions.cfm каждый раз, когда один из звонящих CFCs назови это; замедляя его и потенциально потребляя более краткосрочные ресурсы.

"Лучший" выбор будет зависеть больше от того, какая функция важнее для вашей настройки.

Мне также любопытно, почему вы переносите application.functions в variables.functions, Пока методы внутри functions.cfm не пишите в область приложения - которая должна быть заблокирована на локальном уровне метода - вы должны иметь возможность просто ссылаться на них в области приложения.

Другие вопросы по тегам