私はグラフ・エクスプローラ・プログラムをコーディングしています。オープン/クローズド・プリンシプル&シングル・レスポンス - グラフ
私のグラフは、オブジェクトがVertex
とNetworkLink
で構成されており、GeographyModel
オブジェクトを照会することで調べることができます。
GeographyModel
からアイデアがList<NetworkLink>
が取得され、次にMetaMap
に供給され、必要な追加情報が得られます。私が何をしたいか
がしようとMetaMap
オブジェクトを作成することにより、情報の各NetworkLink
を追加することにより、開放/閉鎖原則に準拠しているが、ややこれを行う方法のようねじれの私の半ズボンを持っています!
は以下MetaMap
ためのコードです。
public class MetaMap<T> {
private final String name;
private final Map<NetworkLink, List<T>> metaData;
private final Map<T, Set<NetworkLink>> reverseLookup;
private final List<T> fallback;
private final List<T> information;
public MetaMap(String name, T fallback){
this.name = name;
this.metaData = new HashMap<>();
this.reverseLookup = new HashMap<>();
this.fallback = new ArrayList<>();
this.fallback.add(fallback);
this.information = new ArrayList<>();
}
/**
* Returns an identifier giving the information contained in this map
*
* @return
*/
public String getName() {
return name;
}
/**
* Marks from origin to destination with information of type T
*
* @param line
* @param information
*/
public void markLineFragment(RunningLine line, T information) {
line.getLinks().stream().map((link) -> {
if(!metaData.containsKey(link)) {
metaData.put(link, new ArrayList<>());
}
return link;
}).forEach((link) -> {
metaData.get(link).add(information);
});
if(!reverseLookup.containsKey(information)) {
reverseLookup.put(information, new HashSet<>());
}
reverseLookup.get(information).addAll(line.getLinks());
}
/**
* Returns the information on the given NetworkLink
*
* @param link
* @return
*/
public List<T> getInformation(NetworkLink link) {
return metaData.getOrDefault(link, fallback);
}
/**
* Returns the information associated with the given line fragment
* @param line
* @return
*/
public List<T> getInformation(RunningLine line) {
Set<T> resultSet = new HashSet();
line.getLinks().stream().forEach((link) -> {
List<T> result = getInformation(link);
resultSet.addAll(result);
});
return new ArrayList<>(resultSet);
}
/**
* Returns all of the matching links which match the given information
* @param information
* @return
*/
public List<NetworkLink> getMatchingLinks(T information) {
return new ArrayList<>(reverseLookup.get(information));
}
public void addInformation(T info) {
information.add(info);
}
public void removeInformation(T info) {
information.remove(info);
}
今...私が持っている問題は、私はプログラムを展開すると、それぞれの新しい部分がGeographyModel
から派生した新しいMetaMap
が必要になるということです。
私は能力にプログラムを追加していてOCPとSRPに従いますが、二つの概念を組み合わせる/実装のよう立ち往生のタッチを取得したいです。いくつかの考えが発生します...
で自分自身を登録するにはMetaMap
を登録する必要がありますが、新しいモデルを入手することはできますが、私はSRPに違反する恐れがあります。それぞれの新しいprgoram機能はMetaMap
を所有し、維持することができますが、最初はGeographyModel
を照会する必要があります。
私はこれにどのようにアプローチできますか?
死に至るように設計されたプロジェクト... – Holger