首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写特定于引擎的CFML代码的最佳方式是什么?

编写特定于引擎的CFML代码的最佳方式是什么?
EN

Stack Overflow用户
提问于 2009-11-06 07:28:27
回答 2查看 218关注 0票数 2

有时,由于实现的不同,有必要为Adobe ColdFusion、Railo和OpenBD编写不同的代码。

人们有没有特定的方法来做这件事?

例如,打开ProductName是一种选择:

代码语言:javascript
复制
<cfswitch expression="#Server.ColdFusion.ProductName#">
    <cfcase value="ColdFusion Server">
       ...
    </cfcase>
    <cfcase value="Railo">
       ...
    </cfcase>
    <cfcase value="BlueDragon">
       ...
    </cfcase>
</cfswitch>

这是最好的方法吗,或者有人能提出更好的建议吗?

EN

回答 2

Stack Overflow用户

发布于 2009-11-06 07:42:48

当你认真对待它的时候,这可能是最可靠的方法。进行特性检测可能比进行显式的产品检查更安全,但是CFML没有太多的内省特性可以用来做这类事情。

如果您在工作中使用CFCs,那么您还可以使用StrategyTemplate Method等模式隐藏其中的一些替代实现。但是,当您选择一个实现时,您可能仍然会回到ProductName

票数 4
EN

Stack Overflow用户

发布于 2009-11-07 00:10:42

我认为处理这个问题的更好方法是为每个引擎创建一个cfc,并在每个cfc中创建一个匹配的方法名称。然后,您可以调用该cfc并根据引擎运行该方法。您可以在onapplicationstart()事件中使用switch语句来设置应用程序范围的变量,以初始化和存储特定于引擎的cfc。一个小的例子是:

代码语言:javascript
复制
<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()>

然后在你的代码中,你要做的就是:

代码语言:javascript
复制
<cfset myvar = application.engine.somemethod(arguments)>

当然,这仍然不是最好的解决方案,但至少你可以将所有引擎特定的代码放在一个地方,而不是把你的代码库和开关逻辑弄得乱七八糟。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1684389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档