Включение пользовательских функций приложения в модули
Мое приложение для упрощенных целей имеет
- заявка
- включают
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
не пишите в область приложения - которая должна быть заблокирована на локальном уровне метода - вы должны иметь возможность просто ссылаться на них в области приложения.