2016-09-14 5 views
0

私はグラフ・エクスプローラ・プログラムをコーディングしています。オープン/クローズド・プリンシプル&シングル・レスポンス - グラフ

私のグラフは、オブジェクトがVertexNetworkLinkで構成されており、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を照会する必要があります。

私はこれにどのようにアプローチできますか?

+1

死に至るように設計されたプロジェクト... – Holger

答えて

1

なぜOCPを実装したいですか?どのような問題を解決しようとしていますか? OCPだけを実装した人は誰もがそれが良いと思ったので、私はあなたが2度考えることを強くお勧めします。 SOLID/GRASPで

各原則だけでなく、デザインパターンは、問題の非常に特定の種類のギルドラインとソリューションです。基本的にはツールです。まず問題を特定し、可能な限り明確に記述する必要があります。あなたは彼らに対処するための適切なツールを選ぶことができます。盲目的SOLID/GRASPやデザインパターンを実装する

は多くの食べ物を調理するためにハンマーを使用してのようなものです。十分に幸運だったなら、成功するかもしれませんが、確率は非常に低いことがわかります。

https://www.u-cursos.cl/usuario/777719ab2ddbbdb16d99df29431d3036/mi_blog/r/head_first_design_patterns.pdf

(トップバー上の)ページ681分の125に移動して、ページ全体を読んでください!

+0

ありがとう - これは参考になります。私は学んでいる、そして最初のパラグラフは私の頭の上の釘を打つ。 – swshaun

関連する問題