Разделить файл CFC на несколько файлов - PullRequest
1 голос
/ 27 января 2011

Меня попросили обновить старый проект. Когда я вошел в файл cfc, в нем было более 3000 строк кода и более 100 функций. Мне было интересно, смогу ли я разделить cfc на несколько файлов, чьи функции логически сгруппированы без необходимости изменения кода на любых других страницах.

Ответы [ 4 ]

5 голосов
/ 27 января 2011

столкнуться с аналогичной проблемой.Я создал новые cfcs и изменил исходные функции для вызова функций внутри новых cfcs.

Например,

 <cffunction name="GetStuff" access="remote" returntype="Struct">
      <cfreturn createObject("component","myNewCFC").GetStuff(argumentCollection=arguments)/>
 </cffunction>
2 голосов
/ 27 января 2011

Вопрос подразумевает, что достаточно клиентского кода, использующего этот объект, что изменение вызовов в другом месте, если объект разбит на части, является обременительным. В этом случае трактуйте существующий объект как Facade - это объект, который обеспечивает унифицированный интерфейс с иерархией базового класса.

Способ создания иерархии заключается в определении тех функций, которые должны идти вместе. Всякий раз, когда я сталкиваюсь с этой проблемой, функции обычно не разделяют никакого состояния, скорее они похожи на static java-методы, но если есть функции, которые разделяют состояние, они являются хорошим кандидатом для этой группировки. В противном случае обычно это функции, которые используют одни и те же входные параметры или имеют одинаковое словосочетание в названии (то есть saveMyData, loadMyData и т. Д.).

Учитывая этот пример, скопируйте эти функции в новый CFC (например, MyData) - в этот момент вы можете изменить имена функций, чтобы исключить повторение или улучшить их ясность (например, MyData.load()). Вернувшись к исходному объекту (т. Е. BigCFC), удалите реализацию этих функций и вместо этого делегируйте вызов вновь созданному CFC (вы можете рассмотреть возможность включения нового CFC в состав старой). Так это будет выглядеть примерно так:

<cffunction name="loadMyData">
  <cfargument name="id" type="numeric"/>
  <cfreturn variables.myData.load(arguments.id)/>
</cffunction>

Где variables.myData будет установлено как часть инициализации CFC.

Использование этого подхода означает, что изменения не влияют на ваш существующий клиентский код, но все же разбивает все на логические группировки и позиционирует новый код для использования более детальных CFC.

2 голосов
/ 27 января 2011

Refactor, Refactor, refactor ...

Самый простой способ - использовать cfinclude для ввода функций (mixin's)

0 голосов
/ 07 января 2016

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

Если цель состоит в том, чтобы просто лучше организовать вещи с точки зрения управления кодом (а не, скажем, чтобы конкретно сократить количество методов в каждом CFC), то я бы рекомендовал разбить CFC на несколько страниц CFM и в том числе их в ХФУ. С точки зрения управления кодом, вы можете сгруппировать несколько функций в хорошо названный файл CFM, и со всем становится намного легче иметь дело. Код вызова остается тем же самым, поскольку все функции все еще создаются в CFC, как и прежде.

У меня есть немного кода, который я использую в моих методах инициализации, который автоматически включает все CFM-файлы, которые он находит в одной и той же папке, и я храню один base.cfc в каждой папке вместе с сгруппированными функциями.

, например

<cfscript>
    // Set CFC name
    Variables.sCFCName = 'appUtils';
    // Set folder
    Variables.sCFCFolder = GetDirectoryFromPath(GetCurrentTemplatePath());
    // Get CFC files
    Variables.qCFCFiles = directoryList(Variables.sCFCFolder, true, 'query');
</cfscript>

<!--- Init function --->
<cffunction name="init" access="public" returnType="any" output="false" hint="Constructor">
    <cfargument name="DSN" type="string" default="" hint="Datasource" />

    <!--- Set DSN --->
    <cfset Variables.DSN        = Arguments.DSN />

    <cfreturn this />
</cffunction>

<!--- Include CFC files --->
<cfoutput query="Variables.qCFCFiles">
    <cfif Variables.qCFCFiles.type EQ 'file' AND GetToken(Variables.qCFCFiles.name, 2, '.') EQ 'cfm'>
        <cfinclude template="#Variables.qCFCFiles.Name#" />
    </cfif>
</cfoutput>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...