软件模块化概述与技术.doc_第1页
软件模块化概述与技术.doc_第2页
软件模块化概述与技术.doc_第3页
软件模块化概述与技术.doc_第4页
软件模块化概述与技术.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件工程发展到今天,从一开始的结构化编程,到面向对象编程,再到现在的COM编程,目标只有一个,就是希望软件能象积方块一样是累起来的,是组装起来的,而不是一点点编出来的。结构化编程是函数块的形式,通过把一个软件划分成许多模块,每个模块完成各自不同的功能,尽量做到高内聚低藕合,这已经是一个很好的开始,我们可以把不同的模块分给不同的人去做,然后合到一块,这已经有了组装的概念了。软件工程的核心就是要模块化,最理想的情况就是100%内聚0%藕合。整个软件的发展也都是朝着这个方向走的。结构化编程方式只是一个开始。下一步就出现了面向对象编程,它相对于面向功能的结构化方式是一个巨大的进步。我们知道整个自然界都是由各种各样不同的事物组成的,事物之间存在着复杂的千丝万缕的关系,而正是靠着事物之间的联系、交互作用,我们的世界才是有生命力的才是活动的。我们可以认为在自然界中事物做为一个概念,它是稳定的不变的,而事物之间的联系是多变的、运动的。事物应该是这个世界的本质所在。面向对象的着眼点就是事物,就是这种稳定的概念。每个事物都有其固有的属性,都有其固有的行为,这些都是事物本身所固有的东西,而面向对象的方法就是描述出这种稳定的东西。而面向功能的模块化方法它的着眼点是事物之间的联系,它眼中看不到事物的概念它只注重功能,我们平常在划分模块的时侯有没有想过这个函数与哪些对象有关呢?很少有人这么想,一个函数它实现一种功能,这个功能必定与某些事物想联系,我们没有去掌握事物本身而只考虑事物之间是怎么相互作用而完成一个功能的。说白了,这叫本末倒置,也叫急功近利,因为不是我们智慧不够,只是因为我们没有多想一步。面向功能的结构化方法因为它注意的只是事物之间的联系,而联系是多变的,事物本身可能不会发生大的变化,而联系则是很有可能发生改变的,联系一变,那就是另一个世界了,那就是另一种功能了。如果我们用面向对象的方法,我们就可以以不变应万变,只要事先把事物用类描述好,我们要改变的只是把这些类联系起来的方法,只是重新使用我们的类库,而面向过程的方法因为它构造的是一个不稳定的世界,所以一点小小的变化也可能导致整个系统都要改变。然而面向对象方法仍然有问题,问题在于重用的方法。搭积木式的软件构造方法的基础是有许许多多各种各样的可重用的部件、模块。我们首先想到的是类库,因为我们用面向对象的方法产生的直接结果就是许多的类。但类库的重用是基于源码的方式,这是它的重大缺陷。首先它限制了编程语言,你的类库总是用一种语言写的吧,那你就不能拿到别的语言里用了。其次你每次都必须重新编译,只有编译了才能与你自己的代码结合在一起生成可执行文件。在开发时这倒没什么,关键在于开发完成后,你的EXE都已经生成好了,如果这时侯你的类库提供厂商告诉你他们又做好了一个新的类库,功能更强大速度更快,而你为之心动又想把这新版的类库用到你自己的程序中,那你就必须重新编译、重新调试!这离我们理想的积木式软件构造方法还有一定差距,在我们的设想里希望把一个模块拿出来再换一个新的模块是非常方便的事,可是现在不但要重新编译,还要冒着很大的风险,因为你可能要重新改变你自己的代码。另一种重用方式很自然地就想到了是DLL的方式。Windows里到处是DLL,它是Windows 的基础,但DLL也有它自己的缺点。总结一下它至少有四点不足。(1)函数重名问题。DLL里是一个一个的函数,我们通过函数名来调用函数,那如果两个DLL里有重名的函数怎么办?(2)各编译器对C函数的名称修饰不兼容问题。对于C函数,编译器要根据函数的参数信息为它生成修饰名,DLL库里存的就是这个修饰名,但是不同的编译器产生修饰的方法不一样,所以你在VC 里编写的DLL在BC里就可以用不了。不过也可以用extern C;来强调使用标准的C函数特性,关闭修饰功能,但这样也丧失了C的重载多态性功能。(3)路径问题。放在自己的目录下面,别人的程序就找不到,放在系统目录下,就可能有重名的问题。而真正的组件应该可以放在任何地方甚至可以不在本机,用户根本不需考虑这个问题。(4)DLL与EXE的依赖问题。我们一般都是用隐式连接的方式,就是编程的时侯指明用什么DLL,这种方式很简单,它在编译时就把EXE与DLL绑在一起了。如果DLL发行了一个新版本,我们很有必要重新链接一次,因为DLL里面函数的地址可能已经发生了改变。DLL的缺点就是COM的优点。首先我们要先把握住一点,COM和DLL一样都是基于二进制的代码重用,所以它不存在类库重用时的问题。另一个关键点是,COM本身也是DLL,既使是ActiveX控件.ocx它实际上也是DLL,所以说DLL在还是有重用上有很大的优势,只不过我们通过制订复杂的COM协议,通COM本身的机制改变了重用的方法,以一种新的方法来利用DLL,来克服DLL本身所固有的缺陷,从而实现更高一级的重用方法。COM没有重名问题,因为根本不是通过函数名来调用函数,而是通过虚函数表,自然也不会有函数名修饰的问题。路径问题也不复存在,因为是通过查注册表来找组件的,放在什么地方都可以,即使在别的机器上也可以。也不用考虑和EXE的依赖关系了,它们二者之间是松散的结合在一起,可以轻松的换上组件的一个新版本,而应用程序混然不觉。 关于软件模块化VC+ 2010-03-05 17:15:32 阅读101 评论0 字号:大中小订阅 对于大型软件应该将软件细分为各种小的模块,在这里列出一些方法。(1)DLL(2)COM(3)EXE分离在应用程序开发方面推荐的方式是使用 C+ Builder 编写界面,VC 编写功能模块,通过DLL或者COM方式来进行整合。DLL优点:(1)可以使用不同语言编写,同样也可以被不同的语言所调用,例如C+ Builder调用VC编写的DLL。在DLL中可以加入丰富的额外功能,例如对话框等。编写DLL推荐使用VC,(2)VC编写的DLL生成的目标文件比较小。(3)可以使用特定语言支持的类库,例如可以在VC编写的DLL里面使用MFC类库,在C+ Builder 编写的DLL里面使用 VCL 类库。(4)方便程序构架的管理,通过将DLL按功能进行分类,可以为日后的升级和修改BUG提供帮助。(5)缩小主程序的体积,加快主界面的启动速度。DLL缺点:(1)编写调用语句稍微复杂一点,(2)暂时只支持C风格的变量类型。字符串只支持 char*但DLL也有它自己的缺点。总结一下它至少有四点不足。(1)函数重名问题。DLL里是一个一个的函数,我们通过函数名来调用函数,那如果两个DLL里有重名的函数怎么办?(2)各编译器对C函数的名称修饰不兼容问题。对于C函数,编译器要根据函数的参数信息为它生成修饰名,DLL库里存的就是这个修饰名,但是不同的编译器产生修饰的方法不一样,所以你在VC 里编写的DLL在BC里就可以用不了。不过也可以用extern C;来强调使用标准的C函数特性,关闭修饰功能,但这样也丧失了C的重载多态性功能。(3)路径问题。放在自己的目录下面,别人的程序就找不到,放在系统目录下,就可能有重名的问题。而真正的组件应该可以放在任何地方甚至可以不在本机,用户根本不需考虑这个问题。(4)DLL与EXE的依赖问题。我们一般都是用隐式连接的方式,就是编程的时侯指明用什么DLL,这种方式很简单,它在编译时就把EXE与DLL绑在一起了。如果DLL发行了一个新版本,我们很有必要重新链接一次,因为DLL里面函数的地址可能已经发生了改变。DLL的缺点就是COM的优点。COM优点:(1)可使用不同语言编写COM(2)软件更具模块化(3)接口调用方便COM缺点:(1)在 C+ Builder 中调用 VC 编写的 COM 由于需要先导入类库,所以会增加主应用程序体积。EXE分离优点:(1)各模块独立,不相互影响。EXE分离缺点:(1)接口间调用不方便。dll编写与调用.net 2009-09-16 18:27:52 阅读43 评论0 字号:大中小订阅 项目可能要用到dll的知识,所以现在恶补。 什么是DLL?就是Dynamic Link Library 动态链接库。 作用就是共享函数库的可执行文件。通俗的说,就是加载了别人或自己的DLL后,就可以调用DLL里面定义好的类的方法。 如何编写:创建一个类(类名为myClass),写好你要用到方法,注意类是共有的,方法是static的。 如何把cs文件变成dll文件?把编写好的类放在C:Program FilesMicrosoft Visual Studio 8VC下,打开Visual Studio 2005 命令提示,输入csc /target:library /out:myDLL.dll myClass.cs, 按回车。就会在C:Program FilesMicrosoft Visual Studio 8VC下生成myDLL.dll。myDLL.dll就是myClass变成的dll文件,可以给其他项目加载了。 如何加载:打开vs2005,在“解决方案资源管理器”下面,右击“引用”,添加引用,把myDLL.dll加载进来。 如何调用myDLL.dll里面的方法? 1. 相同命名空间的情况:myClass.方法 2. 不用的命名空间的情况: 加上using 命名空间名(如myName),则myName.myClass.方法以上仅代表个人意见dll 文件的编写与调用vc+ 2009-12-15 18:02:40 阅读56 评论2 字号:大中小订阅 /建立DLL文件用Visual Sudio 6.0新建一个工程,工程的类型选择Win32 Dynamic-Link Library.工程名DLL,空dll工程文件新建一个cpp和一个.h文件,代码如下:/.h文件extern C_declspec(dllexport) intadd(int a ,int b);/注意函数返回值一定要在_declspec(dllexport)之后,否则会出现不可预期的结果/.cpp文件int add(int a ,int b)return a+b;用_declspec(dllexport)指明该函数为导出函数(可供外部程序使用),而非内部使用函数用extern C来表示编译器不要重命名,同时指向所有调用指向同一实体编译,我们会发现项目BUG下会产生一个.dll文件和一个.lib文件如果没有_declspec(dllexport)关键字,我们用depends工具打开编译后产生的(bug文件下)这个.dll文件,我们会发现什么也没有.如果没有extern C关键字,我们查看该.dll文件的时候,后发现类似?addYAHHHZ的函数除了用_declspec(dllexport)指明要导出的函数,用extern C来纠正名字,我们还可用一个.def文件来达到以上目的在dll工程里新建一个文件,类型选Text File,在名字要带上后缀.def内容如下:LIBRARYEXPORTSadd同时我们还可以重命名,如下:LIBRARYEXPORTSmyadd = add使得导出的函数叫myadd,而不是add/调用.dll文件1,隐式连接.将制作好的.dll.lib.h三个文件COPY到你要用的工程下,然后在工程中加入:该资源,最后头文件中写上#include somedll.h#pragma comment(lib,somedll.lib)somedll.lib 其中somedll是你要调用的库的名字.然后直接调用你的funa就可以了2.显式连接typedef int (* lpFuna)(int,int);int main(int argc, char* argv) HINSTANCE hDll; lpFuna Funa;hDll = LoadLibrary(a.dll);if (hDll != NULL)/ Funa = (lpFuna)GetProcAddress(hDll,Funa); Funa = (lpFuna)GetProcAddress(hDll,MAKEINTRESOURCE(2); /MAKEINTRESOURCE直接使用导出文件中的序号 if(Funa!=NULL) int result = Funa(2,3); printf(ncall add in dll:%d,result); FreeLibrary(hDll);Visual C+ - DLL 文件的编写和显示调用Visual C+ 2009-09-23 19:49:45 阅读51 评论0 字号:大中小订阅 初步学习VC下的dll文件,查了很多资料,发现很少有讲解很全面的文章,这样的文章对新手来说只是一个大概,作为新手,我谈一下我的感受,第一次接触dll文件的时候,dll就是一个函数库,可以提供被调用的函数, 并且在Application中如果碰到要更新文件时不用重新生成新的Application,这样方便了设计流程和维护,更能体现编程过程中模块独立性。下面就提供一个简单的程序,给新手参考:在VC下生成创建一个Win32 Dynamic-Link Library Project; 同时选择生成一个空的DLL项目,这时你有两个文件要添加:1):在项目工程Souce File文件夹 下添加一个myDll.cpp文件,内容如下:#include stdio.h#include stdafx.h#include iostream.h#include int Max(int a, int b) if(a=b) return a; else return b; int Min(int a, int b) if(a=b) return b; else return a;2):在项目工程Souce File文件夹 下添加一个myDll.def文件,内容如下:LIBRARY myDllEXPORTS MaxMin完成后重新生成以下,这时你可以看到在Debug下面有一个myDll.dll文件,表明生成成功。调用:在另外建一个工程用来调用这个myDll.dll,首先你要把myDll.dll文件放到新工程的Debug目录下供调用使用,然后输入一下代码:/ dllTest.cpp : Defines the entry point for the console application./#include stdafx.h#include iostream.h#include void main() HMODULE hi = :LoadLibrary(dll.dll);typedef void (*pMax)(int a,int b);pMax pmax = (pMax)GetProcAddress(hi,Max);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论