2011-01-05 7 views
3

特定のBPMベンダーと連携する社内エンタープライズアプリケーション(EJB2)があります。社内アプリケーションの現在の実装では、ベンダーのAPIによってのみ公開されるオブジェクトを取得し、APIの公開されたメソッドを使用してそのオブジェクトを変更します。密接に結合された設計を改善するのに役立つ

私は何とか内部オブジェクトをこの外部オブジェクトにマップする必要があると思っていますが、それは単純すぎるように思えますし、これを行うための最善の戦略についてはあまりよく分かりません。過去にこのような状況をどのように処理したかについて、誰かが何らかの光を当てることができますか?

私はこのベンダーのソフトウェアを「ブラックボックス」にしたいので、必要に応じて簡単に置き換えることができます。どのように内部オブジェクトをこの公開されたAPIオブジェクトにマップするかは、設計上の観点から最良のアプローチは何でしょうか?私の社内アプリケーションはAPIとまだ話している必要があるので、両者の間にいくつかの依存関係が存在することを覚えておいてください。しかし、私はjunitを使ってこのソフトウェアとは別にテストすることもできます。

おかげで、 ジェイソン

+0

アプリケーションに特定の制約がある場合を除き、以下の回答は、標準的な抽象的な方法(インターフェイスを使用)を示しています。私はあなたがすでにこれを知っていたと確信していますので、あなたのアプリにこのような困難をもたらす特定のものがあるかどうか不思議です。また、ここでピギーバックするのではなく、本当に疎結合したい場合は、 "new MyAPIEndpoint();ではなくSpring IOCを使用できます – Victor

+0

私はいくつかのタイプのファサードを作ることが行く方法だったというより多くの確認を探していました。なぜここでやっていないのか分からなかったので、私は何かが欠けていると思った。 Springは理想的なものであり、今後そのフレームワークに移行したいと考えています。 – JasonH

答えて

3

サービスレイヤのインターフェイスを作成します。内部的にすべてのコードがそのレイヤで動作します。その後、そのインタフェースを使用するクラスを作成し、サードパーティ製のapiメソッドおよびapiファサードを呼び出します。

すなわち

interface IAPIEndpoint { 
    MyDomainDataEntity getData(); 
} 

class MyAPIEndpoint : IAPIEndpoint { 

    public MyDomainDataEntity getData() { 
     MyDomainDataEntity dataEntity = new MyDomainDataEntity(); 
     // Call the third party api and fill it 
     return dataEntity; 
    } 
} 

それは常に、あなたのアプリケーションドメインに侵入彼らのファンクを得ることはありませんし、必要に応じてあなたが入れ替えることができるように、サードパーティのAPIを行うインタフェースすることをお勧めします。異なるサービスを完全に使用する別のクラス実装を作成することができます。

は、それが進むべき道である複数の実装にまたがるとき、あなただけのインターフェイスに基づいて自分のものを作る

IAPIEndpoint endpoint = new MyAPIEndpoint(); // or get it specific to the lang you are using. 

を呼び出すコードでそれを使用します。それはTDDでもうまくいきますので、あなたのドメインコードをサードパーティのAPIから完全に分離して調べることができるローカルのテストにインターフェイスを入れ替えることができます。

+0

Ryan、ありがとうと思います。私は、私が理解できるかどうかを質問することができます:私はこのアプローチを使用し、インターフェイスを作成することができます - 私はサードパーティのAPIを呼び出すことができます別のインプラントで私はAPIのテストインプルを呼び出すことができますので、 。あれは正しいですか?私の関心事は、私はそれらを呼び出す必要があるときにAPIオブジェクトのメソッドを処理するつもりです(主に設定/取得しますが、いくつかのメソッドがあります)。 – JasonH

+0

イエスは共通点を見つけることは常に難しいです。はい、インターフェイスは、アプリケーションがすべての実装(インターフェイスを使用しているクラスまたはJavaの世界でインプリメント)で一貫して使用するものを記述します。私は、メインインターフェイスに「汎用化された」共通のメソッドだけを置く傾向があります。実装でこれらのメソッドで使用される特定のAPIメソッドは、実装のための特定のメソッドを実行できます。例えばここではマッチアップサーバがあり、FindMatch()、StartMatch()、CloseMatch()などのインタフェースを呼び出します。これらはインタフェースにあります。次に、ゲームセンターで... –

+0

そのクラスの実装では、GameCenterの呼び出しを使用して一致を取得し、一致を開始し、一致を閉じ、それらの呼び出しがGameCenter固有の方法をプライベートメソッドとして使用します。次に、ローカルに実行されるTest実装と、自己ホストされる別のマッチアップサーバを簡単に交換できます。だから私たちの3つのサードパーティーやユニークな使い方はすべて、汎用呼び出しのインターフェースで共通化されています。 HTHインターフェイスは、Webサービスサーバー/クライアントのセットアップでも非常に一般的です。すべてのコードがクライアント上になく、インターフェイスクラスとコンテナクラスのみが存在する必要があります。 –

0

抽象化。 DALを実装してください。これは、内部から外部への移行を提供します。

ベンダーを切り替えると、内部は貴重なままで、ベンダー固有のコードを変更することができます。ベンダが同じ機能性とデータタイプを提供していると仮定します。

0

私はここで黒い羊になり、YAGNIの原則を支持します。問題は、今すぐ抽象レイヤーを実行すると、サードパーティ製のAPIと似ていて、冗長レイヤーになるということです。将来の第2ベンダーのAPIがどのように見えるかわからないので、あなたは何を考慮する必要があるのか​​分かりません。将来のポートでは予期せぬ違いのためのリワークが必要になるでしょう。

テストフレームワークが必要な場合は、BPMベンダーと同じAPIを使用して独自のテスト実装を行うことをお勧めします。さらに、評判の良いほとんどのAPIプロバイダは、テストのために何らかのサンドボックスモードを提供しています。もしそうでなければ、あなたは1つを求めるべきです。

+0

Karl私はある程度同意します。しかし、ベンダーとアプリケーションの間に正式なレイヤーが存在しない限り、タイプとAPIのビヘイビアによるベンダの実装がさらに上流に面し始めるはずです。ベンダーを切り替えると、ベンダーの実装とどのように連携したのかが分かり始めます。抽象化レイヤーを使用すると、まずアプリケーションのニーズを考える必要があります。ベンダータイプとAPIの奇妙さを抽象化しています。 –

+0

クライアント側のコードを制限しようとしている2つの実装やWebサービスが必要な場合を除いて、私は通常これをしません。しかし、テストとTDDスタイルのために非常に便利です。この抽象化に関するクールなことは、ProductionThirdPartyAPI実装、テスト実装、およびテストDevelopmentThirdPartyAPIを持つことができるため、開発と本番のAPIレイヤーを交換することができます。それだけで価値があるかもしれません。 –

関連する問題