2009-11-05 4 views
2

Иногда бывает необходимо написать другой код для Adobe ColdFusion vs Railo vs OpenBD из-за различий в реализации.Каков наилучший способ написать конкретный CFML-код двигателя?

У людей есть определенный метод, который они используют для этого?

Например, включение ProductName является одним из вариантов:

<cfswitch expression="#Server.ColdFusion.ProductName#"> 
    <cfcase value="ColdFusion Server"> 
     ... 
    </cfcase> 
    <cfcase value="Railo"> 
     ... 
    </cfcase> 
    <cfcase value="BlueDragon"> 
     ... 
    </cfcase> 
</cfswitch> 

Это лучший способ, или кто может предложить что-то лучше?

+0

Я только начал работать на сервере Coldfusion. Каковы некоторые различия в серверах приложений, на которые нужно кодировать? – Jay

+0

В большинстве случаев не о чем беспокоиться, так как и Railo, и OpenBD обычно совместимы с функциями ACF. Проблема возникает, когда в одном из них есть ошибка, которую нужно обрабатывать таким образом, чтобы либо ломать, либо замедлять работу без ошибок. Обработка ACF с 'expandPath' подпадает под эту категорию в некоторых ситуациях (например, когда применяется к абсолютным путям или использует завершающие косые черты на Apache). [продолжение ...] –

+0

Я предполагаю, что такая ситуация может возникнуть и с конкретными функциями поставщика. (Например, возможно, вы используете стороннюю библиотеку с ACF/OpenBD, чтобы имитировать cfvideo для Railo, но если в этой библиотеке отсутствует одна из функций cfvideo, вы не захотите использовать ее по всем направлениям. Несомненно, множество подобных примеров к этому через все двигатели.) –

ответ

4

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

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

4

Я думаю, что лучший способ справиться с этим - создать cfc для каждого движка и имя соответствующего метода в каждом cfc. то то, что вы могли бы сделать, это вызвать cfc и запустить метод в зависимости от движка. вы можете использовать оператор switch в событии onapplicationstart(), чтобы установить переменную широкого диапазона приложений для инициализации и сохранения специфического для двигателя cfc. небольшой пример будет:

<cfset loc.engine = "adobe"> 
<cfswitch expression="#Server.ColdFusion.ProductName#"> 
    <cfcase value="Railo"> 
     <cfset loc.engine = "railo"> 
    </cfcase> 
    <cfcase value="BlueDragon"> 
     <cfset loc.engine = "openbd"> 
    </cfcase> 
</cfswitch> 

<cfset application.engine = createobject("component", "engines.#loc.engine#").init()> 

то в вашем коде все, что вы должны сделать:

<cfset myvar = application.engine.somemethod(arguments)> 

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