そのため、アプリケーションが公開するこの公開 API を使用して、顧客がプラグインを作成できるようにしています。この例のために、次のような非常に単純なキーと値のペア システムであるとしましょう。
public interface Key {
// marker interface, guaranteed unique in some scope
}
public interface KVPService {
Set<Key> getKeys();
Object getValue(Key k); // must be a key provided by getKeys() or it blows up
}
Key
ここで、公開してはならないいくつかの属性 (データベース ID など) が内部的にあるとしましょう。私が現在行っていることは、次のようなものです。
/** Internal impl of external Key */
class InternalKey implements Key {
int getDatabaseId() {
// do something...
}
}
/** Internal impl of external KVPService */
class InternalKVPService implements KVPService {
// ...
public Object getValue(Key k) {
InternalKey ik = (InternalKey) k;
return getValueFromDBOrWherever(ik.getDatabaseId());
}
// ...
}
これは理想的とは言えません。責任を再配置してキャストを回避し、内部/外部カプセル化を維持する方法はありますか?
現実の世界では、これよりもかなり複雑であることに注意してください。同等のKey
ものにはかなりのメタデータが添付されており、誰かが単純な値を取得する以外にやりたいことがたくさんあるので、Map.Entry
代わりに - のようなオブジェクトを公開するだけでは、必ずしも問題が解決するとは限りません。
私が思いついた唯一のことは、内部キーと外部キーを完全に分離し、Map<Key, InternalKey>
. しかし、その場合、DRY に違反するメタデータをコピーするか、DRY に違反する への外部Key
委任を行う必要がInternalKey
ありMap
ます。
誰かもっと賢いものを考えられますか?