模块互连接口设计

时间:2017-08-26 21:13:31

标签: python python-2.7 design-patterns interface

我希望有一些简单的界面供用户连接一些预定义的模块(如果必须,我可以随意修改它们)。 每个模块都有一些命名的输入和输出。 一个模块可以连接到几个模块。 一些模块可以连接到单个模块。

到目前为止,这是我的想法: 选项1: 每个模块都有" in"和" out"输入和输出字典,连接通过以下代码进行:

a.out["out 1"].to(b.in["in 1"]) # connect a's "out 1" output to b's "in 1" input
a.out["out 2"].to(b.in["in 2"]) # connect a's "out 2" output to b's "in 2" input

但这看起来很乏味,所以我提出了选项2:

# connect a to b and c, then list which inputs connect to which outputs
a.to(b,{"out 1":"in 1",
        "out 2":"in 2"},
     c,{"out 4":"in 1",
        "out 3":"in 2"})

这似乎看起来更好,因为我更清楚哪些模块是连接的,并且它们的输出和输入之间的映射也清楚地列出。

我想知道是否有任何改善上述的空间,以清楚地表明:

  • 模块级连接,例如模块a连接到模块b
  • 输出和输入连接
  • 简洁明了的界面。简单来说,我的意思是减少打字; '明确'意思是容易理解。我明白,在这种情况下,有时候我不能同时拥有这两种情况,并且“清楚”。界面更可取。

我不熟练使用Python(2.7),因此可能会有一些我不知道的语法或操作符或数据结构,但我可以为此目的利用它。

1 个答案:

答案 0 :(得分:0)

我遇到了这个问题,即能够线性清晰描述有向图的问题。没有人特别愉快......就我个人而言,我相信显示源和汇(节点输入和输出)如何连接比显示哪些节点连接更重要,因为这种关系更具体。

在你列出的两个设计中,我会推荐第一个,因为它更清晰。它精确显示每个输入和输出的连接方式。但是,我会略微增加您的实现。我会使节点类能够为对象中的实际属性的输入和输出创建新句柄。然后在描述图形和捕获流量等时使用这些句柄。使输入和输出实际对象而不是标签意味着构造时间检查和生成更好的错误消息的能力。例如:

b = Node()
b.input("in1", "in2")  # this creates a new input object that is located in 'b' with the attribute name of the given string
b.output("out1")  # this could be in the constructor
c = Node(in=["in1", "in2"], out=["out1"])  # like so

# describe the connections
a.out1.to(b.in1)
a.out2.to(b.in2)
a.out3.to(c.in2)
a.out4.to(c.in1)
# maybe syntax like 'a.out3 >> c.in2' would be prettier?

module_graph_output = c.out1.capture()
# do stuff with the graph output

此外,模块定义可以在用户实现模块逻辑时为这些输出和输入对象处理程序传递。

除此之外,您将如何运行模块图表是一个更大的问题。如果我没有入侵,那么它的应用是什么?