??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美精品一区二区三区久久久竹菊 ,伊人精品影院,男女视频在线观看http://www.aygfsteel.com/chgaowei/思考、分享、交、进步——ؓ了自q、公司的、中国的、世界的软g技?/description>zh-cnSat, 03 May 2025 20:54:55 GMTSat, 03 May 2025 20:54:55 GMT60设计模式之BUILDER生成?/title><link>http://www.aygfsteel.com/chgaowei/archive/2010/03/31/317095.html</link><dc:creator>帔R?/dc:creator><author>帔R?/author><pubDate>Wed, 31 Mar 2010 13:07:00 GMT</pubDate><guid>http://www.aygfsteel.com/chgaowei/archive/2010/03/31/317095.html</guid><wfw:comment>http://www.aygfsteel.com/chgaowei/comments/317095.html</wfw:comment><comments>http://www.aygfsteel.com/chgaowei/archive/2010/03/31/317095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chgaowei/comments/commentRss/317095.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chgaowei/services/trackbacks/317095.html</trackback:ping><description><![CDATA[<h4>1.1 BUILDER生成?/h4> <p>1?意图 <p>一个复杂对象的构徏和它的表C分,使得同样的构E可以创Z同的表示? <p>构徏是通过对生成器抽象接口的调用实现的。而构建出来的产品的类型(表示Q,是由具体的进行构建的生成器的子类的实例来军_的。这样导向器只需要调用生成器的抽象接口生成品,而具体生成什么样的品,则是Ҏ导向器配|的具体的生成器实例相关? <p>l于理解了它是如何把复杂对象的构建和它的表示分离的,也理解了Z么同L构徏q程? <p>2?动机 <p>3?适用? <p>当创建复杂对象的法应该独立于该对象的组成以及他们的装配方式时——对象的l成及装配方式是生成器的抽象接口来表C的。而对象的创徏的算法是有生成器的子cd现的? <p>当构造过E必d许被构造的对象有不同的表示时——也是Q同L构造过E,可以生成不同的品。这里是通过配置导向器的生成器的子类实例来实现的? <p>4?l构 <p><a href="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/BUILDER_128ED/wps_clip_image-372_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-372" border="0" alt="wps_clip_image-372" src="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/BUILDER_128ED/wps_clip_image-372_thumb.png" width="244" height="91"></a> <p>5?参与? <p>l BuilderQؓ创徏一个product对象的各个部件指定抽象接口。这些部件最l构成了productQ而对q些抽象接口的调用,则是装配product的操作,调用的次敎ͼ入参{不同,则最l生成的product也不同。product本n的构造过E可能会非常复杂。但是,q些复杂度对DirectorQ导向者)是隐藏的。这些抽象的接口描述了品的l成以及装配方式? <p>l ConcreteBuilderQ实现Builder的接口以构造和装配产品的各个部Ӟ定义q明它所创徏的表C;提供一个检索品的接口。这个类实现了Builder的抽象接口,从而可以创Z同的表示Q但是组成和装配q程q是一L? <p>l DirectorQ构造一个用Builder抽象接口的对象。更对象ҎBuilder的接口来装配q生产品? <p>l ProductQ表C构造的复杂的对象。ConcreteBuilder创徏该品的内部表示Qƈ定义它的装配q程Q包含定义组成部件的c,包括这些部件装配成最l品的接口? <p>6?协作 <p>l 客户创徏Director对象Qƈ用它惌的Builder对象q行配置? <p>l 一旦品不仅被生成Q导向器׃通知生成器? <p>l 生成器处理导向器hQƈ且将部gd到该产品中? <p>l 客户从生成器中检索品? <p><a href="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/BUILDER_128ED/wps_clip_image-911_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-911" border="0" alt="wps_clip_image-911" src="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/BUILDER_128ED/wps_clip_image-911_thumb.png" width="244" height="155"></a> <p>7?效果 <p>l 它你可以改变一个品的内部表示。Builder提供lDirector的抽象接口可以生成器隐藏这个品的表示和内部结构。它同时也隐藏了该品时如何装配的。因Z品时通过抽象接口构造的Q你改变该品的内部表示Ӟ所要做的只是定义一个新的生成器? <p>l 它将构造代码和表示代码分开。Builder模式通过装一个复杂对象的创徏和表C方式提高了对象的模块性。每个ConcreteBuilder包含了创建和装配一个特定品的所有代码? <p>l 它可以你对构造过E进行更_的控制? <p>8?实现 <p>l 通常一个抽象的BuildercMؓ导向者可能要求创建的每一个构件定义一个操作。这些操作缺省什么也不做。一个ConcreteBuildercd它有兴趣创徏的构建重定义q些操作? <p>l 装配和构造接口:一般构造请求的l果只是被添加到产品中,Ҏ情况下,需要返回给导向器? <p>l 产品没有抽象c:一般他们没有公q部分。如果有也可以设|一个抽象类? <p>l Builder中缺省的Ҏ为空? <p>9?代码CZ <p>class MazeBuilder { <p>public: <p>    virtual void BuildMaze() { }//部g的构造方? <p>    virtual void BuildRoom(int room) { } <p>    virtual void BuildDoor(int roomFrom, int roomTo) { } <p>    virtual Maze* GetMaze() { return 0; } <p>protected: <p>    MazeBuilder(); <p>};//MazeBuilder是生成器 <p>class StandardMazeBuilder : public MazeBuilder { <p>public: <p>    StandardMazeBuilder(); <p>/* <p>*/ <p>    virtual void BuildMaze(); <p>    virtual void BuildRoom(int); <p>    virtual void BuildDoor(int, int); <p>/* <p>*/ <p>    virtual Maze* GetMaze(); <p>private: <p>    Direction CommonWall(Room*, Room*); <p>    Maze* _currentMaze; <p>};//StandardMazeBuilder是ConcreteBuilderQ提供部件的具体构造代? <p>Maze* MazeGame::CreateMaze (MazeBuilder& builder) { <p>    builder.BuildMaze(); <p>    builder.BuildRoom(1); <p>    builder.BuildRoom(2); <p>    builder.BuildDoor(1, 2); <p>    return builder.GetMaze(); <p>}//CreateMaze是导向器Q调用生成器的抽象接口完成品的构造过E? <p>//下面代码描述产品的构造过E? <p>Maze* maze;//最l的产品 <p>MazeGame game;//DirectorQ导航? <p>StandardMazeBuilder builder;//ConcreteBuilderQ实际的构造类 <p>game.CreateMaze(builder);//开始装? <p>maze = builder.GetMaze();//获取装配后的产品 <img src ="http://www.aygfsteel.com/chgaowei/aggbug/317095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chgaowei/" target="_blank">帔R?/a> 2010-03-31 21:07 <a href="http://www.aygfsteel.com/chgaowei/archive/2010/03/31/317095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《设计模式》学习笔?amp;mdash;&mdash;ABSTRACT FACTORY 抽象工厂http://www.aygfsteel.com/chgaowei/archive/2010/03/03/314437.html帔R?/dc:creator>帔R?/author>Wed, 03 Mar 2010 12:27:00 GMThttp://www.aygfsteel.com/chgaowei/archive/2010/03/03/314437.htmlhttp://www.aygfsteel.com/chgaowei/comments/314437.htmlhttp://www.aygfsteel.com/chgaowei/archive/2010/03/03/314437.html#Feedback0http://www.aygfsteel.com/chgaowei/comments/commentRss/314437.htmlhttp://www.aygfsteel.com/chgaowei/services/trackbacks/314437.html1.1 ABSTRACT FACTORY 抽象工厂

