どちらのデザインオプションは符号化フレームワークで使用することが良いですか?
-
20-08-2019 - |
質問
私は実装するためのクライアントのためのインタフェースのセットを提供しますここで私は(Javaで、しかし問題は、汎用である)フレームワークをコーディングしています。フレームワーク内の機能は、実装クラスがconstructuedされる方法に依存するつもりであることである、持ち運びにくいは、インターフェイスの他のインスタンスを提供するために、それらの実装に依存します。
私が持っているかもしれませんたとえばます:
Interface IContribution {
public IMyStuff getMyStuff();
public IHelper getHelper();
}
Interface IMyStuff {
public void doSomeMethod(IHelper helper);
}
私はIMyStuffとIHelperのそれらのインスタンスが使用可能であることを確認する方法を教えてください。
一つの方法は、苦労して、ヌルオブジェクトをチェックインタフェースで、私の枠組みの中で「ゲッター」メソッドを作成することです戻っています。
別のオプションは、インターフェイスのメソッドを実装する(Strategyパターンを使用して)を呼び出し、工場を実装する抽象クラスを作成することです。しかし、これは私が最初の場所でのインタフェースを持っているという事実を覆します。クライアントは、抽象クラスを使用する必要があります。しかし、彼らはインターフェースの代わりに、抽象クラスを使用することによって、これを回避することができます。したがって、私はインターフェイスだけ抽象クラスを提供してはならない...
だから、この上のあなたのアイデアが何であるか、これまで実用的なアプローチは何ですか?
解決
私はIMyStuffとIHelperのそれらのインスタンスが使用可能であることを確認する方法を教えてください。
クライアントが自分自身をインタフェースとクラスを実装するための責任がある場合、私はそれがそれらのインスタンスが利用可能であることを確認するために、自分の責任だと言うだろう - 。私は自分のコードでそれを置くことで自分に関係ないでしょう。
他のヒント
良い枠組みを構築するためには、同時に、それを中心にアプリケーションを構築する必要があります。その方法は、あなたが知っている、それが彼らの上に押しつけている前に、あなたのクライアントが耐える痛みを理解します。
言い換えれば、で始まる:私のクライアントは、このアプリケーションでどのように動作しますか?彼らはどのようにそれを使用する必要があるのですか?
あなたはすぐに最も簡単な方法は、彼らの視点から、最善のことを行っていることを実感します。
あなたは一人のインタフェースでそれを保証することはできませんが、そこには行動ます。
私は、開発者がミスを避けるため、Frameworkの防御的プログラミングの哲学に同意します。
あなたはファクトリオブジェクトを供給することができます:
public class MyPoliceman {
public IContribution makeContributor( IMyStuff stuffer, IHelper helper)
throws BadAssociatesException {
// check validity of stuffer and helper here, throw exceptions if null
}
}
次に、少なくとも我々はヌルのためなどを確認することができます。
一部では、それが開発者に助けを与えることは通常可能です思いました。いくつかのケースでは、あなたができる最善のは、トラップエラーにあるとcraefullyそれらを報告します。ここでは例えば、完全に罰金IHelperは、あなたの工場に渡すことができますが、クラスの後の行動は、それができないレンダリング可能性があります。 (例えば画像には、ファイルがあって、副作用がそれ以降のファイルを閉じた。)そして、あなたがすることができるすべてはトラップがどこかにエラーを記録し、(おそらく)例外をスローし、その結果エラー状態です。そして、少なくとも開発者が修正するかについての手掛かりを持っています。