如何优雅实现:仅特殊条件变更返回false,其余条件变更返回true
更优雅的实现方案
针对你遇到的重复设置shouldNotify的问题,这里有几种更简洁高效的实现方式,既满足需求又减少冗余代码:
方案一:封装辅助处理方法
把"检查变更+执行更新+返回是否变更"的逻辑封装成一个私有辅助方法,这样每个普通条件的处理可以简化为一行代码:
private bool HandleCondition(Func<bool> checkChanged, Action updateAction) { if (checkChanged()) { updateAction(); return true; } return false; } public bool Update() { bool shouldNotify = false; // 处理特殊条件,不影响通知标志 if (SpecialConditionChanged()) UpdateSpecialCondition(); // 普通条件处理,用 |= 累积变更状态 shouldNotify |= HandleCondition(Condition1Changed, UpdateCondition1); shouldNotify |= HandleCondition(Condition2Changed, UpdateCondition2); // ... 其他所有普通条件都按此格式添加 return shouldNotify; }
这种方式把重复的if判断和标志设置逻辑抽离出来,每个条件只需要一行代码完成处理,可读性和维护性都更强。
方案二:批量遍历条件集合
如果普通条件数量极多,可以把所有条件的检查、更新方法存入一个集合,通过遍历统一处理,新增条件只需在集合中添加项即可:
// 提前初始化条件集合(可以放在类的构造函数或字段初始化中) private readonly List<(Func<bool> CheckChanged, Action UpdateAction)> _normalConditions = new List<(Func<bool>, Action)> { (Condition1Changed, UpdateCondition1), (Condition2Changed, UpdateCondition2), // ... 其他所有普通条件 }; public bool Update() { // 处理特殊条件 if (SpecialConditionChanged()) UpdateSpecialCondition(); bool shouldNotify = false; // 遍历处理所有普通条件 foreach (var condition in _normalConditions) { if (condition.CheckChanged()) { condition.UpdateAction(); shouldNotify = true; } } return shouldNotify; }
这个方案的优势在于完全消除重复代码,后续新增条件不需要修改Update方法的核心逻辑,只需要在集合中添加新的条件对即可,扩展性极佳。
方案对比
你之前考虑的bool[]、计数器等方案本质还是重复处理每个条件,而上面的两种方案通过封装或批量处理,从根源上减少了冗余代码,同时保持逻辑清晰:
- 方案一更适合条件数量不多的场景,代码直观;
- 方案二更适合条件数量极多或经常新增条件的场景,维护成本更低。
两种方案都能严格满足需求:无变更或仅特殊条件变更时返回false,只要有任意普通条件变更就返回true。
内容的提问来源于stack exchange,提问作者Roger
相关产品推荐
相关产品推荐

