Как обрабатывать "Недопустимая длина кода метода" в Coldfusion?
У меня есть куча cfc
файлы (работает coldfusion8
), которые состоят из cfswitch
объединение похожих функций (пользователь, поиск, ...).
Некоторые файлы CFC становятся слишком большими, поэтому я получаю Invalid method Code length 72645
что, я полагаю, говорит: "Ваш файл слишком большой для анализа"..
Я обычно достигаю примерно 2000 строк и думаю, что это... не так много.
Поскольку я поднимаю этот верхний предел для группы файлов, я рассматриваю возможность добавления еще одного функционального уровня = удалить все функции из оператора switch и вызвать cfinvoke
с отдельным CFC для каждой функции.
Вопрос:
Мое приложение не такое уж большое, поэтому мне интересно, есть ли способ обойти верхний предел "Вы не можете иметь больше, чем 2000 строк-в-cfc", и если нет, Является ли жизнеспособным подход иметь отдельные CFC / компоненты для каждого основного метода, вызываемого в приложении?
Спасибо!
РЕДАКТИРОВАТЬ: re: "запланировано":-)
В настоящее время мои ХФУ структурированы следующим образом:
<cfcomponent extends="controllers.main" output="false" hint="handle all user interactions">
<cfscript>
VARIABLES.Instance.Validation = {
// all user-relate form fields including validation method to call (pass = no validation)
id="spec_id"
, corp="pass"
...
};
</cfscript>
<cffunction name="Init" access="public" returntype="any" output="false" hint="Initialize form data">
<cfreturn true />
</cffunction>
<cffunction name="Defaults" access="public" returntype="struct" output="false" hint="Assign defaults">
<cfscript>
// form default values assigned to instance
var formDefaults = {
id=""
, comp=""
...
};
</cfscript>
<cfreturn formDefaults />
</cffunction>
<cffunction name="Commit" access="remote" returntype="struct" output="false" hint="Main handler">
<cfscript>
// all var declarations
var userID = "";
var strRememberMe = "";
var timestamp = now();
...
var defaultValues = THIS.Defaults();
var LOCAL = {};
structAppend(defaultValues, VARIABLES.Instance.FormData);
LOCAL.User = defaultValues;
LOCAL.User.timestamp = timestamp ;
</cfscript>
<!--- the switch --->
<cfswitch expression = #LOCAL.User.submitted_form#>
... lot of stuff ...
</cfswitch>
<cfreturn LOCAL.Response />
</cffunction>
<!--- UTILITY FUNCTIONS --->
<cffunction name="Validate" access="public" returntype="array" output="false" hint="validate form inputs">
<cfscript>
var LOCAL = {};
var double = structNew();
double.criteria = VARIABLES.Instance.Validation;
double.form = VARIABLES.Instance.FormData;
</cfscript>
<!--- Get error name and type --->
<cfinvoke component="form_validate" method="validate_fields" double="#double#" returnvariable="validation_errors"></cfinvoke>
<cfset LOCAL.ErrorMessages = validation_errors />
<cfreturn LOCAL.ErrorMessages />
</cffunction>
</cfcomponent>
Сейчас я пишу много неструктурированных вещей, но разделение на функционал-cfcs и последующая их обработка не показались мне очень "незапланированными".
Если это так, что может быть лучше, если мне все равно придется сделать это заново? Коммутатор будет иметь около 15 случаев, что является средним значением для всех основных кодов, которые я использую.
Спасибо!
1 ответ
Я испытал эту проблему в CF8 некоторое время назад, а также. Не существует общего "ограничения 2000 строк", но есть максимальное значение в JVM для смещения адреса, чтобы перейти в подпрограмму. Смещение не должно превышать 2 байта (WORD), в противном случае вы столкнетесь с этим исключением. Чтобы избежать больших смещений адресов в подпрограмме (функции), вам необходимо минимизировать большие блоки условных переходов (если /else/switch). Вы можете сделать это, используя вместо этого несколько подпрограмм (эти вызовы могут занять полный регистр до 4/8 байт).
Например: Редизайн...
function A (x, y) {
if (...) {
switch (...) {
case ...:
switch (...) {
...
}
...
}
} else {
switch (...) {
...
}
}
}
Чтобы что-то вроде...
function A (x, y) {
if (...) {
call B(x, y);
} else {
call C(x, y);
}
}
function B (x, y) {
switch (...) {
case ...:
call B1(x, y);
...
}
}
function B1 (x, y) {
switch (...) {
....
}
}
function C (x, y) {
switch (...) {
....
}
}
... вы поняли. Это обычно также улучшает удобочитаемость и удобство обслуживания.
В основном эта ошибка возникает из-за того, что функция или метод, который вы написали в ColdFusion, взрывают ограничение Java в 65535 байт на метод (около 2000 строк кода CF).
Просто сократите эту функцию, вызвав из нее более мелкие функции.
Вызов функции размером 10 000 байт стоит всего 100 байт.
Before (blows up):
Function(){
10,000 bytes of code
15,000 bytes of code
20,000 bytes of code
30,000 bytes of code
}
After (success!):
Function(){
100 Byte call to 10,000 bytes of code
100 Byte call to 15,000 bytes of code
100 Byte call to 20,000 bytes of code
100 Byte call to 30,000 bytes of code
}