Как я могу разделить компонент с помощью cfinclude и все еще использовать наследование? - PullRequest
3 голосов
/ 13 июня 2010

ОБНОВЛЕНИЕ: Кажется, что railo вообще не имеет этой проблемы.

ОБНОВЛЕНИЕ: Я голосую, чтобы закрыть этовопрос, который, как я чувствую, заставляет людей больше концентрироваться на целом: «есть ли у кого-то лучшая идея разделить большие компоненты», часть этого вопроса (которую я никогда не должен был вставлять), чем реальная проблема использования cfinclude с cfcomponent.

Примечание: это просто упрощенный пример того, что я пытаюсь сделать, чтобы донести идею.

Проблема, с которой я столкнулся, заключается в том, что я хочу использовать cfinclude внутри cfcomponent, чтобы я моггруппируйте похожие методы в отдельные файлы для большей управляемости.Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь расширить другой компонент, который также использует cfinclude для управления его методом, как показано ниже.Обратите внимание, что ComponentA расширяет ComponentB:

ComponentA
==========
<cfcomponent output="false" extends="componentb">
    <cfinclude template="componenta/methods.cfm">
</cfcomponent>

componenta/methods.cfm
======================
<cffunction name="a"><cfreturn "componenta-a"></cffunction>
<cffunction name="b"><cfreturn "componenta-b"></cffunction>
<cffunction name="c"><cfreturn "componenta-c"></cffunction>
<cffunction name="d"><cfreturn super.a()></cffunction>

ComponentB
==========
<cfcomponent output="false">
    <cfinclude template="componentb/methods.cfm">
</cfcomponent>

componentb/methods.cfm
======================
<cffunction name="a"><cfreturn "componentb-a"></cffunction>
<cffunction name="b"><cfreturn "componentb-b"></cffunction>
<cffunction name="c"><cfreturn "componentb-c"></cffunction>

Проблема заключается в том, что когда я пытаюсь инициализировать ComponentA, я получаю сообщение об ошибке: "Подпрограммы не могут быть объявлены более одного раза. Подпрограмма a была объявлена ​​дваждыв разных шаблонах. "

Вся причина этого в том, что когда вы используете cfinclude, он оценивается во ВРЕМЯ РАБОТЫ, а не ВРЕМЯ КОМПИЛЯЦИИ.

Если не переместить методы в сами компонентыи исключив использование cfinclude, как я могу обойти это или у кого-то есть идея лучше разделить большие компоненты?

Ответы [ 5 ]

2 голосов
/ 13 июня 2010

Не проверено, но я бы попробовал поместить содержимое каждой функции во включаемый файл, но определив функции внутри самого файла компонента. `

<cfcomponent name="a">
    <cffunction name="aa">
        <cfinclude template="componenta/functiona.cfm" />
    </cffunction>
</cfcomponent>

Удачи.

0 голосов
/ 14 июня 2010

Если ваша проблема заключается исключительно в том, чтобы избежать огромных громоздких объектов, возможно, вы можете разбить свои объекты на несколько более мелких объектов.Компонент A все еще может содержать методы ABCD, но метод A вызывает метод A ComponentA_A, метод B вызывает метод B ComponentA_B и т. Д. Лучше всего, если каждый подкомпонент основан не на произвольной группировке, а на разумной группировке, основанной на функциональности.Еще одна вещь, с которой можно поэкспериментировать (это дикий удар в темноте), функции обычно описываются как структуры, прикрепленные к некоторой области видимости.Например, вы можете удалить функции из Application.cfc с помощью structDelete (this, onRequestStart).Может быть, вы можете использовать тот же подход, чтобы удалить функции, ранее прикрепленные к области запроса в include?

0 голосов
/ 13 июня 2010

У меня есть zarko, вы должны переставить свои объекты, но если вам нужно ...

В CF5 я использовал хитрость, заключающуюся в том, чтобы поместить функции в область запроса.Это можно сделать, присвоив имя функции переменной запроса с тем же именем, то есть для функции с именем getLatestUpdate:

Request.getLatestUpdate = getLatestUpdate

, затем, перед включением файла в функции, выполните проверку на наличиепеременной в области запроса.Только cfinclude файл функций, если переменная области запроса не существует.

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

Я не проверял это и YMMV.

0 голосов
/ 13 июня 2010

Я не проверял это, но как насчет упаковки вашего cfinclude чем-то вроде:

<cfif NOT structKeyExists(this,"someMethodNameInIncludeFile")>
      <cfinclude....>
</cfif>
0 голосов
/ 13 июня 2010

Мой совет: повторно проанализируйте ваши объекты, попробуйте применить все правила ООП и лучшие практики (абстракция, инкапсуляция, модульность, полиморфизм, наследование, СУХОЙ и т. Д.).

Таким образом, вы хотите, чтобы компонент B имел метод isCrunchable (), затем компонент A расширяет B, а isCrunchable () доступен из наследования. И A, и B вернут разные состояния, поэтому я не вижу никаких проблем с этим. Если вы сделаете один класс «выше», в котором все методы и компоненты A и B будут расширять этот класс, вы получите решение для «больших компонентов», но, опять же, я попытаюсь немного укротить это.

Если этот ответ не поможет, вы можете опубликовать реальный пример, может быть, мы получим лучшее представление, почему вам нужно так сделать.

...