欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何在编程实践中划分程序集?

程序员文章站 2022-06-18 09:57:59
本文将讨论的程序设计语言是.net语言,至少对于c#成立。本文不详述命名空间和程序集的差别,而是讨论如何在实践中应用这些差别。本文侧重于程序集方面,命名空间的划分今后有时间再谈。...

本文将讨论的程序设计语言是.net语言,至少对于c#成立。本文不详述命名空间和程序集的差别,而是讨论如何在实践中应用这些差别。本文侧重于程序集方面,命名空间的划分今后有时间再谈。


在.net语言中,至少包括c#,命名空间和程序集(扩展名为dll,在visual studio上表现为一个项目)是相互独立的。一个程序集可以包括多个命名空间,一个命名空间可以分散在多个程序集中。这几乎是广为人知且教科书式的解答。但到了具体编程的时候,有的人还是不懂什么时候要新建一个项目,新项目的命名空间和老项目要有什么关系。

划分程序集是面向对象设计理念及设计模式的更高一级应用。
基本原则

程序集的基本用途就是通过增加文件数目来减少单个文件的体积——一种权衡。将程序的功能分散在多个程序集中,允许程序更新时只需要更新的程序集就够了。

原则1封装变化:把倾向于变化的程序逻辑放到一个程序集中。

再进一步,如果完成同一件事有不同的做法,这些做法又足够复杂够得上程序集的级别,那么建一个接口,每个做法都建成一个独立的程序集,实现此接口。

原则2接口与实现分离:把能相互替代的逻辑每个逻辑做成一个程序集。

例子

我以前做过整理输入法用户词库的软件。它读入词库,删除低频词,保存。删除低频词的逻辑是固定的,而读写逻辑因不同的文件格式而改变。(我相信谷歌输入法、搜狗输入法、紫光拼音等都有不同的用户词库格式。)

所以,新建一个项目,只定义一个接口,此即为程序集interface。

新建一个项目,实现接口,以读写谷歌输入法词库,此为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