关闭

【.NET】如何在编程实践中划分程序集?

发表于:2012-6-27 09:47

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:gqqnb    来源:51Testing软件测试网采编

  本文将讨论的程序设计语言是.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的对应。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号