Какой лучший способ написать код CFML для конкретного движка?

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

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

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

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

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

2 ответа

Я думаю, что лучший способ справиться с этим - создать 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)>

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

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

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

Другие вопросы по тегам