【发布时间】:2012-12-26 05:13:23
【问题描述】:
我要写一个event correlator。系统的一个基本部分将是一个巨大的决策树,它根据记录的状态和日志文件识别故障的起源,其中一个主要问题是保持该树的可维护性 - 以程序员易于理解和可编辑的格式编写.
由于 7 层深嵌套 if()s 不是我的“可维护且易于理解”的想法,我 asked 想知道如何以一种在机器友好之间的良好中间立场的形式来表示它,用户友好且具有成本效益。显而易见的答案是使用可编译为 C++ 的特定领域语言,其中将编写实际的事件相关器。显而易见的问题是 DSL 应该是什么样子。
我最喜欢的建议是使用 UML 活动图,并将其编译为 C++。该图可能几乎完全由决策组成,活动仅在树的叶子上,作为决策过程得出的结论。本质上,该图是我的图形 DSL,然后应该在 C++ 中编译成一大堆 if()。虽然我仍然需要手工制作所有条件函数,但至少条件之间的互连应该由系统处理。
现在,我应该使用什么工具来创建该图表?
由于“自己动手”不是我对成本效益的想法,考虑到它最终是为一台设备创建一个单一的图表(即使它可能会被永远编辑,因为发现了新的故障模式) ,我看了一下List of Unified Modeling Language tools。
其中不少,包括在“生成的语言”中列出了“C++”的那些,但我知道现实从来没有那么好——我对一堆预先填充了类定义的头文件不感兴趣根据类图。我需要一个包含我的决策树的文件;一堆条件语句,其中条件预先填充了决策函数调用,我将手动编写这些语句,并将结果作为特定的结论函数调用。
现在我的问题是,哪些工具可以做到这一点,使用起来不会太难,而且价格也不贵 - 首选免费工具,但价格合理的商业工具也可以。
或者,如果失败了 - 哪些可以将该图表保存为我可以使用自制“编译器”解析的形式,以及如何创建该编译器。
当然也欢迎其他建议 - 也许是可以生成此类代码的老式流程图的工具?也许已经有专门的 DSL 来创建我需要的东西了?
【问题讨论】:
-
也许我不太了解您的解决方案,但听起来您正试图在 UML 中直接将决策树编码为 tree。我认为你最好为每个单独的事件写下一个事件序列 E1 E2 ... EN -> T;然后这些检查很简单,因为它们是完全独立的,插入(只需添加一个)或删除也很简单。这组序列可以很容易地组合成一棵树,以寻找事件链的公共前缀。现在您甚至不需要像 UML 这样的重量级引擎;一个带有命名事件的非常简单的 DSL 就足够了。
-
@IraBaxter:如果生成的代码是这样的序列,我真的不介意。当然,它的效率会低得多,因为需要多次评估许多条件(......除非我创建一个缓存包装器) - 并且其中许多条件计算起来非常昂贵(数据库查找等)。请参阅 programmers.stackexchange.com/questions/182025/… 以获取要创建的一小部分树的示例。
-
@IraBaxter:至于在用户级别这样做,使“E1”、“E2”等描述性名称(易于理解以便于修改!)将很快使其演变成多个-line 条件字符串...如果需要增加顶部分支之一中的决策,我将不得不编辑数十个作为该决策的子节点的叶子。
-
好的,所以你得到了一个权衡:通过对单个事件序列的规范来完全分离关注点,这样你就不必同时考虑其中的两个,或者在早期事件常见更改的情况下易于修改.如果您在低端有许多序列的决定,那么无论如何您都必须编辑“数十片叶子”,因此不清楚您的树计划是否真的能买到很多东西。这些真的是纯序列事件吗?或者以某种部分顺序的事件组合,以及某些条件集(A在B之前,A在C之前,系统处于状态E)?
-
@IraBaxter:我绝对更喜欢一起思考这些事件。这项工作通常具有调查性质——通过收集线索来缩小范围。几乎从来没有“什么不同的症状和条件可以表明模块时钟出现故障”,几乎总是“模块抱怨它没有及时收到新数据,现在大约 6 种不同的原因中的哪一种导致了这种故障? "然后历史分析表明数据是按时发送的,并且模块确认收到了,所以不到一秒后的抱怨是毫无根据的,意味着它的时钟有问题。
标签: c++ uml code-generation dsl