Обработка больших форм с помощью ColdFusion через ajax

Я довольно часто использую Ajax (Jquery) для отправки форм на обработку в ColdFusion. Я отправляю форму в CFC, который возвращает результаты и ошибки пользователю через уведомления Ajax.

Формы могут быть довольно большими (подумайте о полных HTML-страницах с дополнительными входными данными) и требуют много логики в CFC для правильной обработки в зависимости от того, какие опции были выбраны в форме.

Поскольку каждая функция в CFC может быть большой (возможно, 1200 строк кода), я получаю от ColdFusion ужасную ошибку «целевое смещение ветвления слишком велико для коротких». Чтобы обойти это, я поместил некоторый код в файл .cfm и использовал <cfinclude>, чтобы вернуть код обратно в cfc, который «решает» проблему, но я чувствую, что это сбивает с толку, когда я пытаюсь организовать все маленькие фрагменты для связи с конкретным CFC. . Это также может быть неэффективным способом работы.

Я хотел бы знать, как другие пользователи ColdFusion структурируют/обрабатывают формы с помощью CFC, которые выполняют много дополнительных действий при передаче данных формы в базу данных.

Вот некоторые варианты, о которых я подумал:

  • Создайте функции «оболочки» для действий «Создать», «Обновить», «Чтение» и «Удалить», в которых не так много кода.
  • Внутри функций оболочки cfinclude все фрагменты кода по подфункциям из многих других файлов .cfm, чтобы свести код к минимуму.
  • ИЛИ вызывать другие CFC, которые выполняют подфункции и передают им переменные формы в качестве аргументов.

Варианты выше приведут к тому, что у меня будет такая структура (что мне не нравится):

Article.cfc (CreateArticle, EditArticle etc)
  CreateArticle_InsertImage.cfc
  CreateArticle_ProcessBodytext.cfc
  CreateArticle_InsertUser.cfc
  CreateArticle_CheckIfExistingArticle.cfc
  EditArticle_UpdateImage.cfc
  EditArticle_UpdateBodytext.cfc
  EditArticle_CheckIfExistingArticle.cfc

В конечном итоге я бы создал новые CFC для каждой функции, а не сами по себе классы/объекты. Вместо этого они могут быть файлами CFM (и использовать <cfinclude>, но кажется странным делать это вот так. Есть ли альтернативный/лучший/стандартный способ, о котором кто-нибудь знает?


person volume one    schedule 09.01.2018    source источник
comment
Какую версию ColdFusion вы используете? Также на основе этой статьи: coldfusionmuse.com/index. cfm/2007/9/28/Branch.Target.Offset у вас может быть слишком много if или циклов, и Java просто сходит с ума от этого.   -  person James A Mohler    schedule 10.01.2018
comment
Вы используете транзакции? Я видел длинные блоки cftransaction, создающих эту проблему.   -  person rrk    schedule 10.01.2018
comment
@JamesAMohler Использование ColdFusion 2016 Enterprise. Там много тегов cfif, но я не могу их сбить дальше. Я попытался уменьшить их и удалить теги <cftransaction>, но это не сработало. Единственным способом было перекачать код в файлы .cfm, а затем восстановить их вместе в CFC, используя <cfinclude>. Это заставило меня задуматься о том, что может быть лучший/модульный/oop способ сделать это.   -  person volume one    schedule 10.01.2018
comment
Я не использую ajax или cfc таким образом. Однако хорошей практикой программирования обычно считается то, что функции должны делать только одну вещь. Если у вас есть функции длиной более 1000 строк, возможно, вы не следуете этой практике.   -  person Dan Bracuk    schedule 10.01.2018


Ответы (1)


Большие фрагменты cfif/cfelseif/cfif или cfswitch/cfcase могут вызвать ошибку смещения ветвления. В некоторых случаях мы исправили это, просто переместив их в отдельные операторы cfif. Это значительно уменьшает количество ветвлений в вашем коде.

Перерывы:

<cfif ListFindNoCase("myString", trim(arguments.event_key)) GT 0>
   <!--- myString code --->
<cfelseif ListFindNoCase("myOtherString", trim(arguments.event_key)) GT 0>
   <!--- myOtherString code --->
</cfif>

Компилирует:

<cfif ListFindNoCase("myString", trim(arguments.event_key)) GT 0>
   <!--- myString code --->
</cfif>
<cfif ListFindNoCase("myOtherString", trim(arguments.event_key)) GT 0>
   <!--- myOtherString code --->
</cfif>

Вы можете переместить эти условные проверки в отдельные функции, особенно если вы в конечном итоге просто устанавливаете значение одной переменной.

Если вы в затруднительном положении, просто переместите код во включаемые и разберите его позже. 1200 строк кода в одной функции — это ничто. На моем последнем концерте были CFC, которые были просто грудами включений, расширяющими другие CFC, которые были грудами включений, и каждое включение могло содержать 20-30 тысяч строк кода с функциями, которые также содержали включения. Включения в функции часто делались специально для решения проблемы смещения ветвления.

FWIW, у меня есть распечатка дампа метаданных глубокого дочернего объекта на моей стене как абстрактное искусство.

person Adrian J. Moreno    schedule 11.01.2018
comment
Вы понимаете, что эти два примера кода логически не эквивалентны, я надеюсь. - person Dan Bracuk; 11.01.2018
comment
@DanBracuk Большая часть приложения была нелогичной. :) - person Adrian J. Moreno; 12.01.2018
comment
Восхищайтесь радостями рефакторинга наследия - person Cory Silva; 13.01.2018
comment
Это интересно, я попробую. - person volume one; 13.01.2018