【发布时间】:2014-07-08 01:27:28
【问题描述】:
这个问题包含一些数学概念,但它们与问题的实质无关。
我正在实现一个用于研究图形自动机的 API。我有一个名为 AutomataGraph 的抽象类,它由我感兴趣的不同类型的 AutomataGraph 继承。每种类型对于它如何通过其状态进行处理都有不同的规则。对于每种类型,我都有一个从 AutomataGraphBuilder 继承的构建器/工厂类,用于使用图形/自动机做不同的有趣事情。其中一件事是生成所有具有 n 个节点的未标记图。在 AutomaGraphBuilder 类中,此方法如下所示:
AutomataGraphBuilder.prototype.genAllUnlabeledGraphs = function(n){
var graphs = [];
var graph;
for(all possible graphs){
graph = new AutomataGraph();
if (should add graph) {
graphs.push(graph);
}
}
return graphs;
}
这很好用,除非我想将此调用扩展到 JohnConwayAutomataGraphBuilder,我必须复制所有代码才能将“graph = new AutomataGraph()”行更改为“graph = new JohnConwayAutomataGraph()”。
有什么建议吗?我更感兴趣的是寻找一些一般的结构见解,而不是这是 javascript。
编辑:伪代码当然与实际算法有很大不同,只是为了证明存在过多的代码复制。
【问题讨论】:
-
唯一的代码是否总是改变为每个具体工厂创建的
AutomataGraph的类型?论点 (args) 来自哪里?它们是硬编码的吗?它们总是一样的吗? -
实际上没有传递任何参数;那是个错误。唯一改变的是类型。
-
看来你的工厂也太多了。它应该只知道如何实例化
AutomataGraph,其余的不应该是它的关注点。另一个对象可能负责genAllUnlabeledGraphs并依赖注入的工厂来创建AutomataGraph实例。 -
@plalx:我想这只是糟糕的命名约定,OP
AutomataGraphBuilder似乎没有构建AutomataGraphs的目的。 -
您能提出替代方案吗?
标签: javascript oop inheritance structure factory