在进行分层设计时,需要注意的是,每一层都应该提供不同的抽象,并要尽量避免在一个模块中出现大量的Pass-Through Mehod。比如在DDD的四层架构中,领域层提供了对领域业务逻辑的抽象,应用层提供了对系统用例的抽象,接口层提供了对系统访问接口的抽象,基础设施层则提供对如数据库访问这类的基础服务的抽象。
所谓的Pass-Through Mehod是指那些“在函数体内直接调用其他函数,而本身只做了极少的事情”的函数,通常其函数签名与被其调用的函数签名很类似。Pass-Through Mehod所在的模块通常都是浅模块,让系统增加了无谓的层次和函数调用,会使系统更加复杂。
Pass-Through Mehod(选自《A Philosophy of Software Design》中的例子)
学会写代码注释!注释是降低软件复杂性的性价比极高的一种手法,它只需要花费20%的时间,即可获取80%的价值。它可以提高晦涩难懂的代码的可读性;可以起到隐藏代码复杂细节的作用,比如接口注释可以帮助开发者在没有阅读代码的情况下快速了解该接口的功能和用法;如果写的好,它还可以改善系统的设计。
具体如何写好代码注释,参考《教你写好代码注释》一文。
总结软件的复杂性是我们程序员在日常开发中所必须面对的东西,学会如何 “弄清楚什么是软件复杂性,找到导致软件复杂的原因,并利用各种手法去战胜软件的复杂性” 是一门必备的能力。有句话说得很好,“代码质量决定生活质量”,当你把软件的复杂性降低了,bug减少了,系统可维护性更高了,自然也就带来了更好的生活质量。
模块设计是降低软件复杂度最有效的手段,学会使用“战略编程”的方法,并坚持下去。我们常常提倡“一次把事情做对”,但这对于模块设计而言并不适用,几乎没有人可以第一次就把一个模块设计成完美的模样。二次设计是一个非常有效的手法,与其在系统腐化之后再花大量时间进行重构或重写,还不如在第一次完成模块设计后,再花点时间进行二次设计,多问问自己:是否有更简单的接口?是否有更通用的设计?是否有更简洁高效的实现?
"罗马不是一天建成的",降低软件的复杂性也一样,贵在坚持。