Какой лучший способ написать код 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
,