首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >开闭原理与单响应图

开闭原理与单响应图
EN

Stack Overflow用户
提问于 2016-09-14 18:07:25
回答 1查看 69关注 0票数 0

我正在编写一个图形探索程序,并遇到了一些绊脚石。

我的图形是由VertexNetworkLink对象组成的,可以通过查询GeographyModel对象来获取。

这个想法是从List<NetworkLink>中检索GeographyModel,然后提供给MetaMap以获得所需的附加信息。

我想做的是尝试并坚持开放/封闭原则,通过创建NetworkLink对象来添加每个MetaMap的信息,但是对于如何做到这一点,我已经有点恼火了!

下面是MetaMap的代码。

代码语言:javascript
复制
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派生出来的新的GeographyModel

我想遵循OCP和SRP,因为我增加了程序的功能,但是在实现/结合这两个概念时,我还是会有所保留。一些想法确实会发生..。

我可以得到每一个新的模型,需要一个MetaMapGeographyModel注册自己,但担心我会违反SRP。每个新的prgoram特性都可以拥有一个MetaMap并维护它,但这首先需要查询GeographyModel

有什么办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-20 02:02:36

为什么要实现OCP?你想解决什么问题?如果您实现OCP只是因为其他人认为它是好的,我强烈建议您三思而后行。

坚实/掌握的每一个原则,以及设计模式,都是一种非常具体的问题的指导方针和解决方案。基本上它们是工具。你应该先找出你的问题,尽可能清楚地说出来。他们,你将能够选择正确的工具来处理他们。

盲目地实施实心/掌握或设计模式就像用锤子煮食物一样。如果你够幸运的话,你可能会成功,但我们都知道可能性很小。

patterns.pdf

请浏览到125/681页(在顶部栏),并阅读整页!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39496957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档