开放/封闭原则和单一职责——图表

Posted

技术标签:

【中文标题】开放/封闭原则和单一职责——图表【英文标题】:Open / Closed Principle & Single Responsibilty -- Graphs 【发布时间】:2016-09-14 18:07:25 【问题描述】:

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

我的图表由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);

现在...我遇到的问题是,当我扩展程序时,每个新部分都需要一个新的 MetaMap,它派生自 GeographyModel

在我为程序添加功能时,我想遵循 OCP 和 SRP,但在实现/结合这两个概念时会遇到困难。确实发生了一些想法......

我可以让每个需要MetaMap 的新模型在GeographyModel 中注册,但我担心我会违反 SRP。每个新的 prgoram 功能都可以拥有一个 MetaMap 并对其进行维护,但这首先需要查询 GeographyModel

有什么想法可以解决这个问题吗?

【问题讨论】:

项目被设计致死…… 【参考方案1】:

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

SOLID / GRASP 中的每个原则以及设计模式都是针对特定类型问题的指导方针和解决方案。基本上它们是工具。您应该首先确定您的问题,并尽可能清楚地说明它们。他们将能够选择正确的工具来处理它们。

盲目地实施 SOLID / GRASP 或设计模式很像用锤子做饭。如果你足够幸运,你可能会成功,但我们都知道概率非常低。

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

请导航到第 125/681 页(在顶部栏)并阅读整个页面!

【讨论】:

谢谢——这很有帮助。我正在学习,第一段对我来说是一针见血。

以上是关于开放/封闭原则和单一职责——图表的主要内容,如果未能解决你的问题,请参考以下文章

[Python设计模式] 第3~5章 单一职责原则/开放-封闭原则/依赖倒转原则

Java设计模式6大原则

编码最佳实践——单一职责原则

设计模式原则

面向对象原则之一 开放封闭原则(开闭原则)

设计模式 - 6大原则