1?意图

提供一个创Zpd相关或相互依赖对象的接口Q而无需指定他们具体的类?

2?动机

“客户仅与抽象定义的接口交互Q而不使用特定的具体类的接口。?

q里的主要的思想是封装对象的创徏的过E。客L可以不需要知道具体要创徏那些对象Q而只需要知道创建某一pd的对象所用到的“工厂对象”即可?

3?适用?

一个系l要独立于它的品的创徏、组合和表示时?nbsp;

一个系l要由多个品系列中的一个来配置时?nbsp;

当你要强调一pd相关的品对象的设计以便q行联合使用时?nbsp;

当你提供一个品类库,而只xC它们的接口而不是实现时?nbsp;

4?l构

wps_clip_image-278

5?参与?

AbstractFactoryQ创Zpd对象的抽象类?

ConcreteFactoryQ实现具体创Z品对象的操作?

AbstractProductQؓ一cM品对象声明一个接口?

ConcreteProductQ定义一个被相应的具体工厂创建的对象Q实现AbstractProduct接口?

ClientQ仅使用AbstractFactory和AbstractProductcd明的接口?

6?协作

在运行时刻,创徏一个ConcreteFactory实例Q它创徏h特定实现的对象。ؓ创徏不同的对象,客户应用不同的具体工厂?

AbstractFactory具体对象的创徏延迟到它的子cConcreteFactory中?

7?效果

1Q?它分M具体的类Q一个工厂封装创Z品的责Q和过E,它将客户和类的实现分R客户通过抽象接口操作实例。品的cd也在具体工厂实现中分,他们不出现在客户代码中?

2Q?它得易于交互品系列?

3Q?它有利于产品的一致性?

4Q?难于支持新的U类?

]]>
《设计模式》学习笔?amp;mdash;&mdash;设计模式怎样解决设计问题http://www.aygfsteel.com/chgaowei/archive/2010/03/03/314436.html帔R?/dc:creator>帔R?/author>Wed, 03 Mar 2010 12:26:00 GMThttp://www.aygfsteel.com/chgaowei/archive/2010/03/03/314436.htmlhttp://www.aygfsteel.com/chgaowei/comments/314436.htmlhttp://www.aygfsteel.com/chgaowei/archive/2010/03/03/314436.html#Feedback0http://www.aygfsteel.com/chgaowei/comments/commentRss/314436.htmlhttp://www.aygfsteel.com/chgaowei/services/trackbacks/314436.html1.1 设计模式怎样解决设计问题
1.1.1 L合适的对象

面向对象设计最困难的部分是系l分解ؓ对象的集合?

设计的许多对象来源于现实世界的分析模型,q里和领域驱动设计有点关联。分析所得到的类Q很多事现实中ƈ不存在的cR这是抽象的l果。设计中的抽象对于生灵zȝ设计臛_重要。就像我设计的一个流E调度模型?

1.1.2 军_对象的粒?/h5>

记笔记可以让我达到沉的状态?

1.1.3 指定对象接口
1.1.4 描述对象实现

OMT表示法:

1?对象Q最上面的黑体表C类名,下面依次是操作,数据?

wps_clip_image-219

2?实例化:虚线头表示一个类实例化另外一个对象?

wps_clip_image-245

3?l承Q竖U和三角表示l承关系?

wps_clip_image-263

4?抽象c:cd以黑体斜体表C,操作也用斜体表示?

5?引用

wps_clip_image-293

头加黑点表CZ个类引用另外一个类?

重点Q?

1?cȝl承和接口承的比较

对象的类和对象的cd的区别:

对象的类定义了对象是怎样实现的,同时也定义了对象内部状态和操作的实现。对象的cd只与它的接口有关。一个对象可以由多个cdQ支持多个接口)Q不同类的对象可以有相同的类型?

cdcd紧密相连Q类定义了对象的操作Q也定义了对象的cd?

cȝl承和接口的l承的差别:

c++中接口承接q于公有l承U抽象类。纯实现l承或纯cȝ承接q于U有l承?

2?Ҏ口编E,而不是对实现~程——面向对象设计的W一个原?

