推荐将某些功能拆分为函数、模块和包的方法?
在一个比较大的项目中,有时候我们需要考虑把功能拆分成不同的函数,然后再拆分成不同的模块,最后再拆分成不同的包。有时候,这些模块和包可能还会分布在不同的源代码中(比如,把一个常用的工具,比如 optparser,提取到一个单独的项目中)。
那么,问题来了:我们该如何决定哪些部分放在同一个模块里,哪些部分放在不同的模块里呢?对于包也是一样的问题。
6 个回答
拿出一支笔和一张纸,试着画出你的软件是怎么运作的,尽量从高层次去看。画出软件的不同层次,等等。把功能和目的相似的东西归在一起,甚至可以按它们使用的技术来分组。如果你的软件有多个抽象层次,我建议你也按这个来分组。高层次上,某一层的所有元素都有相同的总体目的。现在你把软件分成了不同的层次,就可以根据特定的功能或专业化,把这些层次分成不同的项目。
那么,什么时候应该做这些呢?我觉得当有好几个人在一起写代码,或者你想让你的项目尽可能模块化的时候,就该这么做了。希望你的代码足够模块化,能够做到这一点。如果你发现自己无法从高层次上把软件拆分开来,那可能你的代码就像意大利面一样混乱,这时候你应该考虑重构一下。
希望这些能给你一些启发。
有一篇经典的论文,作者是大卫·帕纳斯,标题是《关于将系统分解成模块时使用的标准》。这篇论文非常有名(虽然有点年头了,所以可能有些过时)。
你可以从这篇论文开始了解,PDF文件可以在这里找到:
http://www.cs.umd.edu/class/spring2003/cmsc838p/Design/criteria.pdf
先画出你所有类的定义。
把这些类的定义分成几个“模块”。
分别实现和测试这些模块,确保它们各自能正常工作。
把这些模块组合在一起,最终形成你的应用程序。
注意:如果一个应用程序是自然发展出来的,想要把它拆分成小部分几乎是不可能的。所以不要这样做。
要尽早并且经常地拆分你的设计。构建独立的模块,然后再整合起来,形成一个完整的应用程序。