2012-05-13 6 views
3

私は私のシステムが依存するインターフェイス定義されています:異なるパッケージにインターフェイスを実装する具象クラスのセットを正しく整理するにはどうすればよいですか?

IMethodCall 

を、私はIMethodCallを実装するクラスの束を作成しました:彼らは実装の詳細です

AbstractMethodCall 
ConstructorCall 
TargetConstructorCall 
VoidMethodCall 
TargetVoidMethodCall 
NonVoidMethodCall 
TargetNonVoidMethodCall 

、そして私のシステムのdoesn彼らについて知りません(少なくとも、知る必要はありません)。

当時のデータセットに基づいて、どのインプリメンテーションをインスタンス化するかを選択するのは面倒なロジックがあります。そのため、すべてのロジックを単一の場所にグループ化するためのファクトリを作成することにしました。

MethodCallFactory 

私は、ここで使用されているパッケージ構造が何であるべきかを理解しようとしています。私の最初のアイデアは、すべての具体的なクラスをmethodCallsパッケージに入れて、パッケージ保護されたクラスに設定することだったので、誰もその存在を知ることはできませんでした。その後、私はIMethodCallMethodCallFactoryを外部に入れて、私のシステムのユーザーが使用できるようにしました。問題は、具体的なクラスをパッケージ保護されたものとして置くと、ファクトリはパッケージに入っていなければならないということです。外部のビューアではパッケージが含まれているだけです工場。

現時点では、具体的なクラスを公開することが最善のトレードオフですが、私は皆さんがどのようにこのような状況に対処しているのだろうかと思います。

+0

公開しても問題ありませんか? – Jeffrey

+0

パブリックにすることの害は、ファクトリを使用する本質的な性質によって、直接的にアクセスできるということです。 – nrobey

答えて

0

パブリッククラスとインターフェイスをパブリックパッケージに配置し、実装されたクラスを内部パッケージに入れることができます。

内部パッケージはお勧めできません。内部パッケージのクラスはいつでも変更できます。ユーザーはパブリックパッケージ内のAPIを呼び出す必要があります。例えば

公共のパッケージがあるorg.feeling.ui.dialogs

内部パッケージがあるorg.feeling.internal.ui.dailogs私はこのような状況に直面しています

+0

Javaは、これらの間の差別化を強制しません。コンパイラが実装の特権を強制するようにしたい場合、このアプローチはうまくいきません。 – nrobey

2

私は、具体的な実装クラスとファクトリを同じパッケージに入れ、実装クラスをprivateパッケージにします。

あなたは、外部の観点から、このアプローチは奇妙に思われると述べました。私は、外部のユーザが実装クラスがあることを知らないという意見はありません。ほとんどのIDEでは、アクセスできない場合でもパッケージ内のクラスを表示します。また、プログラマが実装クラスを使用しようとすると、コンパイラはアクセスを許可しない間にそのクラスが存在することを暗示します。

私はまた、工場だけを含むパッケージを持っているのは奇妙で、それは私的な実装です。このクラスのグループは密接に関連しているため、1つの場所にグループ化することは論理的です。

関連する問題