1.1.5 q用复用机制

1?l承和组合的比较

l承是一U白复用,父类的内部细节对子类可见?

对象l合彼此不知道对方内部细节,成ؓ黑箱复用?

l承的优~点Q?

1Q?子类可以直接重定义父cȝ操作?

2Q?~译时刻军_了,无法在运行期间更攏V?

3Q?子类要知道父cȝ实现l节Q这样就部分破坏了封装性。子cd父类依赖q于紧密Q父cȝ某些变化必然D子类的变化。开发过E中遇到q类似的问题。这U依赖,限制了灵zL以及复用性。比如,服务体系中经常出现这L问题Q导致代码拷贝?

l合Q通过获得对象的引用而在q行时刻动态的定义Q的优缺点:

1Q?对象间通过接口彼此交互?

2Q?对象只能通过接口讉KQ不要也不能知道Ҏl节Q这样不会破坏封装性?

3Q?q行时刻可以使用另外一个对象替换这个对象,提高了灵zL?

4Q?对象的实现基于接口编写,所以实C存在较少的依赖关pR?

5Q?优先使用l合有助于保持每个类被封装,q被集中在单个Q务上Q提高整体内聚性。类和类的层ơ都l持一个较的规模Q?

6Q?Z对象l合的设计会有更多的对象Q而又较少的类Q,且系l的行ؓ依赖于对象间的关p而不是定义在某个cȝ内部?

理想的情况下Q应该通过l合原有构g实现新的功能Q而不是创建新的构件?

面向对象设计的第二个原则Q优先用对象组合,而不是类l承?

2?委托

委托时一U组合方法,它是l合h与承同L能力?

委托的主要优点在于它便于在运行时ȝ合对象操作,以及更改操作的组合方式。它是Y件更加的灉|?

和其他的技术方案相同,它也存在不之处Q增加了软g的复杂度——动态的Q高度参数化的Y件比静态的软g更难于理解?

3?l承和参数化cd的比?

1.1.6 兌q行时刻的结构和~译时刻的结?/h5>
1.1.7 设计应支持变?/h5>

设计应该支持变化——所说的是,一个设计方案,对变化要有一定的适应性,卛_装变化?

变化是导致重新设计的原因。设计要对一定范围内的变化友好?

4?nbsp;

