结构化编程强调单一出口的原则,其目的在于增强函数流程的逻辑性。本身这个原则有些过于死板,但其保持代码逻辑性的目的是非常正确的。在面向对象设计,我们都知道要遵循单一职责原则(SRP),而函数也应遵循这一原则,以保证函数体逻辑的清晰并且高内聚。
以下示例中, UpdateValue 函数与下面 m_value 的赋值语句造成了逻辑的分散 :
当需要变更 m_value 的赋值逻辑时,往往会修改 UpdateValue 函数,而忽略了下面的赋值语句,这就会引起新的问题。顾此失彼嘛 !
这种情况在代码维护时最容易引入。我们解 Bug 时,如果只是头疼医头,脚疼医脚,就容易留下一个个补丁,而每个补丁就可能是一个个逻辑碎片。
这样的分散的逻辑会加重维护的成本和风险。为了减少这种风险,首先在设计时和解 Bug 时要努力保持逻辑的一致性。遇到问题,不是将问题掩盖起来,而是要实实在在的解决它。不要形成破窗,使得风险不断累积。请参考 << 如何有效地解 Bug (RED 方法 ) >>
在上图的例子中,应当尽量将下面的赋值语句移入
UpdateValue
函数中,这样将
UpdateValue
视为
m_value
的经纪人,统一管理
m_value
的值的设定。当然,也许
m_value
所依赖的条件可能分散于各处,这是可以提供较低层次的函数来形成
m_value
的赋值入口,比如
setValue(
…
)
。这就是
setter/getter
的概念了。
总之,当设计一个函数时就要明确它的职责,让相关的事务放到内部处理,而不是分散各处。当发现逻辑碎片产生时,应当及时加以清除,以免扩散到影响系统的维护。
转载请注明出处: http://blog.csdn.net/horkychen