软件模块化概述与技术.docx

上传人:b****5 文档编号:11768522 上传时间:2023-04-01 格式:DOCX 页数:15 大小:27.78KB
下载 相关 举报
软件模块化概述与技术.docx_第1页
第1页 / 共15页
软件模块化概述与技术.docx_第2页
第2页 / 共15页
软件模块化概述与技术.docx_第3页
第3页 / 共15页
软件模块化概述与技术.docx_第4页
第4页 / 共15页
软件模块化概述与技术.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

软件模块化概述与技术.docx

《软件模块化概述与技术.docx》由会员分享,可在线阅读,更多相关《软件模块化概述与技术.docx(15页珍藏版)》请在冰豆网上搜索。

软件模块化概述与技术.docx

软件模块化概述与技术

软件工程发展到今天,从一开始的结构化编程,到面向对象编程,再到现在的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-0517:

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编写与调用

.net2009-09-1618:

27:

52阅读43评论0  字号:

大中小 订阅

   项目可能要用到dll的知识,所以现在恶补。

   什么是DLL?

就是DynamicLinkLibrary动态链接库。

作用就是共享函数库的可执行文件。

通俗的说,就是加载了别人或自己的DLL后,就可以调用DLL里面定义好的类的方法。

   如何编写:

创建一个类(类名为myClass),写好你要用到方法,注意类是共有的,方法是static的。

   如何把cs文件变成dll文件?

把编写好的类放在C:

\ProgramFiles\MicrosoftVisualStudio8\VC下,打开VisualStudio2005命令提示,输入csc  /target:

library   /out:

myDLL.dll  myClass.cs,按回车。

就会在C:

\ProgramFiles\MicrosoftVisualStudio8\VC下生成myDLL.dll。

myDLL.dll就是myClass变成的dll文件,可以给其他项目加载了。

   如何加载:

打开vs2005,在“解决方案资源管理器”下面,右击“引用”,添加引用,把myDLL.dll加载进来。

   如何调用myDLL.dll里面的方法?

   1.相同命名空间的情况:

myClass.方法

   2.不用的命名空间的情况:

加上using命名空间名(如myName),则myName.myClass.方法

以上仅代表个人意见

 

dll文件的编写与调用

vc++2009-12-1518:

02:

40阅读56评论2  字号:

大中小 订阅

///////////////////////////////////////////

//建立DLL文件

用VisualSudio6.0新建一个工程,工程的类型选择Win32Dynamic-LinkLibrary.工程名DLL,空dll工程文件

新建一个cpp和一个.h文件,代码如下:

//.h文件

extern"C" _declspec(dllexport)int add(inta,intb);//注意函数返回值一定要在_declspec(dllexport)之后,否则会出现不可预期的结果

//.cpp文件

intadd(inta,intb){

returna+b;

}

用_declspec(dllexport)指明该函数为导出函数(可供外部程序使用),而非内部使用函数

用extern"C"来表示编译器不要重命名,同时指向所有调用指向同一实体

编译,我们会发现项目BUG下会产生一个.dll文件和一个.lib文件

如果没有_declspec(dllexport)关键字,我们用depends工具打开编译后产生的(bug文件下)这个.dll文件,我们会发现什么也没有.如果没有extern"C"关键字,我们查看该.dll文件的时候,后发现类似?

add@@YAHHH@Z的函数

除了用_declspec(dllexport)指明要导出的函数,用extern"C"来纠正名字,我们还可用一个.def文件来达到以上目的

在dll工程里新建一个文件,类型选TextFile,在名字要带上后缀.def

内容如下:

LIBRARY

EXPORTS

add

同时我们还可以重命名,如下:

LIBRARY

EXPORTS

myadd=add

使得导出的函数叫myadd,而不是add

//////////////////////////////////////////////////

//调用.dll文件

1,隐式连接.将制作好的.dll.lib.h三个文件COPY到你要用的工程下,然后在工程中加入:

该资源,最后头文件中写上

#include"somedll.h"

#pragmacomment(lib,"somedll.lib")

somedll.lib 其中somedll是你要调用的库的名字..然后直接调用你的funa就可以了

2.显式连接

typedefint(*lpFuna)(int,int);

 

intmain(intargc,char*argv[])