对于E序的分层设计,对于处于同一分层的模块,对外应保持一定的抽象Qƈ且,使用同种cd的通信协议?

]]>DS-CQ【ȝ】【变量】变量的存储?/title><link>http://www.aygfsteel.com/chgaowei/archive/2010/03/03/314342.html</link><dc:creator>帔R?/dc:creator><author>帔R?/author><pubDate>Tue, 02 Mar 2010 18:38:00 GMT</pubDate><guid>http://www.aygfsteel.com/chgaowei/archive/2010/03/03/314342.html</guid><wfw:comment>http://www.aygfsteel.com/chgaowei/comments/314342.html</wfw:comment><comments>http://www.aygfsteel.com/chgaowei/archive/2010/03/03/314342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chgaowei/comments/commentRss/314342.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chgaowei/services/trackbacks/314342.html</trackback:ping><description><![CDATA[<h4>1.1 变量存储?/h4> <h5>1.1.1 一个示?/h5> <p>pang123hui首先提供了一个网上流传的学习代码CZQ? <p>int a = 0; //全局?nbsp; <p>void main()  <p>{ <p>int b; //?nbsp; <p>char s[] = “abc? //s在栈,abc在文字常量区  <p>char *p1,*p2; //?nbsp; <p>char *p3 = "123456"; //123456在常量区Qp3在栈?nbsp; <p>static int c =0; //全局?nbsp; <p>p1 = (char *)malloc(10); //p1在栈Q分配的10字节在堆  <p>p2 = (char *)malloc(20); //p2在栈Q分配的20字节在堆  <p>strcpy(p1, "123456"); //123456攑֜帔R?nbsp; <p>} <p>q个代码CZ中出C“全局区”,“栈”,“文字常量区”,“堆”等词语。ؓ了统一Q我们用《C专家~程》中的说法:堆栈D,BSSD,数据D,文本Dc? <p>各个D늚作用如下Q? <p>1?文本D:包含E序的指令,它在E序的执行过E中一般不会改变? <p>2?数据D:包含了经q初始化的全局变量和静态变量,以及他们的倹{? <p>3?BSSD:包含未经初始化的全局变量和静态变量? <p>4?堆栈D:包含了函数内部声明的局部变量? <p>当然Q上面段的作用不仅于此,具体的作用会在下面的知识点中介绍? <h5>1.1.2 通过代码试变量的存储位|?/h5> <p>Linux下可以通过pȝ命o“size”查看可以执行程序各个段的大。但是,可执行程序中的段l构和运行中E序在内存中的段l构q不完全相同Q但是有一定的映射关系。具体如下图所C(囄信息来自《C专家~程》)Q? <p><a href="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-696_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-696" border="0" alt="wps_clip_image-696" src="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-696_thumb.png" width="244" height="197"></a> <p>下面通过代码CZ和“size”来研究变量的存储区域? <p>test.c <p>int main() <p>{ <p>return 1; <p>} <p>~译Qƈ且查看可执行E序各个D늚大小Q? <p><a href="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-779_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-779" border="0" alt="wps_clip_image-779" src="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-779_thumb.png" width="244" height="48"></a> <p>更改test.cQ? <p>int g_data; <p>int main() <p>{ <p>return 1; <p>} <p>~译Qƈ且查看可执行E序各个D늚大小Q? <p><a href="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-849_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-849" border="0" alt="wps_clip_image-849" src="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-849_thumb.png" width="244" height="47"></a> <p>可以发现Q文本段Q数据段都没有发送变化,而BSSD增加了4个字节? <p>l论1Q未初始化的全局变量保存在BSSD中 <p>l箋Q? <p>int g_data = 1; <p>int main() <p>{ <p>return 1; <p>} <p>~译Q? <p><a href="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-958_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-958" border="0" alt="wps_clip_image-958" src="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-958_thumb.png" width="244" height="46"></a> <p>可以发现QBSSD和文本D늛同,而数据段增加?个字节? <p>l论2Q经q初始化的全局变量保存在数据段? <p>l箋Q? <p>int main() <p>{ <p>static int g_data; <p>return 1; <p>} <p>~译Q? <p><a href="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-1066_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-1066" border="0" alt="wps_clip_image-1066" src="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-1066_thumb.png" width="244" height="37"></a> <p>可以发现Q文本段Q数据段都没有发送变化,而BSSD增加了4个字节? <p>l论3Q未初始化的静态变量保存在BSSD中 <p>l箋Q? <p>int main() <p>{ <p>static int g_data = 1; <p>return 1; <p>} <p>~译Q? <p><a href="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-1183_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-1183" border="0" alt="wps_clip_image-1183" src="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-1183_thumb.png" width="244" height="48"></a> <p>可以发现QBSSD和文本D늛同,而数据段增加?个字节? <p>l论4Q经q初始化的静态变量保存在数据D中 <p>l箋Q? <p>int main() <p>{ <p>int i_data = 1; <p>return 1; <p>} <p>~译Q? <p><a href="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-1288_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-1288" border="0" alt="wps_clip_image-1288" src="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-1288_thumb.png" width="244" height="46"></a> <p>可以发现QBSSD和和数据段相同Q而文本段增加?6个字节。局部变量会在执行的时候在堆栈D中生成Q函数执行完毕后释放? <p>l论5Q函数内部声明的局部变量保存在堆栈D中 <p>l箋Q? <p>const int g_data = 1; <p>int main() <p>{ <p>return 1; <p>} <p>~译Q? <p><a href="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-1430_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-1430" border="0" alt="wps_clip_image-1430" src="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-1430_thumb.png" width="244" height="35"></a> <p>把全局变量定义为“const”后Q也怽会感到奇怪,怎么BSSD和数据D都没有发生变化Q而文本段却增加了4个字节? <p>l论6Qconst修饰的全局变量保存在文本段? <p>那么Qconst的局部变量? <p>l箋Q? <p>int main() <p>{ <p>const int i_data = 1; <p>return 1; <p>} <p>~译Q? <p><a href="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-1587_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-1587" border="0" alt="wps_clip_image-1587" src="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-1587_thumb.png" width="244" height="37"></a> <p>l论7Qconst修饰的局部变量保存在堆栈D中 <p>l箋Q? <p>char *pstr = ""; <p>int main() <p>{ <p>return 1; <p>} <p>~译Q? <p><a href="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-1666_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-1666" border="0" alt="wps_clip_image-1666" src="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-1666_thumb.png" width="244" height="47"></a> <p>在做一下更改: <p>char *pstr = "123456789"; <p>int main() <p>{ <p>return 1; <p>} <p>~译Q? <p><a href="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-1733_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-1733" border="0" alt="wps_clip_image-1733" src="http://www.aygfsteel.com/images/blogjava_net/chgaowei/WindowsLiveWriter/DSC_24E3/wps_clip_image-1733_thumb.png" width="244" height="48"></a> <p>可以发现Q前后数据段和BSSD大均未发生变化,而文本段增加?个字节? <p>l论8Q字W串帔R保存在文本段? <h5>1.1.3 l论</h5> <p>1?l过初始化的全局变量和静态变量保存在数据D中? <p>2?未经初始化的全局变量和静态变量保存在BSSDc? <p>3?函数内部声明的局部变量保存在堆栈D中? <p>4?const修饰的全局变量保存在文本段中,const修饰的局部变量保存在堆栈D中? <p>5?字符串常量保存在文本D中? <h5>1.1.4 扩展阅读</h5> <p>《C专家~程》第6章——详l介l各个段的作用? <img src ="http://www.aygfsteel.com/chgaowei/aggbug/314342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chgaowei/" target="_blank">帔R?/a> 2010-03-03 02:38 <a href="http://www.aygfsteel.com/chgaowei/archive/2010/03/03/314342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&ldquo;读S计划&rdquo;Q邀您参与,共徏新型技术社?/title><link>http://www.aygfsteel.com/chgaowei/archive/2009/10/14/298284.html</link><dc:creator>帔R?/dc:creator><author>帔R?/author><pubDate>Wed, 14 Oct 2009 13:43:00 GMT</pubDate><guid>http://www.aygfsteel.com/chgaowei/archive/2009/10/14/298284.html</guid><wfw:comment>http://www.aygfsteel.com/chgaowei/comments/298284.html</wfw:comment><comments>http://www.aygfsteel.com/chgaowei/archive/2009/10/14/298284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chgaowei/comments/commentRss/298284.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chgaowei/services/trackbacks/298284.html</trackback:ping><description><![CDATA[<h2>读S计划的理?/h2> <p><strong>自助、互助,共同q步Q?/strong> <p><strong></strong>  <h2>读S计划的初?/h2> <p>现在有很多学习方式,搜烦引擎、论坛、博客,qq等{,那么我这L计划q有存在的必要么Q这个计划的独特之处在哪里?</p> <p>读S计划的独特之处不在于其学习内容和方式Q学习的内容我们可以Ҏ实际情况调整Q可以由多个人同时引导多个学习方向,q些都不是程式化的,也不是重炏V? <p>读S计划的独特之处在于其理念Q?strong>致力于Ş成一U有计划、有l织Q强调互动、互助和共同q步的学习模式和氛围</strong>。读S计划不是一个单U的兴趣组Q我们会按照计划不断的切换话题。读S计划也不是提问的好地方,在每个阶D,我们都有限定的讨_所以无关的问题很容易被忽略。读S计划希望多数ZU极的心态参与进来,更多的讨论、研I和贡献您的xQ而不是被动的接受和看Q?strong>我们不希望将学习计划做成译֠模式Q我们希望做成项目的模式</strong> 。读S计划致力于将信息以信息本w进行聚合,而不是以行聚合,因ؓ学习计划在不断推q,所以不存在永远的权威h士,但知识本w是客观、中立的、权威的? <p>  <h2>共徏新型技术社?/h2> <p>建立新型的、关pȝ密的、以知识体系u、强调经验积累与分n的的技术社区? <p>  <p>更深入了解此计划Q可以阅读: <h3><a target="_blank">《技术族??读S计划Q让我们一起快乐学习?/a></h3> <h3><a target="_blank">《准备启动一个开源项?- 技术族?- 先期利用Goolge云计^台?/a></h3> <h3><a target="_blank">《关于“读S计划”的聊天记录Q统一理念Q确定目前的工作?/a></h3> <h3><a target="_blank">《授Z“鱼”,不如授h以“渔”,攑ּ一个目标,讑֮另一个目标?/a></h3> <p>期待你加入我们的组Q?a >http://hi.csdn.net/space-mtag-tagid-37.html</a></p><img src ="http://www.aygfsteel.com/chgaowei/aggbug/298284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chgaowei/" target="_blank">帔R?/a> 2009-10-14 21:43 <a href="http://www.aygfsteel.com/chgaowei/archive/2009/10/14/298284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>构徏自己的C/C++插g开发框Ӟ四)&mdash;&mdash;核心层设计和实现http://www.aygfsteel.com/chgaowei/archive/2009/10/12/297970.html帔R?/dc:creator>帔R?/author>Mon, 12 Oct 2009 12:20:00 GMThttp://www.aygfsteel.com/chgaowei/archive/2009/10/12/297970.htmlhttp://www.aygfsteel.com/chgaowei/comments/297970.htmlhttp://www.aygfsteel.com/chgaowei/archive/2009/10/12/297970.html#Feedback0http://www.aygfsteel.com/chgaowei/comments/commentRss/297970.htmlhttp://www.aygfsteel.com/chgaowei/services/trackbacks/297970.html上面一文章大致描qC一下插件开发框架整体结构。这描qC下核心层的设计和实现?

