如何在编程实践中划分程序集?
本文将讨论的程序设计语言是.NET语言,至少对于C#成立。本文不详述命名空间和程序集的差别,而是讨论如何在编程实践中应用这些差别。本文侧重于程序集方面,命名空间的划分今后有时间再谈。
在.NET语言中,至少包括C#,命名空间和程序集(扩展名为dll,在Visual Studio上表现为一个项目)是相互独立的。一个程序集可以包括多个命名空间,一个命名空间可以分散在多个程序集中。这几乎是广为人知且教科书式的解答。但到了具体编程的时候,有的人还是不懂什么时候要新建一个项目,新项目的命名空间和老项目要有什么关系。
划分程序集是面向对象设计理念及设计模式的更高一级应用。
基本原则
程序集的基本用途就是通过增加文件数目来减少单个文件的体积——一种权衡。将程序的功能分散在多个程序集中,允许程序更新时只需要更新的程序集就够了。
原则1封装变化:把倾向于变化的程序逻辑放到一个程序集中。
再进一步,如果完成同一件事有不同的做法,这些做法又足够复杂够得上程序集的级别,那么建一个接口,每个做法都建成一个独立的程序集,实现此接口。
原则2接口与实现分离:把能相互替代的逻辑每个逻辑做成一个程序集。
例子
我以前做过整理输入法用户词库的软件。它读入词库,删除低频词,保存。删除低频词的逻辑是固定的,而读写逻辑因不同的文件格式而改变。(我相信谷歌输入法、搜狗输入法、紫光拼音等都有不同的用户词库格式。)
所以,新建一个项目,只定义一个接口,此即为程序集Inte易做图ce。
新建一个项目,实现接口,以读写谷歌输入法词库,此为googleReader。
新建一个项目,实现接口,以读写搜狗输入法词库,此为dogReader。
发布了此词库整理软件后,如果用户说他想整理QQ输入法的词库,你只需再写一个dll,发在网上就是了。
如果一个逻辑要被多个解决方案(不论它们是否相关)使用,此逻辑又足够复杂够得上程序集的级别,那就把它写成一个程序集。
一开始的时候不可能突然有需求说A、B、C三个软件都需要某个东西,问你怎么办。肯定是先写A,全部完成了。隔了一段时间,写B,“诶,好像这些代码我以前写过啊”,动找西找原来在A程序里,“干脆复制过来吧!”又隔了一段时间,写C,“诶,这个问题我以前碰到过啊”,“原来A、B都为了解决此问题写过代码,干脆提取成一个程序集,A、B、C都引用它吧!”
或者你想在网上共享代码,而不像共享整个应用程序,那如果可行的话,不如就把这些代码抽成一个项目,打包让人家下载。别人下下来直接导入自己的项目就可以用。
原则3独立原则:把被多处依赖,而自己不依赖它人的逻辑提取为一个程序集。
如果你在写代码很多的程序时,记得划分程序集。我是如果一个exe大于500KB,我就想办法把它一部分逻辑抽出到新的程序集里去。否则修改了这个exe的一句代码,重新编译就要编译全部,写500KB。
如果程序集划分出去,修改了这个exe的一句代码,重新编译可能只需编译300KB。同样,你修改了新程序集的一句代码(如果不影响它的外观),编译它时卸载exe项目,那么只会编译200KB。节省时间节省空间。
原则4精简原则:太大的exe或dll考虑再细分。
原则5不变原则:不易变化的逻辑分离为一个程序集。这是原则1的对应。
作者:gqqnb
补充:Web开发 , ASP.Net ,