{

   HINSTANCEhDll;

 lpFunaFuna;

 hDll=LoadLibrary("a.dll");

 if(hDll!

=NULL)

 {

 //Funa=(lpFuna)GetProcAddress(hDll,"Funa");

 Funa=(lpFuna)GetProcAddress(hDll,MAKEINTRESOURCE

(2));

 //MAKEINTRESOURCE直接使用导出文件中的序号

 if(Funa!

=NULL)

 {

     intresult= Funa(2,3);   

  printf("\ncalladdindll:

%d",result);

 }

 FreeLibrary(hDll);

 }

 

VisualC++-DLL文件的编写和显示调用

VisualC++2009-09-2319:

49:

45阅读51评论0  字号:

大中小 订阅

初步学习VC下的dll文件,查了很多资料,发现很少有讲解很全面的文章,这样的文章对新手来说只是一个大概,作为新手,我谈一下我的感受,第一次接触dll文件的时候,dll就是一个函数库,可以提供被调用的函数,并且在Application中如果碰到要更新文件时不用重新生成新的Application,这样方便了设计流程和维护,更能体现编程过程中模块独立性。

下面就提供一个简单的程序,给新手参考:

在VC下生成创建一个Win32Dynamic-LinkLibrary Project;

 同时选择生成一个空的DLL项目,这时你有两个文件要添加:

1):

在项目工程SouceFile文件夹下添加一个myDll.cpp文件,内容如下:

#include"stdio.h"

#include"stdafx.h"

#include"iostream.h"

#include

intMax(inta,intb)

{

 if(a>=b)

 returna;

 else

 returnb;

}

intMin(inta,intb)

{

 if(a>=b)

 returnb;

 else

 returna;

}

2):

在项目工程SouceFile文件夹下添加一个myDll.def文件,内容如下:

LIBRARYmyDll

EXPORTS

Max

Min

完成后重新生成以下,这时你可以看到在Debug下面有一个myDll.dll文件,表明生成成功。

调用:

在另外建一个工程用来调用这个myDll.dll,首先你要把myDll.dll文件放到新工程的Debug目录下供调用使用,然后输入一下代码:

//dllTest.cpp:

Definestheentrypointfortheconsoleapplication.

//

#include"stdafx.h"

#include"iostream.h"

#include

voidmain()

{

 HMODULEhi=:

:

LoadLibrary("dll.dll");

 typedefvoid(*pMax)(inta,intb);

pMaxpmax=(pMax)GetProcAddress(hi,"Max");

intmaxInt=pmax(4,2);

cout<

}

正确完成以上操作后你就可以运行了。

 

VC++DLL学习札记

默认分类2010-09-0313:

13:

56阅读15评论0  字号:

大中小 订阅

1.VC++静态链接库Win32StaticLibrary

#pragmacomment(lib,"..\\debug\\libTest.lib")的意思是指本文件生成的.obj文件应与libTest.lib一起连接。

如果不用#pragmacomment指定,则可以直接在VC++中设置,依次选择tools、options、directories、libraryfiles菜单或选项,填入库文件路径。

#pragmacomment(lib,"dllTest.lib")//.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息

2.Win32Dynamic-LinkLibrary非MFCDLL

1)typedefint(*lpAddFun)(int,int);//宏定义函数指针类型

2)lpAddFunaddFun;//函数指针

首先,语句typedefint(*lpAddFun)(int,int)定义了一个与add函数接受参数类型和返回值均相同的函数指针类型。

随后,在main函数中定义了lpAddFun的实例addFun;

其次,在函数main中定义了一个DLLHINSTANCE句柄实例hDll,通过Win32Api函数LoadLibrary动态加载了DLL模块并将DLL模块句柄赋给了hDll;

再次,在函数main中通过Win32Api函数GetProcAddress得到了所加载DLL模块中函数add的地址并赋给了addFun。

经由函数指针addFun进行了对DLL中add函数的调用;

最后,应用工程使用完DLL后,在函数main中通过Win32Api函数FreeLibrary释放了已经加载的DLL模块。

3).def文件的规则为:

(1)LIBRARY语句说明.def文件相应的DLL;

(2)EXPORTS语句后列出要导出函数的名称。

可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);

(3).def文件中的注释由每个注释行开始处的分号(;)指定,且注释不能与语句共享一行。

4)DLL的静态调用方式

(1)告诉编译器与DLL相对应的.lib文件所在的路径及文件名,#pragmacomment(lib,"dllTest.lib")就是起这个作用。

程序员在建立一个DLL文件时,连接器会自动为其生成一个对应的.lib文件,该文件包含了DLL导出函数的符号名及序号(并不含有实际的代码)。