至于核心层的设计Q我惛_鉴 一下微内核的思想。核心层只负责实C面几个功能:

1?插g的加载,,初始化?

2?服务的注册?

3?服务的调用?

4?服务的管理?

插g的加载,,初始?

插g的加载利用linux׃n库的动态加载技术。具体的Ҏ可以看一下IBM|站的一资?a >《Linux 动态库剖析?/a> ?

服务的注?/strong>

服务的注册与调用采用表驱动的Ҏ。核心层中维护一个服务注册表?

//插g间交互消息类?br>typedef enum __Service_Type
{
    Service_Max,
}Service_Type;
//插g用于和其他插仉信接口函数Q由插g提供?br>typedef PRsp_Ele_Stream (*PF_Invoke_Service_Func)(PReq_Ele_Stream pele_str);
//驱动?br>typedef PF_Invoke_Service_Func Service_Drive_Table[Service_Max];

驱动表是一个数l,下标为插仉交互消息cdQ成员ؓ插g提供的接收的消息处理函数Q由插g初始化的时候,调用插g框架的的注册函数注册到驱动表?

插g的初始化实现为:
//插g用于注册处理的消息类型的函数Q由插g框架提供?br>typedef RET_RESULT (*PF_Service_Register_Func)(Service_Type service_type);
//插g用于和其他插仉信接口函数Q由插g框架提供?br>typedef PRsp_Ele_Stream (*PF_Invoke_Service_Func)(PReq_Ele_Stream pele_str);
//插g回复响应函数。插件收到异步请求后Q处理完成后Q发送响应消息给h的插件。由插g框架提供
typedef void (*PF_Send_Response_Func)(PRsp_Ele_Stream pele_str);
//初始化插件信?br>typedef struct Plugin_Init_St
{
    PF_Service_Register_Func register_func;//服务注册函数Q要注册一pd的枚丑ր{插件可以处理的服务枚D?br>    PF_Invoke_Service_Func invoke_serv_func;//和其他组件交互时Q调用的用于和其他组件交互的函数。发送请求消息?br>    PF_Send_Response_Func send_rsp_func;//再设计一个回复响应消息的接口。收到异步请求后Q处理完毕后通知h模块处理l果?br>} Plugin_Init_St, *PPlugin_Init_St;
//初始化插件函敎ͼcM于构造函数。由插g提供Q供插g框架加蝲插g时初始化插g使用?br>void PF_Init_Plugin(PPlugin_Init_St pinit_info);

      插g在函数PF_Init_Plugin中调用函数register_func来注册插件要处理的消息类型?

服务的调?/strong>
//信元l构?br>typedef struct Ele_St
{
    Ele_Tag tag;
    Ele_Length len;
    Ele_Value  value;
    PEle_St next;
}Ele_St, *PEle_St;
//h消息Q信元流格式?br>typedef struct Req_Ele_Stream
{
    Plugin_ID src_id;//源插件id
    Service_Type req_type;//hcd
    PEle_St ele;
} Req_Ele_Stream, *PReq_Ele_Stream;
//响应消息Q信元流格式?br>typedef struct Rsp_Ele_Stream
{
    Plugin_ID dest_id;//目的插gid
    Service_Type req_type;//响应对应的请求的cd?br>    Execute_Result result;//记录执行l果
    Execute_Reason reason;//记录执行l果的原?br>    PEle_St ele;
} Rsp_Ele_Stream, *PRsp_Ele_Stream;
//接收插g调用服务h函数Q由插g提供Q入参ؓh信元。返回gؓ响应信元,用于同步h处理?br>PRsp_Ele_Stream PF_Receive_Invoke_Proc(PReq_Ele_Stream pele_str);
//插g收到响应消息的处理入口函敎ͼ由插件提供。如此ؓ响应信元?br>void PF_Receive_Rsponse_Porc(PRsp_Ele_Stream pele_str);

插g间的依赖关系是通过信元来实现的。至于信元流的用在我的另一博?a >《用信元流QTLVStreamQ规范、简化模块(C/C++Q间交互 ?/a> 中有描述。插件对外的接口都是l一的?

如果插g要和其他的插仉信Q则调用PF_Init_Plugin函数的传递的服务调用接口Q?invoke_serv_func。插件框架根据信元流的类型,查找驱动表,扑ֈ对应的服务接收函数。插件用函数 PF_Receive_Invoke_Proc接受其他插g的请求,此函数是插gx件框架主动注册到驱动表的?

如果服务时同步的Q这直接通过此函数返回,q回的信息在响应信元中。如果是异步的请求,q插件在处理完成后,通过 send_rsp_func函数来发送响应?

插g的卸?/strong>
//卸蝲插g时调用的函数Q类g析构函数。由插g提供Q供插g框架卸蝲插g时调用?br>void PF_Destroy_Func();



]]>
构徏自己的C/C++插g开发框Ӟ三)&mdash;&mdash;Ml构http://www.aygfsteel.com/chgaowei/archive/2009/10/12/297969.html帔R?/dc:creator>帔R?/author>Mon, 12 Oct 2009 12:19:00 GMThttp://www.aygfsteel.com/chgaowei/archive/2009/10/12/297969.htmlhttp://www.aygfsteel.com/chgaowei/comments/297969.htmlhttp://www.aygfsteel.com/chgaowei/archive/2009/10/12/297969.html#Feedback0http://www.aygfsteel.com/chgaowei/comments/commentRss/297969.htmlhttp://www.aygfsteel.com/chgaowei/services/trackbacks/297969.html

