2016-09-14 62 views
0

我正在編寫一個圖形瀏覽程序,並且遇到了一點絆腳石。打開/關閉原則和單一責任 - 圖

My圖表由VertexNetworkLink對象,並且可以通過查詢一個GeographyModel對象obatined。

想法是List<NetworkLink>GeographyModel檢索,然後提供給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註冊本身GeographyModel,但擔心我會違反SRP。每個新的prgoram功能都可以擁有MetaMap並對其進行維護,但這首先需要查詢GeographyModel

任何想法,我可以如何處理這個?

+1

工程設計致死... – Holger

回答

1

爲什麼要實施OCP?你想解決什麼問題? 如果你只是因爲其他人認爲它很好才實施OCP,我強烈建議你三思。

SOLID/GRASP中的每個原則以及設計模式都是公會線和針對特定類型問題的解決方案。基本上他們是工具。你應該首先確定你的問題,並儘可能清楚地說明問題。他們你將能夠選擇正確的工具來處理它們。

盲目實施SOLID/GRASP或設計模式非常像用錘子烹飪食物。如果你足夠幸運,你可能會成功,但我們都知道這個概率很低。

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

請瀏覽到六百八十一分之一百二十五頁面(頂部欄上)並閱讀整個頁面!

+0

謝謝 - 這是有幫助的。我正在學習,第一段對我來說是頭疼的問題。 – swshaun