Как вы решаете, что использовать: UDF или Custom Tag? - PullRequest
3 голосов
/ 16 марта 2009

WACK говорит:

Если вам кажется, что вам нужно много аргументов, рассмотрите возможность создания CT.

...

КТ значительно мощнее и гибкие, чем пользовательские функции. Пробовать используйте UDF для простых дел ... Используйте CT и компоненты для более активного участия процессы, особенно те, которые вы можете скорее думать о дискретных действиях чем простой "массаж"

Хорошо, но как вы обычно принимаете решения? Интересно узнать реальную практику и примеры.

Для меня это происходит, когда функция имеет много необязательных аргументов, поэтому я должен назвать их myFunc (arg1 = "foo", arg2 = "bar"). Иногда синтаксис <cfmodule> просто становится более читабельным, но не всегда.

Другая причина в том, что мне не нравятся длинные (скажем, более 2 экранов кода) UDF.

Но все эти мысли очень субъективны, поэтому мне интересно читать мнения других людей. Может быть, есть лучшие правила для этого?

Заранее спасибо.

Ответы [ 7 ]

5 голосов
/ 16 марта 2009

В сообществе, вероятно, много людей, которые не согласны со мной, но вот как я обычно думаю об этом. Если то, что вам нужно сделать, связано с выводом на экран, и если имеет смысл «обернуть» это вокруг какого-то другого кода или текста, тогда может потребоваться специальный тег. Во всех остальных случаях UDF работает нормально и в целом лучше. Тем не менее, за почти 8 лет разработки CF я действительно никогда не сталкивался с очень веской причиной для создания собственного тега. Я не говорю, что причины не существуют, но я бы сказал, что они редки.

Если у вас очень длинный UDF, можно ли предположить, что это то, что вы выводите на экран, вызывая этот UDF (на самом деле я не возвращаю значение, которое я имею в виду)? Я бы подумал разбить этот UDF на более мелкие, более управляемые части, если бы это имело смысл, но, как вы намекаете, в конечном итоге важно то, что наиболее читабельно для вас, вашей команды и тех, кто может прийти за вами.

Обновление: из любопытства, на какую книгу CFWACK вы ссылаетесь (версия и том) и на какую страницу?

2 голосов
/ 16 марта 2009

Насколько я помню, пользовательские теги можно вызывать в любое время, когда необходимо определить UDF, прежде чем их можно будет использовать. Это обычно упрощает использование пользовательских тегов. Если бы у вас были огромные библиотеки UDF, было бы обременительно убедиться, что они все включены, и потенциально сервер мог бы тяжело проанализировать их все (по крайней мере в старые времена).

Однако UDF можно использовать более компактно

<cfif myUdf(myVariable)>

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

<h1>Order Page</h1>
<cf_basket_nav>
  <ul>
  <cfloop ...>
    <li>
    <cf_basket_item item="#items[i]#">
    </li>
  </cfloop>
  </ul>
</cf_basket_nav>

Как правило, в настоящее время у меня есть CFC 'utils' с методами для того, что было вашими UDF.

1 голос
/ 28 марта 2009

Одно из соображений использования пользовательских тегов в методах udfs или cfc: когда вы обнаружите, что подпрограмме необходимо передать массив дочерних элементов, вы можете использовать вложенные пользовательские теги, чтобы связать дочерний пользовательский тег и его элементы с родительский пользовательский тег. это позволяет вам делать очень хорошее чистое кодирование, которое легко читается:

<cfmenubar ... >
  <cfloop array="menuitems" ...>
    <cfmenubaritem url="#i.url#">
      #i.label#
    </cfmenubaritem>
  </cfloop>
</cfmenubar>

да, да, я знаю, что у нас есть более приятные dhtml-вещи, такие как меню и вкладки, это просто для примера. Вы можете использовать cfassociate в пользовательском теге, чтобы "передать" атрибуты родительскому пользовательскому тегу, а затем в executemode = "end" получить доступ ко всем динамически генерируемым дочерним элементам в массиве связанных атрибутов. это то место, где вы должны выполнить цикл и вывести меню на экран в этом примере.

также, как прокомментировал другой, позволяет вам делать некоторые умные вещи ... одна вещь, которую я особенно использую, это то, что я устанавливаю prefix = "", а затем я могу по существу принудительно использовать простые html-теги (например, тег ) чтобы получить доступ через пользовательский тег-обработчик во время выполнения - чтобы html-тег стал интеллектуальным во время выполнения ... я делаю это, чтобы проанализировать атрибуты href и target и решить, хочу ли я отображать значок PDF (или другой тип MIME) значок) рядом с ссылкой ... его довольно гладко! это особенно полезно в системе управления контентом или когда у вас есть html-разработчики, использующие dreamweaver или вклада, и вы хотите, чтобы их теги запускали умные теги coldfusion без выполнения каких-либо действий вне стандартного html - редактор не знает никакой разницы и им не нужно перейдите в представление «код», чтобы получить довольно мощный функционал.

наконец, в пользовательском теге вы можете подавить вывод (или использовать кеш), так что это может быть очень полезно, чтобы обернуть вокруг кусок динамически генерируемого html ... доступ к переменной thistag.generatedcontent в EQ режима выполнения " конец "режим

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

НТН джон

0 голосов
/ 28 марта 2009

Не знаю, почему я попал в этот шаблон, но в целом я использую пользовательские теги (всегда с cfmodule) для всего, что выводит HTML и UDF для всего, что просто возвращает простые данные / объекты. Я понимаю, что пользовательские функции также могут выводить данные, но мне не нравится, чтобы у моих функций были побочные эффекты, и это похоже на один. По тем же причинам я теперь использую пользовательские теги везде, где ранее я использовал cfinclude, поскольку они обеспечивают инкапсуляцию данных.

0 голосов
/ 22 марта 2009

Простой код многократного использования может идти в UDF. Это может включать такие вещи, как форматирование строк, манипулирование структурой данных и т. Д. И т. Д.

Для чего-то более сложного, я бы подумал об использовании ХФУ вместо пользовательского тега. Вы сможете написать намного более чистый код в ОО-модели. Вы всегда можете обернуть логику в ваших CFC с помощью собственного тега, если хотите обеспечить простоту использования для человека, который более привык работать с тегами.

0 голосов
/ 16 марта 2009

Джереми указал на полезную опцию: перенос HTML с помощью CT. Но эта функция, кажется, так редко используется. В любом случае, это плюс для CT.

Также я подумал, что предпочитаю функцию, потому что я люблю кодирование cfscript. Пару раз мне приходилось оборачивать устаревшую КТ в UDF только для того, чтобы использовать ее на полностью cfscript-ed странице Это плюс для UDF.

0 голосов
/ 16 марта 2009

cfmodule не имеет преимуществ перед функциями; cfinvoke работает точно так же.

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

Для всего остального, особенно при возврате результатов, функции проще обрабатывать.

...