在应用程序里,.lib文件将作为DLL的替代文件参与编译。

(2)声明导入函数,extern"C"__declspec(dllimport)add(intx,inty)语句中的__declspec(dllimport)发挥这个作用。

静态调用方式不再需要使用系统API来加载、卸载DLL以及获取DLL中导出函数的地址。

这是因为,当程序员通过静态链接方式编译生成应用程序时,应用程序中调用的与.lib文件中导出符号相匹配的函数符号将进入到生成的EXE文件中,.lib文件中所包含的与之对应的DLL文件的文件名也被编译器存储在EXE文件内部。

当应用程序运行过程中需要加载DLL文件时,Windows将根据这些信息发现并加载DLL,然后通过符号名实现对DLL函数的动态链接。

这样,EXE将能直接通过函数名调用DLL的输出函数,就象调用程序内部的其他函数一样。

5)DLL的动态调用方式

由“LoadLibrary-GetProcAddress-FreeLibrary”系统Api提供的三位一体“DLL加载-DLL函数地址获取-DLL释放”方式,这种调用方式称为DLL的动态调用。

动态调用方式的特点是完全由编程者用API函数加载和卸载DLL,程序员可以决定DLL文件何时加载或不加载,显式链接在运行时决定加载哪个DLL文件。

6)DllMain函数

Windows在加载DLL的时候,需要一个入口函数,就如同控制台或DOS程序需要main函数、WIN32程序需要WinMain函数一样。

在前面的例子中,DLL并没有提供DllMain函数,应用工程也能成功引用DLL,这是因为Windows在找不到DllMain的时候,系统会从其它运行库中引入一个不做任何操作的缺省DllMain函数版本,并不意味着DLL可以放弃DllMain函数。

7)__stdcall约定

如果通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall方式,WINAPI都采用这种方式,而C/C++缺省的调用方式却为__cdecl。

__stdcall方式与__cdecl对函数名最终生成符号的方式不同。

若采用C编译方式(在C++中需将函数声明为extern"C"),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如_functionname@number;而__cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。

3.MFC规则DLL--RegularDLL

MFC规则DLL的概念体现在两方面:

(1)它是MFC的

“是MFC的”意味着可以在这种DLL的内部使用MFC;

(2)它是规则的

“是规则的”意味着它不同于MFC扩展DLL,在MFC规则DLL的内部虽然可以使用MFC,但是其与应用程序的接口不能是MFC。

而MFC扩展DLL与应用程序的接口可以是MFC,可以从MFC扩展DLL中导出一个MFC类的派生类。

RegularDLL能够被所有支持DLL技术的语言所编写的应用程序调用,当然也包括使用MFC的应用程序。

在这种动态连接库中,包含一个从CWinApp继承下来的类,DllMain函数则由MFC自动提供。

4.MFC扩展DLL--ExtensionDLL

MFC扩展DLL与MFC规则DLL的相同点在于在两种DLL的内部都可以使用MFC类库,其不同点在于MFC扩展DLL与应用程序的接口可以是MFC的。

MFC扩展DLL的含义在于它是MFC的扩展,其主要功能是实现从现有MFC库类中派生出可重用的类。

MFC扩展DLL使用MFC动态链接库版本,因此只有用共享MFC版本生成的MFC可执行文件(应用程序或规则DLL)才能使用MFC扩展DLL。

 

关于三个概念:

ActiveX、OLE和COM

熟悉面向对象编程和网络编程的人一定对ActiveX、OLE和COM/DCOM这些概念不会陌生,但是它们之间究竟是什么样的关系,对许多人还是比较模糊的。

在具体介绍它们的关系之间,我们还是先明确组件(Component)和对象(Object)之间的区别。

  组件是一个可重用的模块,它是由一组处理过程、数据封装和用户接口组成的业务对象(RulesObject)。

组件看起来像对象,但不符合对象的学术定义。

它们的主要区别是:

  1)组件可以在另一个称为容器(有时也称为承载者或宿主)的应用程序中使用,也可以作为独立过程使用;  2)组件可以由一个类构成,也可以由多个类组成,或者是一个完整的应用程序;  3)组件为模块重用,而对象为代码重用。

  现在,比较流行的组件模型有COM(ComponentObjectModel,对象组件模型)/DCOM(DistributedCOM,分布式对象组件模型)和CORBA(CommonObjec

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 人力资源管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1