﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客- 攀升·Uranus-随笔分类-设计模式</title><link>http://www.cppblog.com/iuranus/category/4276.html</link><description>&lt;br&gt;&lt;font color="#ADFF2F"&gt;Something Different，Something New&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Mon, 23 Feb 2009 05:04:01 GMT</lastBuildDate><pubDate>Mon, 23 Feb 2009 05:04:01 GMT</pubDate><ttl>60</ttl><item><title>Command Pattern: We used but we didn't recognize</title><link>http://www.cppblog.com/iuranus/archive/2009/02/20/74451.html</link><dc:creator>攀升</dc:creator><author>攀升</author><pubDate>Fri, 20 Feb 2009 13:00:00 GMT</pubDate><guid>http://www.cppblog.com/iuranus/archive/2009/02/20/74451.html</guid><wfw:comment>http://www.cppblog.com/iuranus/comments/74451.html</wfw:comment><comments>http://www.cppblog.com/iuranus/archive/2009/02/20/74451.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/iuranus/comments/commentRss/74451.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/iuranus/services/trackbacks/74451.html</trackback:ping><description><![CDATA[<p><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class A wanna class B do what he want to (command).&nbsp;Simple way,&nbsp;invoke B's method, that's a good idea, but&nbsp;don't follow the&nbsp;OO principle: decouple</span></p>
<p><span>How to do it?&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Firstly, B is a stable class; he can in charge of all his responsibility. Maybe there are too many classes like B that A wants to invoke. So how to do it, A composition or aggregation all classes that he needs? Of course not, too much dependence with A. So let&#8217;s think about this with OO principle: Encapsulate What Varies.</span>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>There are many unpredictable commands that are the variety in this case. We need to encapsulate the command and plugin to A. So at that time, A just knows he is invoking a command, and doesn&#8217;t know who and how to execute that command.</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Secondly, how to plugin to A. I don&#8217;t wanna talk about DI or Java mechanism. I am handling C++, so just add a method named SetCommand(Command* pCommand) to A, that's fine.</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Lastly, I showed a UML figure 1-1 that described all the means.</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/iuranus/CommandPattern.jpg" border=0></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Figure 1-1&nbsp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </span>Everybody&#8217;ll shout: that is command pattern. &nbsp;Yes.</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As the title said: we used but we didn't recognize. So let&#8217;s start with its official definition:</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The Command Pattern encapsulate a request as an object, thereby letting you parameterize other objects with different request, queue or log requests, and support undoable operations.</span></p>
<img src ="http://www.cppblog.com/iuranus/aggbug/74451.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/iuranus/" target="_blank">攀升</a> 2009-02-20 21:00 <a href="http://www.cppblog.com/iuranus/archive/2009/02/20/74451.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式应用(二) 俄罗斯方块设计的思考:用OO的思想</title><link>http://www.cppblog.com/iuranus/archive/2008/12/28/70593.html</link><dc:creator>攀升</dc:creator><author>攀升</author><pubDate>Sun, 28 Dec 2008 15:36:00 GMT</pubDate><guid>http://www.cppblog.com/iuranus/archive/2008/12/28/70593.html</guid><wfw:comment>http://www.cppblog.com/iuranus/comments/70593.html</wfw:comment><comments>http://www.cppblog.com/iuranus/archive/2008/12/28/70593.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.cppblog.com/iuranus/comments/commentRss/70593.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/iuranus/services/trackbacks/70593.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大学的时候看同学用C写的俄罗斯方块，今天心血来潮，突然想设计下用OO的思想来设计下。俄罗斯方块是一以前俄罗斯的计算机科学家自己开发娱乐的小游戏，没想到后来这么流行。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;像俄罗斯（Tetris）方块，迷宫，推箱子这种小游戏，其实建模都差不多，这里我选择一个2维数组10&#215;20的来代表整个游戏区域的显示点,0代表该位置空，1代表有方块。 每一个数组值（a[2][4]）代表屏幕上的一个像素，数组类似于：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[20][10] = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.........................................<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里有几个简单的判断：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1. 判断是不是方块撞到墙上，就是看a[i-1]中i-1是不是&lt;0或i+1是不是&gt;10;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2. 判断一层能不能clear， 就是每行是不是数组值都是1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int k = 0;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0; i&lt;20; i++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int j = 0; j&lt;10; j++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(a[i][j] == 1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(k==10)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClearRow(i);&nbsp;&nbsp; //把数组第i行全置0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3......其它的判断类似<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好，具体的设计思想参考图1-1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/iuranus/Tetrix.jpg" border=0>&nbsp;<br></p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图1-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在游戏操作中，有六个键， 上下左右＋左右旋转，&nbsp;该图中Form是边界类与UI和用户控制打交道，Handler业务控制类， ManageArray操作singleton数组和控制一些比较复杂算法的类。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先该设计把整个业务算法等等从界面分离开，不管你用什么Iphone的UI的SDK还是android的，&nbsp;都没问题。&nbsp;他们只与我们的UIForm打交道。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;再次这边的Singleton模式把数组暴露给想要他的程序。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最后用策略模式把旋转的算法分开，每个算法只关心自己怎么变化，想扩展就加一个类，如果一个算法要修改，那么只修改某一个方法。开闭原则。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;望各位博友指点<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<img src ="http://www.cppblog.com/iuranus/aggbug/70593.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/iuranus/" target="_blank">攀升</a> 2008-12-28 23:36 <a href="http://www.cppblog.com/iuranus/archive/2008/12/28/70593.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式应用(一) 软件架构</title><link>http://www.cppblog.com/iuranus/archive/2007/12/10/38189.html</link><dc:creator>攀升</dc:creator><author>攀升</author><pubDate>Mon, 10 Dec 2007 11:32:00 GMT</pubDate><guid>http://www.cppblog.com/iuranus/archive/2007/12/10/38189.html</guid><wfw:comment>http://www.cppblog.com/iuranus/comments/38189.html</wfw:comment><comments>http://www.cppblog.com/iuranus/archive/2007/12/10/38189.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/iuranus/comments/commentRss/38189.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/iuranus/services/trackbacks/38189.html</trackback:ping><description><![CDATA[<p align=left>&nbsp; </p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关于这篇文章我一直想写，但每次总是没有一个闲下来的时间，现在试着挤每天的闲暇时间一点点完成。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一直以来我都想做一个软件架构师，所以我在平时的开发中除了保证写出高质量的代码外，还会从架构者的角度来仔细推敲整个应用。当然了这个架构主要是指的代码的架构，那么推敲的依据主要来自三个地方：</span></p>
<p><span>1</span><span>．</span><span>GRASP</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>每当遇到软件分层，类似于业务逻辑放在那个类哪个层等问题时，我通常都会参考</span><span>GRASP</span><span>，</span><span>General Responsibility Assignment Software Pattern</span><span>。包括以下几个原则：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>A</span><span>．</span><span>Information Expert </span><span>信息专家</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>B</span><span>．</span><span>Creator </span><span>创建者</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>C</span><span>．</span><span>Low Coupling&nbsp;</span><span>低耦合</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>D</span><span>．</span><span>High Cohesion&nbsp;</span><span>高内聚</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>E</span><span>．</span><span>Controller </span><span>控制器</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>F</span><span>．</span><span>Polymorphism </span><span>多态</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>G</span><span>．</span><span>Pure Fabrication </span><span>纯虚构</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>H</span><span>．</span><span>Indirection </span><span>间接：避免对象间直接耦合，合理分配职责</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>G</span><span>．</span><span>Protected Variations </span><span>受保护变化：开闭原则。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>虽说每个思想懂，但真正能用在实际开发中还是有一定难度的，具体的介绍可以参考大师</span><span>CRAIG LARMAN</span><span>的《</span><span>UML</span><span>与模式应用》。</span></p>
<p><span>2</span><span>．</span><span>Design Patterns</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;古人练剑分三层境界。第一层是每个招式都熟记于心</span><span>, </span><span>没事就拿出来练练，比武时按照自己的套路出剑，第二层就是没有招式，只有思想，假如想解掉别人的剑，那目标就是解剑，随便出剑都可以做到。第三层就是人剑合一，这种境界就已经不依赖与剑了，身边的任何物体包括自己都可以是一把剑，都可以置对方于死地。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;世间万物皆相通，我认为模式的学习也是有三种阶段，</span><span>23</span><span>种模式熟记于心，遇到具体项目套相对应的设计模式，虽然有点死板，但给软件的维护和扩展带来很大好处，这是学习设计模式的第一层。第二层就是大脑中已经没有具体的模式，只知道如果要解耦，那么就这样做，如果追求运行速度，就那样做，这就不一定是</span><span>23</span><span>种模式的一种了。如果已经有前两层的功力，那就要追求人设计模式合一，这时就有很多变化，创造模式，不会依赖与语言</span><span>(C, C++, JAVA</span><span>等等</span><span>)</span><span>，各个领域的设计模式等等。估计</span><span>Erich Gamma</span><span>应该到了第三层境界了吧。</span></p>
<p><span>3. </span><span>我的前辈</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;他们在这方面很有经验，架构这个东西就是平时要积累丰富项目经验，看看国外的一个个大牛，都不是</span><span>40</span><span>多岁的人，所以我就很讨厌某些言论说软件是吃青春饭的</span><span>&#8230;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在正常的情况，在我看来，现在的软件设计从大的角度来讲就是复用（</span><span>Reuse</span><span>），从小的角度来讲就是解耦</span><span>(Decouple</span><span>或者</span><span>separate concern)</span><span>。作为一名优秀的程序员，开发一个</span><span>App</span><span>，写一句代码都要考虑到你写的这个类与其它类的关系，是不是多余的依赖，适不适合扩展等等。由于这段时间工作的需要，我接连转了三个项目，目睹了每个项目架构的优缺点，加之前不久我又进行了</span><span>IJC</span><span>关于</span><span>RUP</span><span>的培训，与</span><span>IJC</span><span>的</span><span>David</span><span>和蒋胜老师深入的讨论了软件开发过程，所以我想把学到的一些设计方法举个例子来说明。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在进入主题之前我想先叙述一些概念。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;概念</span><span>1</span><span>：由面向过程到面向对象绝对是一个质的飞跃，我认为</span><span>OO</span><span>最大的优点在于它的程序设计和现实世界是相对应的，从</span><span>23</span><span>种设计模式的名字上面也有体现。工厂，代理，适配器等等。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;概念</span><span>2</span><span>：</span><span>MVC</span><span>（</span><span>Model-View-Controller</span><span>，模型</span><span>—</span><span>视图</span><span>—</span><span>控制器模式）用于表示一种软件架构模式。它把软件系统分为三个基本部分：模型（英语</span><span>:Model</span><span>），视图（</span><span>View</span><span>）和控制（</span><span>Controller</span><span>）。</span><span>视图</span><span>(View)</span><span>代表用户交互界面，控制</span><span>(Controller)</span><span>可以理解将模型与视图匹配在一起，共同完成用户的请求。模型主要是指业务流程的具体细节，整个过程如图</span><span>1</span><span>。那么其实在实际的开发中</span><span>MVC</span><span>还是有很多局限性的，后面会通过一个例子给出一个我的改进版。</span></p>
<p>&nbsp;
<div align=center src_cetemp="/images/cppblog_com/iuranus/mvc.JPG"><img height=254 alt="" src="http://www.cppblog.com/images/cppblog_com/iuranus/mvc.JPG" width=514 border=0></div>
<p>&nbsp;</p>
<p align=center><span>图</span><span>1</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>&nbsp;&nbsp;&nbsp;概念</span><span>3</span><span>：</span><span>RUP</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RUP</span><span>（</span><span>Rational Unified Process</span><span>，统一软件开发过程，统一软件过程</span><span>)</span><span>是一个面向对象且基于网络的程序开发方法论。根据</span><span>Rational(Rational Rose</span><span>和统一建模语言的开发者</span><span>)</span><span>的说法，好像一个在线的指导者，它可以为所有方面和层次的程序开发提供指导方针，模版以及事例支持。</span><span> RUP</span><span>和类似的产品</span><span>--</span><span>例如面向对象的软件过程（</span><span>OOSP</span><span>），以及</span><span>OPEN Process</span><span>都是理解性的软件工程工具</span><span>--</span><span>把开发中面向过程的方面（例如定义的阶段，技术和实践）和其他开发的组件（例如文档，模型，手册以及代码等等）整合在一个统一的框架内。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;抓其精髓就是使整个开发过程统一，可管理。用例驱动，以架构为中心，增量与迭代，是</span><span>RUP</span><span>的主要思想。</span><span>RUP</span><span>是一个很复杂的过程，但好在它在每个项目中使用时可以因地制宜，有效的裁减可以使</span><span>RUP</span><span>在工程中发挥最大的威力。作为一个程序员，我首先要关心的是有关代码架构的问题，</span><span>RUP</span><span>有一个核心的思想</span><span>Separate concern</span><span>，也就是分离关注点。这也刚好体现了面向对象的一个思想：解耦。那么</span><span>RUP</span><span>中最能体现它</span><span>Separate concern</span><span>的应该就算它的</span><span>Minimal</span><span>和</span><span>Extension</span><span>了，当然还有一些其它的体现方式，我会在下篇实例中详细介绍。</span></p>
<p align=center><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;简单来说</span><span>Minimal</span><span>指的是那些上不依赖于表现层，下不依赖于数据库，操作系统等</span><span>,</span><span>可以在任何环境下运行的纯业务逻辑程序，最主要的还是</span><span>Minimal</span><span>部分的代码可以复用。</span><span>Extension</span><span>包括</span><span>Minimal</span><span>，它依赖于某个特定的底层程序或者操作系统。</span><span>Minimal</span><span>和</span><span>Extension</span><span>类似于图</span><span>2</span><span>的关系。<br><img height=159 alt="" src="http://www.cppblog.com/images/cppblog_com/iuranus/Extension.JPG" width=241 border=0><br><br>图2</span></p>
<img src ="http://www.cppblog.com/iuranus/aggbug/38189.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/iuranus/" target="_blank">攀升</a> 2007-12-10 19:32 <a href="http://www.cppblog.com/iuranus/archive/2007/12/10/38189.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计为先,编码在后</title><link>http://www.cppblog.com/iuranus/archive/2007/01/22/17889.html</link><dc:creator>攀升</dc:creator><author>攀升</author><pubDate>Mon, 22 Jan 2007 08:32:00 GMT</pubDate><guid>http://www.cppblog.com/iuranus/archive/2007/01/22/17889.html</guid><wfw:comment>http://www.cppblog.com/iuranus/comments/17889.html</wfw:comment><comments>http://www.cppblog.com/iuranus/archive/2007/01/22/17889.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/iuranus/comments/commentRss/17889.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/iuranus/services/trackbacks/17889.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第二个项目的设计是终于结束了，今天老大看了下通过，开始编码。呵呵呵，另一个巨大的工程要开始了，但是这个不恐怖。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在学校每次开发的时候都说先设计再编程，但到真正开始的时候就乱了，编码完成后再说，编码完后，文档乱写两下就交工了，所以说以前根本没有设计过什么，导致我这次做的比较吃力。<img height=19 src="http://www.cppblog.com/Emoticons/cry_smile.gif" width=19 border=0><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说真的这个rose还不错，以前确切的说是不会用，这次用它画了类图，时序图，让我对面向对象认识又深刻了一点，总结下这几天学到的东西：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;１．ＵＭＬ中类图与时序图的画法，搞清楚关联的几种表达方法，对四种视图有了大体认识。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;２．ROSE的基本使用，包括画图，分包，导代码。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;３．大部分使用了继承，组合这两种基本设计模式，感觉比较麻烦。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;４．基本搞清ＡＦＷ的程序结构，可以实现基本的ＵＩ。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当然通过这几天学习，也发现自己还有很多不足，最迫切的事有：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;１．学日语，给的文档是日文的，虽说基本能看懂，但是让我认识到将来还有很多时候会有这种情况，所以还是好好把日语学吧．<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;２．ＭＤＡ，很大的概念，很想学的东西，但是不会吧，过几天工资发了买几本书看看。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;３．设计模式也要研究呀，在设计类的时候，我一直在想，这样做好还是那样做好，就用基本的继承，组合套工程呀，没有什么ＦＡＣＴＯＲＹ，ＥＸＰＥＲＴ的思想，这个确实的研究了。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;基本就这些了，休息的差不多了，写代码吧。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;再说一个开心的事，昨天晚上为了不让ＣＣ看电影，就给她买了个十字绣，她玩的蛮高兴，呵呵！</p>
<img src ="http://www.cppblog.com/iuranus/aggbug/17889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/iuranus/" target="_blank">攀升</a> 2007-01-22 16:32 <a href="http://www.cppblog.com/iuranus/archive/2007/01/22/17889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 保持架构稳定--面向接口的编程</title><link>http://www.cppblog.com/iuranus/archive/2006/12/31/17091.html</link><dc:creator>攀升</dc:creator><author>攀升</author><pubDate>Sun, 31 Dec 2006 07:58:00 GMT</pubDate><guid>http://www.cppblog.com/iuranus/archive/2006/12/31/17091.html</guid><wfw:comment>http://www.cppblog.com/iuranus/comments/17091.html</wfw:comment><comments>http://www.cppblog.com/iuranus/archive/2006/12/31/17091.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/iuranus/comments/commentRss/17091.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/iuranus/services/trackbacks/17091.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 接口把定义与实现分离，它反映了系统设计人员对系统的抽象理解，它可以把模块组件化，利于模块之间的交互，这次项目构架个框架，但是对我来说真的有点难，就从这个面向接口的编程开始吧。<br>在设计模式中真的很重视实现与接口分离，原因有下面几个：<br>1. 对一般的程序员来说，他们不需要知道具体的实现，只需要清楚接口发布出的方法就可以了。<br>2.因为接口是需求中比较稳定的部分，而实现则是和具体的环境相关联的，只要满足接口，其它软件开发团队同样能够开发出合用的应用来。在当前这样一个讲求合作、讲求效率的大环境中。这种开发方法是非常重要的。 
<img src ="http://www.cppblog.com/iuranus/aggbug/17091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/iuranus/" target="_blank">攀升</a> 2006-12-31 15:58 <a href="http://www.cppblog.com/iuranus/archive/2006/12/31/17091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>