A Philosophy of Software Design读书笔记——信息隐蔽和泄露

上一章说明设计模块要有深度,本章讲解怎么设计有深度的模块

信息隐蔽

需要被隐藏的信息是不需要被其他模块感知到的实现,信息隐蔽在两个方面减少复杂度:1、简化模块的对外接口,减少使用者的认知放大;2、简化对于模块的演进,模块的修改值影响该模块内部,不影响其他模块。

设计模块时尽可能的隐蔽不必要的信息,比如类中的私有成员变量,但是仍有getter、setter方法来获取这些私有成员,如果出现这些接口是自然的,那么这些私有变量就应该被设置为共有的(这点有待商榷)

信息泄露

当一个设计涉及多个模块时,就容易信息泄露,会增加模块间的依赖。同时如果某个信息被多个模块使用到,也会发生信息泄露。

一个好的设计者应该对信息泄露很敏感,能够意识到信息泄露,一旦遇到信息泄露,都要想一下,如何将类的信息完全覆盖在一个类的内部,如果两个类一定要互相依赖,那么尝试把这两个类合并为一个。或者把两个类中都依赖的部分抽象出来,形成一个新的类。

时序耦合

另一种信息泄露的方式,一个系统中某些模块需要按照一定时序发生。比如需要读取、修改、写回一个文件,可能需要三个类,读取类和写回类都需要感知文件格式,由此产生信息泄露,好的解决方法是把读取和写回放入一个类中。

一个模块在系统中出现的执行顺序不是重要的,重要的是要关注这个模块锁实现的功能。

例子:Http Server

例子:太多的类

比如:两个类,一个类负责读取网络到string中,另一个类负责解析string,这就发生信息泄露:读取的时候要解析一部分数据才能知道要读取多长,解决方案是把这两个类合并为一个。

由此例子得出一个经验:通过合并类可以有效改善信息泄露。好处:1、将所有与此功能的实现都放到一个类中。2、对外提供的接口也简单,以前需要保留3个接口,以后这3个接口合并为一个,更抽象。

例子:隐藏http参数

不要把request解析类保留给其他模块,可以提供一个getparam()接口给其他模块,让其他模块获取对应的参数。

例子:http回复中的默认部分

http回复中的默认部分需要模块内自己生成,而不是需要外部模块感知。

对于默认值的选择,在函数中,单独提供一个函数比在函数中提供一个默认值要好,提供默认值一定程度上会出现信息泄露。

模块应该始终做正确的事情,而不是需要等待其他模块显示的调用它。

如果模块提供的API中,有个外部经常使用的feature,那么外部在调用这个feature的时候就需要尽可能的简单,而不需要感知到这个API中不经常使用的feature。(典型的反面例子就是函数默认值)

在类中信息隐藏

做好抽象,尽可能避免类中的变量对其他类暴露,减少依赖。

同时在类中的方法中也尽可能的减少对成员变量的依赖,尽可能的把成员变量集成在某几个方法中。

信息展示

需要要尽可能的避免信息泄露,但是有时候外部模块确实需要模块的内部信息,这部分信息就必须泄露。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值