开放/封闭原则和单一职责——图表
Open / Closed Principle & Single Responsibilty -- Graphs
我正在编写一个图形探索程序,但遇到了一些障碍。
我的图表由Vertex
和NetworkLink
对象组成,可以通过查询GeographyModel
对象来获得。
想法是 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);
}
现在...我遇到的问题是,当我扩展程序时,每个新部分都需要一个新的 MetaMap
,它派生自 GeographyModel
。
我想遵循 OCP 和 SRP,因为我正在为程序添加功能,但在实现/结合这两个概念方面遇到了困难。确实出现了一些想法......
我可以让每个需要 MetaMap
的新模型在 GeographyModel
中注册自己,但担心我会违反 SRP。每个新的 prgoram 功能都可以拥有一个 MetaMap
并维护它,但这需要首先查询 GeographyModel
。
有什么办法可以解决这个问题吗?
您为什么要实施 OCP?你想解决什么问题?
如果你实施 OCP 只是因为其他人都认为它很好,我强烈建议你三思。
SOLID / GRASP 中的每条原则以及设计模式都是针对特定问题的指南和解决方案。基本上它们是工具。你应该首先确定你的问题,尽可能清楚地陈述它们。您将能够选择合适的工具来对付它们。
盲目实施 SOLID / GRASP 或设计模式就像使用锤子烹饪食物一样。如果你足够幸运,你可能会成功,但我们都知道概率很低。
请导航至第 125/681 页(在顶部栏中)并阅读整个页面!
我正在编写一个图形探索程序,但遇到了一些障碍。
我的图表由Vertex
和NetworkLink
对象组成,可以通过查询GeographyModel
对象来获得。
想法是 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);
}
现在...我遇到的问题是,当我扩展程序时,每个新部分都需要一个新的 MetaMap
,它派生自 GeographyModel
。
我想遵循 OCP 和 SRP,因为我正在为程序添加功能,但在实现/结合这两个概念方面遇到了困难。确实出现了一些想法......
我可以让每个需要 MetaMap
的新模型在 GeographyModel
中注册自己,但担心我会违反 SRP。每个新的 prgoram 功能都可以拥有一个 MetaMap
并维护它,但这需要首先查询 GeographyModel
。
有什么办法可以解决这个问题吗?
您为什么要实施 OCP?你想解决什么问题? 如果你实施 OCP 只是因为其他人都认为它很好,我强烈建议你三思。
SOLID / GRASP 中的每条原则以及设计模式都是针对特定问题的指南和解决方案。基本上它们是工具。你应该首先确定你的问题,尽可能清楚地陈述它们。您将能够选择合适的工具来对付它们。
盲目实施 SOLID / GRASP 或设计模式就像使用锤子烹饪食物一样。如果你足够幸运,你可能会成功,但我们都知道概率很低。
请导航至第 125/681 页(在顶部栏中)并阅读整个页面!