上

上面图是在网络截取的,问题应用场景未知,但个人理解就是一个多条件“选择”问题。
类似图中的程序,看似控制逻辑不一致地复杂,如果每一行作为一个控制“点”或者“段”,这里用“点”不太合适,应该使用另一个数学名词“区间”。都说“科学的尽头是玄学”,而我一直认为“技术的尽头是数学”,尤其是工科类技术,所以这里使用“区间”是最恰当的,既然是区间,就有闭区间、开区间、半开半闭区间等不同,数学形式就是:
[端点1,端点2],//闭区间
(端点1,端点2),//开区间
(端点1,端点2],//左开右闭区间
[端点1,端点2),//左闭右开区间
对应图中的程序,大于等于指令和小于等于指令即相当于区间中包含端点的闭区间,大于和小于指令即相当于区间中不包含端点的开区间。
那么,不同的区间就是对应不同的控制逻辑,到此,我们就可以抽象出共性,把复杂度降低了,把问题简单化了,也就可以写出通用算法代码了,那么如何选择是哪种区间算法以便让其受控呢,一个case语句就解决了,不过是加入一个“sectionMode”参数,而这个参数完全可以放在数据结构中,到现在为止,算法算是基本完成,剩下的就是对数据结构的查找索引利用等操作了;书归正传,我们回到数据结构,当然首选还是数组,这里有个小问题,端点数量问题,如图中所示,有的程序行是两个端点,有的行是一个端点,我们完全可以不用太计较,完全可以在数据结构中解决,这也符合将复杂度放进数据结构的设计理念,每个端点数据类型typePoint应该包括:
limitValue;//端点值
mode;//端点区间模式:闭区间/开区间
每个端点的设计完成了,现在对图中的每一行进行设计数据类型,有的行有两个端点,有的行有一个端点,为了兼容性,每个区间包含两个端点,哪怕有一个不用,只是为了保持形式一致性,当然也可以设计两个段数据类型,一个包含两个端点,一个包含一个端点,这里我们仅设计包含两个端点的段数据类型,故有设计typeSection如下:
pointTotal:int;//端点个数
point1:typePoint;
point2:typePoint;
然后,总体数据结构采用数组array[*]of typeSection。至此,基础的数据结构设计工作全部完成,剩下的就是对数据结构的操作了,也就是一个固定算法了,最重要的是要支持变化,支持区间数量多少的变化。
写了一个“通例”FC,与固定代码行数的“特例”程序比较,仅仅是不同应用需求场景下不同的解决方式,不涉优劣之争。如有不同看法,欢迎探讨。



文章原来在WX公众号发过,论坛搞活动,就来凑个热闹。
有朋友提及使用LAD编写有限数量的程序,在监控时是相当方便的,对此,我是持保留意见的,一个成熟的块是不需要对其内部代码进行监控的,只关注其接口即可。
FC_BatchMapping_V1.0.0.rar