C语言特性变更,如何让我的防御不再是马奇诺防线?
摘要:马奇诺防线 马奇诺防线是法国在1930年代修建的一道大型防御工事系统。防线由复杂的地下工事网络组成,包括炮台、掩体、地下兵营、弹药库和指挥所等设施,有些地下工事深达数十米。 然而,在1940年的法国战役中,它并未发挥预期作用,德军绕过马奇诺
马奇诺防线
马奇诺防线是法国在1930年代修建的一道大型防御工事系统。防线由复杂的地下工事网络组成,包括炮台、掩体、地下兵营、弹药库和指挥所等设施,有些地下工事深达数十米。
然而,在1940年的法国战役中,它并未发挥预期作用,德军绕过马奇诺防线,通过比利时和阿登森林发动突袭,迅速击败了法军,这使得马奇诺防线成为了"过时防御思维"的象征。
代码中的防御
日常工作中,编写一些功能类,或者一个相对完备的功能模块是比较常有的,我们编写它们要么是为了方便自己或其他同事使用,要么是作为积累和展示。一旦想到自己的代码可能被其他同行调用,我们就会一改平时漫不经心的态度,幻想着他人会触碰我们代码中的逻辑缺陷,败坏他们的程序,自己落得颜面扫地。
于是我们步步为营,每添加或修改一点功能就会仔细推敲有可能发生的意外,运用自己掌握的手段攘除它们滋生的可能,保证我们的代码永远行驶在正轨之上,这就像代码中的防御工事。
但是这种防御与网络和数据安全领域的防御又有所区别,后者的防御对象经常是那些图谋不轨者,就像战争中的敌人一样与我们是对立的。而我们的这种防御更像是一种辅助,它让我们的用户尽可能不陷入困境,就像 Effective C++ 中说的,让接口更难被误用。
一个例子
假设我们有一个比较复杂的类 Complex,它有诸多成员变量,其中某些成员组合在一起可以描述一个抽象的属性,多个属性可能会涉及相同的成员变量,将与某个属性关联的成员打包到一个属性类中是不可行的。
一个解决方案是,将各种的抽象属性封装为不同的代理类,它们各自只引用自己关心的 Complex 数据成员,通过这些代理类来读取或修改相应的属性,思路如图:
一个确切的例子,假如我们有一个房子,它的内部包含多种家用电器,现在我们想为这个房子的智能控制系统编写一系列的模式,比如归家模式、电影模式、度假模式等等。我们就可以将这些模式包装为多个类,各个模式只引用它们需要操作的电器,用以查询或改变房子的状态。
