2

実装の違いにより、Adobe ColdFusion と Railo と OpenBD で異なるコードを記述する必要がある場合があります。

人々はこれに使用する特定の方法を持っていますか?

たとえば、ProductName をオンにすることは 1 つのオプションです。

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

それが最善の方法ですか、それとも誰かがより良い方法を提案できますか?

4

2 に答える 2

4

突き詰めると、それがおそらく最も信頼できる方法です。明示的な製品チェックよりも機能検出を行う方が安全かもしれませんが、CFML には、そのような目的で使用できる多くのイントロスペクション機能がありません。

仕事で CFC を使用する場合、StrategyTemplate Methodなどのパターンを使用して、これらの代替実装の一部を非表示にすることもできます。しかし、実装を選択するときは、おそらくまだProductName.

于 2009-11-05T23:42:47.917 に答える
4

これを処理するより良い方法は、エンジンごとに cfc を作成し、各 cfc に一致するメソッド名を作成することだと思います。次にできることは、その cfc を呼び出して、エンジンに応じてメソッドを実行することです。onapplicationstart() イベントで switch ステートメントを使用して、アプリケーション全体の変数を設定し、エンジン固有の 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)>

確かに、それはまだ最も美しい解決策ではありませんが、少なくともエンジン固有のコードをすべて 1 か所に格納し、コードベースにスイッチ ロジックを散らかすことはありません。

于 2009-11-06T16:10:41.773 に答える