3

像 Alexander Stepanov 和 Sean Parent 这样的人投票赞成采用正式和抽象的软件设计方法。
这个想法是将复杂系统分解为有向无环图,并在表示该行为的节点中隐藏循环行为。
Parent 在 boost-con 和 google 上做了演示(来自 boost-con 的表格,第 24 页介绍了这种方法,还有一段google talk 的视频)。

虽然我喜欢这种方法并认为它是一种必要的发展,但我在想象如何处理具有无定形行为的子系统时遇到了问题。
例如,想象一个状态机的通用模式:使用所有状态都支持的接口,并在状态的具体实现中具有不同的行为。

一个人将如何解决这个问题?
请注意,我只是在寻找一种抽象的方法。

我可以考虑将该行为隐藏在节点后面并为状态定义不同的子 DAG,但是如果您想从子 DAG 影响主 DAG 的行为,这会使设计变得相当复杂。

4

1 回答 1

1

你的问题不清楚。定义无定形子系统

您“只是在寻找一种抽象方法”,但是您似乎想要有关传统编程语言中的实现的详细信息(“状态机的通用模式”)。那么,你要什么?如何实现嵌套的有限状态机?

更多细节将有助于对话。

对于真正的抽象方法,请查看Stream X-Machines 之类的东西:

... X 机器模型在结构上与有限状态机相同,只是用于标记机器转换的符号表示 X→X 类型的关系。...

Stream X-Machine与 Eilenberg 模型的不同之处在于基本数据类型

X = Out* × Mem × In*,

其中 In* 是输入序列,Out* 是输出序列,Mem 是(其余的)内存。

该模型的优点是它允许系统通过其状态和转换一次一步地被驱动,同时观察每一步的输出。这些是见证值,可保证在每个步骤中执行特定的功能。因此,复杂的软件系统可以分解为Stream X-Machines 的层次结构,以自上而下的方式设计并以自下而上的方式进行测试。这种分而治之的设计和测试方法得到了 Florentin Ipate 正确集成证明的支持,该证明证明了独立测试分层机器如何等同于测试组合系统。...

但我看不出演示文稿与此有什么关系。他似乎在谈论一种非常主流的编程方法,与 X-Machines 完全不同。无论如何,演示文稿很混乱,我现在没有时间看视频。

演讲的第一印象,只看幻灯片

作者随意地触及了许多领域/问题/解决方案,显然没有意识到:从人件(例如编程心理学)到软件工程(例如软件产品线),再到各种编程技术。

各个部分是如何联系起来的,他到底在倡导什么,根本不清楚(我习惯于只阅读幻灯片,它们通常是必然的):

  • 数据流编程
  • 用户界面的约束求解?有关实际实现,请参阅用于 Common Lisp 的Garnet ,用于 C++ 的Amulet / OpenAmulet 。
  • 对于众所周知的方法(例如,基于Hoare 逻辑前置/后置条件和不变量的工具,或者更好的是 Hoare 的通信顺序过程 (CSP)或 Hehner的实用理论的编程语言或具有复杂类型系统(如ATSQiEpigram等)的某种编程语言?在我看来,引入“概念”——原样是特定于 C++ 的——并不比使用替代品更简单。它只是关于行话和“政治”吗?(最后是正式的方法......但伪装)。
  • 为什么将程序模块组织为 DAG 而不是树,就像几十年前 David Parnas 在设计易于扩展和收缩的软件中提倡的那样?(此处是可直接访问的 .pdf 文件,此处是讲座中的幻灯片)。X-Machines 上的工作可能是对这个问题的回答(甚至超越了 DAG),但是,作者似乎再次谈到了一种非常传统的程序开发制度,其中 Parnas 的方法是唯一明智的。

如果/何时我会看到视频,我会更新这个答案。

于 2009-10-21T05:45:53.463 回答