q几天ؓ了设计插件开发框Ӟ试用了一下发散思维来思考问题。中间看q依赖注入,AOPQ面向方面编E)Q以及契U式设计{。虽然有些工h法直接用,但是q些思想q是可以借鉴的,比如依赖注入Q契U式设计。至于AOPQ和工具相关性较大,虽然思想不错Q但是无法直接在C++中用?

我设计的插g间的依赖不是通过接口实现的,而是通过插g间的数据Q信元流Q。而信元流的检可以用契U来查?

插g开发框架的Ml构

l构? src=

微内?Q?

1?负责插g的加载,,初始化?

2?负责服务的注册?

3?负责服务的调用?

4?服务的管理?

扩展层:

1?日志的打印?

2?消息Q信元流Q的解释Q将二进制格式解释ؓ文本。便于定位?

3?消息和日志的q踪?

分布式处理层Q?

1?用于和其他的框架通信?

2?和其他的框架搭配QŞ成一个分布式的系l?

自动化测试框架层Q?

1?集成 cppunit ?

2?自动化集成测试框架?

3?自动化功能测试框架?

和第三方框架集成层:

1 、和 W三Ҏ?集成层?/p>

]]>
使用信元(TLVStreamQ规范、简化模块(C/C++Q间交互http://www.aygfsteel.com/chgaowei/archive/2009/10/12/297967.html帔R?/dc:creator>帔R?/author>Mon, 12 Oct 2009 12:18:00 GMThttp://www.aygfsteel.com/chgaowei/archive/2009/10/12/297967.htmlhttp://www.aygfsteel.com/chgaowei/comments/297967.htmlhttp://www.aygfsteel.com/chgaowei/archive/2009/10/12/297967.html#Feedback0http://www.aygfsteel.com/chgaowei/comments/commentRss/297967.htmlhttp://www.aygfsteel.com/chgaowei/services/trackbacks/297967.html原创  使用信元(TLVStreamQ规范、简化模块(C/C++Q间交互 收藏

  问题描述Q?/strong>
  在Y件开发过E中Q一般会对复杂的现实世界q行抽象Qƈ且采用分而治之的{略Q将大系l分解ؓ子系l,子pȝ分解Z个个的模块。模块间的通信一般采用函数调用的方式Q这样会产生一些问题:
   1. 模块间的接口增多会导致模块间紧密耦合Q不利于模块的重用、调试、维护?br>   2. 接口函数参数会很复杂Q容易出现很庞大Q功能面面俱到的l构体?br>   3. 不利于扩展,新增功能要新增接口函敎ͼ或者修Ҏ口参数?br>


信元的定义
  信元是一U处理数据的方式。它对现实世界的数据q行抽象QŞ成一个一个的信元Q然后由q些信元以一定的方式l合hQŞ成信元流Q来传递数据。下面信元流的实现?br>  信元的实?/strong>
  信元׃部分l成Q分别是信元标识QTagQ,信元长度QLengthQ,信元|ValueQ,即TLV格式。下面是一个信元的c定义Q?  
  typedef struct __ELEMENT_ST

     {

          ELE_TAG tag;

          ELE_LEN len;

          ELE_VALUE value;

     }ELEMENT_STQ?

  信元的实现Q?/strong>
  信元分Z部分Q信元流头部QheadQ和体部QbodyQ。head部分用于记录信元的整体描述Q比如,信元的起始模块Q目的模块,以及信元的消息cd{等。当Ӟ也可以根据需要自p行扩展。body部分包括信元中信元的d,即ELE_MSG_BODY中body的长度?

        typedef struct __ELEMENT_STREAM_ST
        {
            MOD_ID src_mod;
            MOD_ID des_mod;
            ELE_MSG_TYPE type;
            ELE_MSG_BODY body;
        }ELEMENT_STREAM_ST;
        typedef struct __ELE_MSG_BODY
        {
            ELE_MSG_LEN len;
            char body[MAX_ELE_MSG_BODY_LEN];
        } ELE_MSG_BODY;

  构造信元流
  定义好结构体后,下面定义两个函数Q分别向信元体中d信元和删除信元?br>   //pbody信元体的指针。这里没有用信元流的指针是Z让函数的重用性更好,用户可以自己定义信元?
        //tag:d信元的TAG|lenQ添加信元的长度。pvaleQ添加信元的倹{?
        int AddElementToStreamBody(ELE_MSG_BODY *pbody, ELE_TAG tag, ELE_LEN len, void *pvalue);
        //pbody信元体的指针?//tag:获取信元的TAG|buf_lenQpbuf的长度。pbufQ目标缓冲区Q要把信元VALUE的值写入吃~冲区?
        int GetElementFromStreamBody(ELE_MSG_BODY *pbody, ELE_TAG tag, int buf_len, void *pbuf);
  信元的body是一个缓冲区Q信元在里面序排列。信元在body中顺序不影响它的获取。添加和获取的方法比较简单,不再赘述?


  一个信元流的实?/strong>
  下面来D一个具体的例子来介l一下信元流的用,以及它的优点?br>  假如׃个模块A和B。A模块负责处理业务逻辑QB模块负责处理呼叫控制。A调用B的一个接口发起呼叫,接口如下?br>        typedef struct __MAKE_CALL_ST
        {
            char caller_num[MAX_NUM_LEN];//dL
            char called_num[MAX_NUM_LEN];//被叫L
        }MAKE_CALL_ST;
        int MakeCall(MAKE_CALL_ST *pcall_info);

  后面需求有更改Q某些情况下药携带主叫的callid信息。结构体会变成:
    typedef struct __MAKE_CALL_ST
    {
        char caller_num[MAX_NUM_LEN];//dL
        char called_num[MAX_NUM_LEN];//被叫L
        CALL_ID caller_callid;
    }MAKE_CALL_ST;
  某些情况下又需要携带主叫的SDP信息Q结构体会变成:
    typedef struct __MAKE_CALL_ST
    {
        char caller_num[MAX_NUM_LEN];//dL
        char called_num[MAX_NUM_LEN];//被叫L
        CALL_ID caller_callid;
        SDP_INFO call_sdp;
    }MAKE_CALL_ST;
  随着需求的增加Q这个结构体会越来越大,q且Q其中的成员在某些情况下要用,某些情况下又不用,造成模块间的冗余数据?br>  当然Q你也可以采用其他的ҎQ比如,再多定义几个接口和结构体。但是这L话接口和l构体的数量会呈爆炸式的增长?br>  使用信元可以很好的解决q个问题。把LQcallidQsdp{全部定义成信元Q需要的时候塞q去Q不需要的话就不添加。另外还有一个好处就是,一个模块可以对外只公布一个接口,来收取信元流Q然后在Ҏ信元的cdq行分别处理。这P一个模块对外就只有一个接口了Q模块间的耦合性会降低?br>


一Ҏq?/strong>
  上面定义的信元流的格式在实际使用的过E中q是到了一些问题,最H出的就是,信元的大小是固定死的。这U情况下Q如果信元信息很,会导致空间浪费,效率降低Q如果信元信息很多,信元的I间又不够?

  可以对上面的q种Ҏq行一下优化,把信元的定义更改为:

  typedef struct __ELEMENT_ST

     {

          ELE_TAG tag;

          ELE_LEN len;

          ELE_VALUE value;

          ELEMENT_ST  *pnext_ele;//下一个信元流

     }ELEMENT_STQ?

  信元流的定义更改ؓQ?

        typedef struct __ELEMENT_STREAM_ST
        {
            MOD_ID src_mod;
            MOD_ID des_mod;
            ELE_MSG_TYPE type;
            ELEMENT_ST  *pfirst_ele;//W一个信元流
        }ELEMENT_STREAM_ST;

  信元流和信元更改ؓ动态申L内存。这h可以提高效率Q有没有了大的限制?

  需要增加两个接口,来申请和释放信元?

  唯一不好的地ҎQ动态申L内存需要程序员记得释放Q否则会内存泄露。不q还有一个方法,卛_加一个申请信元流的函敎ͼ如下
        ELEMENT_STREAM_ST *GetEleStream()
        {
            static     ELEMENT_STREAM_ST *pstream = NULL;
            if (NULL != pstream)
            {
                FreeEleStream(pstream);   
                pstream = NULL;
            }
            pstream = AllocteEleStream();
            return pstream;
        }

  q样的话Q通过函数GetEleStream获取的信元流Q只在函数范围内有效Q退出函数后Q立x效?

]]>
构徏自己的C/C++插g开发框Ӟ二)&mdash;&mdash;M功能http://www.aygfsteel.com/chgaowei/archive/2009/10/12/297968.html帔R?/dc:creator>帔R?/author>Mon, 12 Oct 2009 12:18:00 GMThttp://www.aygfsteel.com/chgaowei/archive/2009/10/12/297968.htmlhttp://www.aygfsteel.com/chgaowei/comments/297968.htmlhttp://www.aygfsteel.com/chgaowei/archive/2009/10/12/297968.html#Feedback0http://www.aygfsteel.com/chgaowei/comments/commentRss/297968.htmlhttp://www.aygfsteel.com/chgaowei/services/trackbacks/297968.html在这一pd的上一个文章中Q介l了构徏C/C++插g开发框架的初步设想Q下面我会一步步的向下展开Q来实现我的q个设想?

今天主要谈一下我对这个框架的功能认识Q或是期望。昨天看了一关?a >持箋集成能力成熟度模?/a> 的一文章,受此启发Q我Ҏ框架的认识渐渐清晰?

q个框架可以当做我们公司底层产品Q交换机Q资源服务器{)的基设施。上层基于java开发的产品可以直接在OSGI上开发?

核心功能Q?/strong>

1、最重要的一个功能是Q提供一个模块化的编E模型,促进模块化Y件开发,真正的实现针Ҏ口编E?

2、提供一个有助于提高模块可重用性的基础设施?

3、提供一个C/C++插g的运行环境?

4、提供一个动态插件框Ӟ插g可以动态更改,而无需重启pȝ。这个功能虽然不隑֮玎ͼ但是用处好像不是很大?


扩展部分功能Q?/strong>

1、支持分布式pȝl构Q多个运行框架组合v来Ş成一个系l,Ҏ块内部隐藏远E通讯l节?

2、支持系l的分层架构?

3、能够和其他的开发框架进行集成,比如OSGIQSCA{?

4、多个运行框架中Q能够实现对q行框架的有效管理?

5、概念上要实现类gSCA中componentQ构ӞQcompositeQ组合构ӞQDomainQ域Q的概念?


开发部分功能:

1、ؓ了简化开发,开发一个Eclipse插gQ用于开发框架中的C/C++插g。能够根据插件开发向|最l生成符合插件规范的公共代码Q配|文ӞMakefile文g{?


调试部分功能Q?/strong>

1、提供一个统一的日志处理函敎ͼ可以集成Log4cpp?

2、提供模块间的消息日志,以及框架对外的接口日志?

3、提供消息和日志的追t功能,能将和某事g相关的消息和日志单独提取出来?

4、提供资源监功能,监测对资源(内存Q套接字Q文件句柄等Q的使用情况?


试部分功能Q?/strong>

1、集成一些单元测试框Ӟ比如unitcppQ达到自动化单元试的目标?

2、自己实现自动化集成试框架Qƈ且开发相应的Eclipse插gQ简化集成测试(利用脚本和信元流Q?

3、集成原有的自动化功能测试框架flowtestQƈ且开发相应的Eclipse插gQ简化功能测试?

4、实现性能试Q监框架?


部v部分功能Q?/strong>

1、实现自动化部v。特别是在分布式应用的情况下?

2、提供一个命令行E序Q通过命o更改pȝ配置Q管理插件?/p>

]]>
构徏自己的C/C++插g开发框Ӟ一Q?amp;mdash;&mdash;初步设想http://www.aygfsteel.com/chgaowei/archive/2009/10/12/297966.html帔R?/dc:creator>帔R?/author>Mon, 12 Oct 2009 12:16:00 GMThttp://www.aygfsteel.com/chgaowei/archive/2009/10/12/297966.htmlhttp://www.aygfsteel.com/chgaowei/comments/297966.htmlhttp://www.aygfsteel.com/chgaowei/archive/2009/10/12/297966.html#Feedback0http://www.aygfsteel.com/chgaowei/comments/commentRss/297966.htmlhttp://www.aygfsteel.com/chgaowei/services/trackbacks/297966.html 最q一直在学习OSGI斚w的知识。买了一本《OSGI原理和最佛_c,可是q没有到。遗憄是,OSGI目前的几个开源框架只支持JavaQ对C和C++都不支持的。可惜我们公司目前主要的开发语aq是c和c++Q即便是引进OSGIQ所得的好处范围有限。而我Ҏ散耦合的模块化开发向往已久。查了一下OSGI对C++支持的好像是有一个开源项目,不过好像应用范围很小。而SCA标准中是有对C++实现模型的支持的Q但是几个开源的框架目前q只支持JAVA?

  昨天看了丁亮的{载的一博客?strong>C/C++Q构Z自己的插件框?》,原文的链接:http://blog.chinaunix.net/u/12783/showart_662937.html 。看了一下里面讲的方法,自己倒是可以实现。所以有了构qc/c++插g开发框架的x。今天先写一下初步的设想?

C/C++插g开发框架的要素

  BlueDavy有一介l服务框架要素的文章Q链接:http://www.aygfsteel.com/BlueDavy/archive/2009/08/28/172259.html Q。我的插件框架也要考虑、解决以下的几个问题Q?

  1、如何注册插Ӟ

  2、如何调用插Ӟ

  3、如何测试插Ӟ

  4、插件的生命周期理Q?

  5、插件的理和维护;

  6、插件的l装Q?

  7、插件的出错处理Q?

  8、服务事件的q播和订阅(q个目前q没有考虑要支持)Q?

  其中有几个点很重要:1Q插件框架要能够使模块松散耦合Q做到真正的面向接口~程Q?Q框架要支持自动化测试:包括单元试Q集成测试;3Q简化部|Ԍ4Q支持分布式Q模块可以调用框架外的插件?

采用的技?/strong>
  插g框架要解决的一个问题就是插件的动态加载能力。这里可以用共享库的动态加载技术。当ӞZ单,W一步只考虑做一个linux下的插g框架?

  Ml构

  框架的Ml构上,参考OSGI的“微内核+pȝ插g+应用插g”结构。这里要好好考虑一下把什么做在内怸。关于微内核l构Q以前我做个一个微内核程引擎Q会在后面有旉和大家分享?

  框架中模块间的数据传送,有两U解x法:一是普元采用的XML数据ȝ的做法。优Ҏ扩展性好Q可L好。但是速度有些慢。二是采用我熟悉的信元流。优点的效率高,讉K方便Q但是可L差一点,另外跨框架的数据传送,需要考虑|络字节序的问题?

  对于框架间的通信Q通过pȝ插g装Q对应用插g隐藏通信l节?

      部v

      努力做到一键式部v?/p>

]]>
վ֩ģ壺 ƽ| | | | | | | | ɽ| Ͱ| ϸ| | ͭϿ| | | | ʡ| ɿ| | | | ˰| | | | | ˮ| | | ɽ| | | ˶| | ɽ| | Դ| | | | |