![]() |
1
13
听起来你想要的是 'Finite State Machine' 在这些情况下,您可以激活不同的进程或“状态”。在C语言中,这通常是通过函数指针的数组(矩阵)来完成的。 因此,您基本上创建一个数组,并将正确的函数指针放在正确的指示符上,然后使用“var”作为右“process”的索引,然后调用它。在大多数语言中都可以这样做。这样,机器的不同输入激活不同的过程,并使其进入不同的状态。这对于许多应用程序都非常有用;我自己在MCU开发中一直使用它。 编辑:瓦利亚指出,我可能应该展示一个基本模型:
|
![]() |
2
5
这个问题没有很好的答案:-(因为这么多的反应取决于
tokenmacguy明智地询问目标。我花了点时间在法国网站上查看了这个问题及其回复,但我仍然对目标感到困惑……dran dane的最新回应似乎指向减少代码数量/提高可读性,但让我们回顾一下:
简而言之,我的建议
关于提高代码的可读性
(并且写得更快)是法语站点上描述的表/矩阵方法。
该解决方案分为两部分:
以及在需要调用函数的地方调用的相对简单的代码片段:
可能引发一个 不是 使用上述解决方案是 如果组合空间相对稀疏 (开关“树”中的许多“分支”未使用)或 如果某些函数需要一组不同的参数 对于这两种情况,我想插上 乔尔·古德温首先提出了一个解决方案 ,基本上将多个级别的各个键组合成一个较长的键(如果需要,还可以使用分隔符)。 将问题扁平化为一个长的、但只有一个级别的switch语句 . 现在。。。真正的讨论应该是 为什么我们首先需要这样一个映射/决策树 . 不幸的是,要回答这个问题,需要了解底层应用程序的真实性质。当然,我不是说这意味着设计不好。在某些应用中,大的调度部分可能是有意义的。然而,即使使用C语言(法国网站的贡献者似乎不适合面向对象的设计),也有可能采用面向对象的方法和模式。不管怎样,我在转移…)有可能整个应用程序会更好地服务于替代设计模式,其中“关于何时调用的信息树”已经分布在多个模块和/或多个对象中。 很抱歉用相当抽象的术语谈论这个问题,这只是缺乏应用程序的细节…重点仍然是:挑战我们需要这个大的调度树的想法;考虑应用程序的其他方法。 再见,波恩,机会!;-) |
![]() |
3
4
根据语言的不同,有些形式的哈希映射与
|
![]() |
4
1
函数指针的想法可能是最好的(根据mjv,shhnap)。但是,如果每种情况下的代码都相当小,那么它可能会被过度杀戮,导致比预期更多的混淆。在这种情况下,我可能会实现一些快速易读的东西,比如:
不熟悉您的特定场景,因此前面的建议可能更合适。 |
![]() |
5
1
我曾经遇到过同样的问题,尽管对于一个5参数嵌套开关的内在混乱。我想,为什么要输入这些O(N) 五 )如果编译器可以为我这样做,为什么还要发明“嵌套”函数名呢?所有这些导致了一个“嵌套的专用模板开关”,引用了一个“专用模板数据库”。 写起来有点复杂。但我发现它是值得的:它产生了一个“知识”数据库 非常 易于维护、调试、添加等。我必须承认:一种自豪感。
一些用于切换的变量类型:
知识库的“正向声明”:嵌套开关的“api”。
实际开关逻辑(浓缩)
以及知识库本身
这就是它的使用方法。
|
![]() |
6
1
是的,这两种方法都很简单 更快 和 简单的 . 这个想法与亚历克斯·马泰利提出的基本相同。不要将问题视为二维问题,而是将其视为一维查找表。 它意味着组合var、subbar、subsubvar等以获得一个唯一的键,并将其用作查找表的入口点。 这取决于使用的语言。使用python结合var、subbar等来构建元组,并将其用作字典中的键就足够了。 使用C或类似的方法,通常可以更简单地将每个键转换为枚举,然后使用逻辑运算符组合它们,得到一个可以在开关中使用的数字(这也是使用开关而不是使用串与级联IFS进行比较的简单方法)。你也会得到另一个好处。通常,在初始开关的不同分支中的几个处理是相同的。从最初的形式来看,很难把这一点弄清楚。您可能会对相同的函数进行一些调用,但它在代码中位于不同的点。现在,您可以在编写开关时对相同的情况进行分组。 我在生产代码中多次使用这种转换,而且很容易操作和维护。 总之,你可以得到这样的东西…混合函数显然取决于您的应用程序细节。
|
![]() |
7
0
也许您想要的是代码生成?
当然,这很难理解,您可能真的想要一种更好的模板语言来完成您的脏工作,但这将减轻您的任务的某些部分。 |
![]() |
8
0
如果C++是一种选择,我会尝试使用虚拟函数,或者可能双调度。这可以使它更干净。但只有当你有更多的病例时,它才有可能得到回报。 这个 article on DDJ.com 可能是个不错的入口。 |
![]() |
9
0
如果您只是想消除两级switch/case语句(并节省一些垂直空间),可以将两个变量值编码为单个值,然后打开它:
|
![]() |
10
0
如果您的语言是C,并且您的选择足够短,并且不包含特殊字符,那么您可以使用反射,只需几行代码就可以完成。这样,不用手工创建和维护函数指针数组,而是使用框架提供的一个! 这样地:
|
![]() |
11
0
解决方案 developpez.com 是的,你可以优化它,让它更干净。你不能用这样的“链条” 责任”与工厂:
然后,正如您的流程使用canxxx实现接口流程一样,您可以轻松使用:
|
![]() |
ZenBa2 · getopt未更改值C 2 年前 |
![]() |
Waeez · 条件未满足php仍在运行 7 年前 |
![]() |
Catz · 正在尝试打印正确数量的“*”以代替数值 7 年前 |
|
privilegedMale · switch语句中的扫描仪问题 7 年前 |
![]() |
rasilvap · 具有多个参数的开关箱 7 年前 |
![]() |
RudziankoÅ · 不可能的类型切换情况:不能有动态类型 7 年前 |
![]() |
Leo Thomas · 循环case语句而不退出shell脚本 7 年前 |