ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

自己的溯源函数注意点

自己的溯源函数注意点 核心结论你说得完全正确就你当前「图层前缀统一过滤」这个场景完全没必要拆成两个独立委托参数、写两份一模一样的过滤代码。分开做两套参数属于过度设计。下面把底层逻辑拆开讲清楚1、什么时候适合分开两个委托pipeFilter / pointFilter只有一种场景值得分开管线、管点的过滤规则不一样。举几个现实例子拓扑回溯时管线要求前缀ws但是管点不受图层限制任何图层的节点都可以作为中转管线要校验XData管网类型管点只校验图层禁止穿过雨水管线但是雨水节点可以被选中不阻断路径。管线过滤有一个非常特殊的身份它同时承担「结果筛选」「链路阻断器」两个职责而原先代码里的管点过滤仅仅只是这个点要不要放进结果集合不能阻断遍历前进。这也是当初我分开两个参数的根本原因 —— 二者在回溯流程里作用位置、产生的影响完全不同即使过滤条件碰巧一样语义角色不一样。2、什么时候完全可以只用1个统一过滤函数当你的业务规则满足管线、管点使用完全一模一样的判断条件。这时你只需要传一个委托管线校验用它、管点校验也复用它一份即可。不需要新增第二个形参。3、还有一个很关键的语义区别最容易踩坑管线过滤 → 不满足 → continue链路切断上游不再往前走影响遍历路径 管点过滤 → 不满足 → continue只是这个点不加入结果但是遍历路径不受任何影响哪怕判断函数代码一模一样二者产生的后果不是一回事。举个例子链路 ysA‑ys管‑ws节点‑ys管‑ysB如果管线不过滤、只给管点加图层前缀过滤ws节点不会被加到结果但是队列仍然会穿过ws节点跑到另一边 ys‑B。如果管线过滤遇到ws管线直接停止整条路断掉。所以函数代码相同 ≠ 在回溯里产生的效果相同。4、给你最优的取舍思路方案A适合你现在图层前缀过滤只增加单个可选委托参数FuncObjectId,bool entityFilter管线判断时调用它收集管点的时候也调用同一个委托。一份逻辑两处复用。简洁够用没有冗余。方案B预留扩展面向未来复杂规则保留两个独立参数 pipeFilter / pointFilter。当前调用传同一个委托实例进去两份代码不用重复写以后哪天管线、管点过滤逻辑分叉了你不用再去改 TraceUpstream 的函数签名、到处修改调用代码。代价就是接口多了一个参数属于为未来功能预留的扩展设计。5、对你当前项目的建议现阶段图层前缀过滤选方案A单委托就足够不需要双参数。等到后面你出现管线限制条件 和 管点限制条件不一样的时候再拆分成两个独立过滤委托即可。如果你需要我后面可以给你改成单‑委托版本的回溯代码。
返回列表