﻿<?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++博客-woaidongmao-随笔分类-编程思想</title><link>http://www.cppblog.com/woaidongmao/category/6007.html</link><description>文章均收录自他人博客，但不喜标题前加-[转贴]，因其丑陋，见谅！~</description><language>zh-cn</language><lastBuildDate>Fri, 26 Dec 2008 22:51:55 GMT</lastBuildDate><pubDate>Fri, 26 Dec 2008 22:51:55 GMT</pubDate><ttl>60</ttl><item><title>开区间与闭区间&amp;mdash;&amp;mdash;从初等数学中吸取一点编程养分</title><link>http://www.cppblog.com/woaidongmao/archive/2008/12/25/70343.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 25 Dec 2008 09:24:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/12/25/70343.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/70343.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/12/25/70343.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/70343.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/70343.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="TEXT-INDENT: 24pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0"><span class=posttitle1><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">开区间和闭区间</span>，</span></span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">学过这个很多年了吧，估计是在初中时候的数学里。今天特意查了下，终于又知道了&#8220;<strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="COLOR: red">[</span></strong>&#8221;是闭的，&#8220;<strong style="mso-bidi-font-weight: normal"><span style="COLOR: red">（</span></strong>&#8221;是开的（详细请看下面的花色字体）。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="TEXT-INDENT: 24pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">查这个好笑否？其实是有缘由的，当然也有些用处，我慢慢道来<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 150%; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体"><span style="mso-list: ignore">1.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">编程中，总是很频繁的要实现对数据进行搜索，查找的代码。以搜索举例，要给定开关条件，比如写一个函数，找到<span lang=EN-US>login_begin</span>到<span lang=EN-US>login_end</span>之间的帐户。如果这样的代码写得很多了，就会犯糊涂，这里给的条件<span lang=EN-US>login_begin</span>到<span lang=EN-US>login_end</span>，到底有没有包含<span lang=EN-US>login_begin</span>和<span lang=EN-US>login_end</span>啊？不确定，然后翻代码一看，噢，原来没有包含呀。不确定包含与否的原因，是因为没有使用统一的开闭区间规则。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 150%; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体"><span style="mso-list: ignore">2.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">STL</span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">的容器和算法的实现，都有一个共性： 迭代器构成的区间是前闭后开的<span lang=EN-US>, </span>如<strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="COLOR: red">[</span></strong><span lang=EN-US>vector::begin(), vector::end() <strong style="mso-bidi-font-weight: normal"><span style="COLOR: red">)</span></strong></span>，这样在使用的时候就不会犯糊涂了；<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 150%; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体"><span style="mso-list: ignore">3.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">C++</span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">举例，<span lang=EN-US>for(int i= 0; i &lt; 10; ++i)</span>这样的迭代过程，使用的也是一个前闭后开区间，<strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="COLOR: red">[</span></strong><span lang=EN-US>0</span>， <span lang=EN-US>10</span><strong style="mso-bidi-font-weight: normal"><span style="COLOR: red">）</span></strong>，如果这样写<span lang=EN-US>for(int i= 0; i &lt;= 9; ++i)</span>，虽然等价，但已不是一个良好的格式了；<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 150%; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333399; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体"><span style="mso-list: ignore">4.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></strong><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">最后所说的吸取养分，总结成如下这句话：<strong style="mso-bidi-font-weight: normal"><span style="COLOR: #333399">在<font color=#ff0000>业务逻辑上和项目代码</font>里使用统一的开闭区间规则，推荐使用前闭后开&#8220;</span><span lang=EN-US style="COLOR: red">[ </span><span style="COLOR: red">）</span><span style="COLOR: #333399">&#8221;，为什么？因为所以没原因。<span lang=EN-US><o:p></o:p></span></span></strong></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><strong style="mso-bidi-font-weight: normal"><span style="COLOR: #333399"><span lang=EN-US><o:p></o:p></span></span></strong></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>////////////////////////////////////////////////////////////////////////</p>
<p class=MsoNormal><strong><span style="FONT-SIZE: 18pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt"> a, b </span></strong><strong><span style="FONT-SIZE: 18pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是两个实数</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt">, </span></strong><strong><span style="FONT-SIZE: 18pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">且</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt"> a &#8804; b.</span></strong><span lang=EN-US style="FONT-SIZE: 18pt"><br><br><strong>1</strong></span><strong><span style="FONT-SIZE: 18pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）<span style="COLOR: maroon">满足</span></span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon"> </span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: orange">a &#8804; x &#8804; b</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon"> </span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实数</span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon"> </span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: orange">x</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon"> </span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的集合</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon">,</span></strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon"><br><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong></span><strong><span style="FONT-SIZE: 18pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示为</span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon"> </span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: red">[ a, b ]</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon">, </span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">叫做</span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">闭区间</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon">;</span></strong><span lang=EN-US style="FONT-SIZE: 18pt"><br><br><strong>2</strong></span><strong><span style="FONT-SIZE: 18pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）<span style="COLOR: maroon">满足</span></span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon"> </span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: orange">a </span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: orange; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">＜</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: orange"> x </span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: orange; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">＜</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: orange">b</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon"> </span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实数</span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon"> </span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: orange">x</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon"> </span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的集合</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon">,</span></strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon"><br><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong></span><strong><span style="FONT-SIZE: 18pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示为</span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon"> </span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: red">( a, b )</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon">, </span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">叫做</span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开区间</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon">;</span></strong><span lang=EN-US style="FONT-SIZE: 18pt"><br><br><strong>3</strong></span><strong><span style="FONT-SIZE: 18pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）<span style="COLOR: maroon">满足</span></span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon"> </span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: orange">a &#8804; x </span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: orange; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">＜</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: orange">b</span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: orange"> a </span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: orange; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">＜</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: orange">x &#8804; b </span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实数</span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon"> </span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: orange">x</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon"> </span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的集合</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon">,</span></strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon"><br><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong></span><strong><span style="FONT-SIZE: 18pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分别表示为</span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon"> </span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: red">[ a, b )</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon">, </span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: red">( a, b ]</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon">, </span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">叫做</span></strong><strong><span style="FONT-SIZE: 18pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">半开区间</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt; COLOR: maroon">.</span></strong><span lang=EN-US style="FONT-SIZE: 18pt"><br><br></span><strong><span style="FONT-SIZE: 18pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里实数</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt"> a, b </span></strong><strong><span style="FONT-SIZE: 18pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">叫做区间的端点</span></strong><strong><span lang=EN-US style="FONT-SIZE: 18pt">.</span></strong><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: arial; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/70343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-12-25 17:24 <a href="http://www.cppblog.com/woaidongmao/archive/2008/12/25/70343.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开始创立自己的工具，帮助编码</title><link>http://www.cppblog.com/woaidongmao/archive/2008/11/21/67456.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 21 Nov 2008 02:42:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/11/21/67456.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/67456.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/11/21/67456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/67456.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/67456.html</trackback:ping><description><![CDATA[<p>需要建立自己的工具，基于以下的几点：</p> <p>1、编码的工作性质就是操作文本；</p> <p>2、总是在做大量的相似的工作，编写大量可类比的代码，毫无效率；</p> <p>3、人工写代码，往往引入更多的错误，雷同的错误；</p> <p>4、总是花费太多时间在编码上，成了打字员，程序员难道就是做文本处理工作的？；</p> <p>5、找不到适合自己的代码分析处理工具，需求往往和领域挂钩，和个人挂钩，个性化的；</p> <p>6、语言的特性能够在编码上做到一定的智能，简化，比如宏，模版。但是受的限制太多，并且不可能实现你所想要的那种智能，代码自动生成，扩展预处理效果，最后是你会深陷纠缠其中，可能后来却一无所获；</p> <p>7、清澈和运用语言的特性需要大量的经验，实践，耗费大量的时间，倒不如做个代码处理工具吧，就是一个文本分析工具而已，从另一面入手，把编码就看作文本操作，化繁为简；</p> <p>8、自己写的，才是最适合自己，是能够与时俱进的。</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/67456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-11-21 10:42 <a href="http://www.cppblog.com/woaidongmao/archive/2008/11/21/67456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>委托本质的思考</title><link>http://www.cppblog.com/woaidongmao/archive/2008/11/19/67293.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 19 Nov 2008 07:32:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/11/19/67293.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/67293.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/11/19/67293.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/67293.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/67293.html</trackback:ping><description><![CDATA[<p>若A变动，一系列的B,C,D,E,F将变动，可使用委托</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/67293.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-11-19 15:32 <a href="http://www.cppblog.com/woaidongmao/archive/2008/11/19/67293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>未找到解决方案的问题</title><link>http://www.cppblog.com/woaidongmao/archive/2008/11/19/67292.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 19 Nov 2008 07:31:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/11/19/67292.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/67292.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/11/19/67292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/67292.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/67292.html</trackback:ping><description><![CDATA[<p>1、复杂对话框的控件，状态逻辑； <p>2、Log与业务逻辑分离的问题； <p>3、聚合导致接口冗余的问题。</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/67292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-11-19 15:31 <a href="http://www.cppblog.com/woaidongmao/archive/2008/11/19/67292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>保留POD信息可以带来的用处</title><link>http://www.cppblog.com/woaidongmao/archive/2008/11/11/66582.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Tue, 11 Nov 2008 02:30:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/11/11/66582.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/66582.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/11/11/66582.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/66582.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/66582.html</trackback:ping><description><![CDATA[<p>1、从binanry的序列化，装载；</p> <p>2、从XML的序列化，装载；</p> <p>3、从HTML的序列化，装载；</p> <p>4、打印POD；</p> <p>5、POD多键值比较；</p> <p>6、从文件导入导出POD</p> <p>7、基本上依靠保留POD信息，可以实现一个数据库了</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/66582.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-11-11 10:30 <a href="http://www.cppblog.com/woaidongmao/archive/2008/11/11/66582.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不允许出现全局函数</title><link>http://www.cppblog.com/woaidongmao/archive/2008/10/27/65185.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 27 Oct 2008 03:39:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/10/27/65185.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/65185.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/10/27/65185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/65185.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/65185.html</trackback:ping><description><![CDATA[<p>1、如果这个函数带需要有自己才能访问数据，那么它就是应该一个类；</p> <p>2、如果这个函数只是一个过程，没有私有数据，那么他应该属于一组类似过程的一个成员，这一组类似过程就应该是一个类，一个功能或者逻辑单元；</p> <p>3、因此，每当需要增加一个全局函数的时候，就需要考虑它应该是一个什么样的类中间的一个成员函数，于是增加这样的一个类。达到了集中管理的而不是分散而为的模式。</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/65185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-10-27 11:39 <a href="http://www.cppblog.com/woaidongmao/archive/2008/10/27/65185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅层数据结构（结构型）vs 深层数据结构（聚合型）</title><link>http://www.cppblog.com/woaidongmao/archive/2008/10/25/64977.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 24 Oct 2008 18:36:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/10/25/64977.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/64977.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/10/25/64977.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/64977.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/64977.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 构建系统数据模型时，有2共选择，以：group->account->son account举例<br><br>&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2008/10/25/64977.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/64977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-10-25 02:36 <a href="http://www.cppblog.com/woaidongmao/archive/2008/10/25/64977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据对象和业务逻辑对象</title><link>http://www.cppblog.com/woaidongmao/archive/2008/10/25/64975.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 24 Oct 2008 17:32:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/10/25/64975.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/64975.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/10/25/64975.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/64975.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/64975.html</trackback:ping><description><![CDATA[<p>1、数据对象就是数据的容器，或者说配置的管理，只包含基本的装载，保存，增加，删除，修改，查找等操作，需要保证数据的有效性----若多线程则加锁；</p> <p>2、业务逻辑对象，是一组处理过程的集合，一组函数组合成的类，这组函数组合能够代表系统中的一个处理单元或者功能模块，因为不包含数据，所以不需要锁；</p> <p>3、业务逻辑对象需要引用数据对象里面的数据来完成整个流程；</p> <p>4、简单的模块，数据对象和业务逻辑对象可以综合在一个类里面完成，当然这是一种耦合；</p> <p>5、复杂的模块，或者系统由多个模块构成，那么数据对象和业务逻辑对象分离是降低复杂度的好办法，这是一种解耦合；</p> <p>6、一个数据与业务逻辑完全分离的事例是：数据库 + 业务层。数据库是数据的持久，不涉及业务，业务层是逻辑的执行不关心数据的存储。这是一种完全的松耦合；</p> <p>7、从目前所经历以及吸取的教训与经验来看：<font color="#ff0000"><strong>从开始就做到数据的的归数据，业务的归业务，会大大降低复杂度，简化系统，降低耦合，十分必要！</strong></font></p> <p><strong><font color="#ff0000"></font></strong>&nbsp;</p> <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/e59f9a462447_11B3/image_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="211" alt="image" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/e59f9a462447_11B3/image_thumb_1.png" width="481" border="0"></a></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/64975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-10-25 01:32 <a href="http://www.cppblog.com/woaidongmao/archive/2008/10/25/64975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>class在项目中角色汇总</title><link>http://www.cppblog.com/woaidongmao/archive/2008/10/12/63826.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sun, 12 Oct 2008 10:48:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/10/12/63826.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/63826.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/10/12/63826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/63826.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/63826.html</trackback:ping><description><![CDATA[<p>1、抽象接口，abstract；CAPIInterface</p> <p>2、DLL包装后的工厂；CManagerDLL</p> <p>3、上游参与者的调用接口，Command of calling；CAdminCmd</p> <p>4、下游参与者的包装，Ask for doing sth；CSysDataBase</p> <p>5、纯粹的容器，一般是比较大的容器，因为数据种类较多，其中不含执行逻辑；CCommonData</p> <p>6、容器与逻辑的结合体，数据单一，逻辑只关心容器里的数据；COrderFilter</p> <p>7、纯粹的逻辑；CClientCmdCheck</p> <p>8、静态的。CErrorDescription</p> <p>9、对系统API的包装， CNetFuncs</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/63826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-10-12 18:48 <a href="http://www.cppblog.com/woaidongmao/archive/2008/10/12/63826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两种类型的随手记录</title><link>http://www.cppblog.com/woaidongmao/archive/2008/10/12/63823.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sun, 12 Oct 2008 10:22:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/10/12/63823.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/63823.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/10/12/63823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/63823.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/63823.html</trackback:ping><description><![CDATA[<p>开发测试程序的时候，喜欢用笔记录下来一些东西，但是目前都只限于记录下发现和等待修正的bug，</p> <p>那么其实还有另外一种更加重要的信息，以前忘了记录：<font color="#ff0000">代码需要重构地方，比如类的分解，以及如何重构。(这个需要持久保留，所以最好写在电脑里成.txt，而不是纸上)</font></p> <p><font color="#ff0000"></font></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/63823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-10-12 18:22 <a href="http://www.cppblog.com/woaidongmao/archive/2008/10/12/63823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小class模式，降低复杂度</title><link>http://www.cppblog.com/woaidongmao/archive/2008/10/12/63817.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sun, 12 Oct 2008 09:53:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/10/12/63817.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/63817.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/10/12/63817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/63817.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/63817.html</trackback:ping><description><![CDATA[<p>最终还是发现，将粗的类拆分开来，成为，One Funcation------One Class的小类模式， 降低了复杂度，较之前者，效果好很多。原因：</p> <p>1、小class模式，让人的关注点集中了，关注并作好一个小class容易许多；</p> <p>2、小class模式，让一个类的代码不会那么多，容易查找，修改；</p> <p>3、分来开来后，关注减少，更不容易引入错误，把功能拆封到人的思维能力能够控制的规模之内。</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/63817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-10-12 17:53 <a href="http://www.cppblog.com/woaidongmao/archive/2008/10/12/63817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>业务逻辑与界面彻底分离的一个参考原型</title><link>http://www.cppblog.com/woaidongmao/archive/2008/10/12/63818.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sun, 12 Oct 2008 09:53:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/10/12/63818.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/63818.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/10/12/63818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/63818.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/63818.html</trackback:ping><description><![CDATA[<p>如何才能称之为业务逻辑与界面达到了彻底的分离？回答这个问题困难。但是如果能够找到一个参考原型，那就会很好理解。</p> <p>我找的一个参考原型是：SQL Server + SQL Admin</p> <p>1、SQL Server是服务器，它只有业务逻辑，没有界面；</p> <p>2、SQL Admin是SQL Server的界面，没有业务逻辑；</p> <p>3、SQL Server与SQL Admin通过TCP交互，它们是彻底分离的，影射成就是：这是一种业务逻辑与界面彻底分离的完美形式；</p> <p>&nbsp;</p> <p>他们是如何彻底分离？其实很简单：</p> <p>SQL Server提供了SQL Admin的一个TCP命令调用接口，也就是Command模式来完成，影射成就是：程序的业务逻辑应该提供给界面一个Command接口，界面只能够通过Command接口来执行命令，而不能直接操作业务逻辑里面的数据。</p> <p>当然，如果考虑到界面需要不挂起，若Command执行是阻塞模式就有些问题，需要变换成回调返回的异步模式，这会复杂少许。</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/63818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-10-12 17:53 <a href="http://www.cppblog.com/woaidongmao/archive/2008/10/12/63818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对于界面，要封闭，要开放什么</title><link>http://www.cppblog.com/woaidongmao/archive/2008/09/12/61684.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 12 Sep 2008 07:33:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/09/12/61684.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/61684.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/09/12/61684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/61684.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/61684.html</trackback:ping><description><![CDATA[<p>1、对于界面之流，他要Get什么和如何Display我不管，可以给它对象和接口，他可以自己组合成自己的显示，显示永远都不是业务逻辑的部分;</p> <p>2、对于界面之流，他要Change什么我要管，不能让他调用能够改变模型的接口，因为改变肯定是业务逻辑的部分，界面中直接调用方法来改变，意味着业务逻辑存在耦合到界面中的部分，这是不允许的。</p> <p>3、<font color="#ff0000">总结，任何Change都必须通过UserCommand，让UserCommand这个抽象层来完成这个事情，一个参与者会有一系列的命令接口。</font></p> <p>==============================================================================</p> <p>备注：后来的一点领悟，任何改变和执行都是业务逻辑的部分。如果能够确保界面只能够调用Get?，可以通过const来解决。</p> <p>a、界面得到一个const object* 或者const object&amp;;</p> <p>b、const对象或者指针，只能调用const方法，const 方法意味着no change</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/61684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-09-12 15:33 <a href="http://www.cppblog.com/woaidongmao/archive/2008/09/12/61684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>拆分与效率的忧虑</title><link>http://www.cppblog.com/woaidongmao/archive/2008/08/18/59231.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 18 Aug 2008 08:10:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/08/18/59231.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/59231.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/08/18/59231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/59231.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/59231.html</trackback:ping><description><![CDATA[<p>1、一个大的类，拆封成小的类，有没有效率损失？答案是没有的，因为类的本质就是提供接口，进行函数调用。一个大类包含100个函数，与分解成10个小类，每个10个函数，在效率上没有差别；</p> <p>2、小类模式，会不会增加复杂性？答案是部分增加，部分降低。小类模式增加了类的个数，一个项目抽象体越多，复杂度越高，这不容置疑，所有者一部分增加了复杂性。另一方面小类模式，表明一个类只完成需要的功能，所以在层次划分上更加的清晰，这在一个层面上降低了复杂性。</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/59231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-08-18 16:10 <a href="http://www.cppblog.com/woaidongmao/archive/2008/08/18/59231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>逻辑复杂度的评估</title><link>http://www.cppblog.com/woaidongmao/archive/2008/08/08/58292.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 07 Aug 2008 16:10:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/08/08/58292.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/58292.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/08/08/58292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/58292.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/58292.html</trackback:ping><description><![CDATA[<p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/9ecb62c8eb2d_9F/image_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="284" alt="image" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/9ecb62c8eb2d_9F/image_thumb.png" width="686" border="0"></a> </p> <p>观点一：深度带来复杂性</p> <blockquote> <p>模式1为5级深度，模式2为2级深度；</p></blockquote> <p>&nbsp;</p> <p>观点二：深度带来耦合</p> <blockquote> <p>模式1中，A耦合了BCDE, B耦合了CDE, C耦合了DE，D耦合了E, 耦合数目为：10；</p> <p>模式2中：控制器耦合了ABCDE，耦合数据为：5。</p></blockquote> <p>&nbsp;</p> <p>观点三：串联改并联，提取控制逻辑到独立模块，减低复杂度。</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/58292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-08-08 00:10 <a href="http://www.cppblog.com/woaidongmao/archive/2008/08/08/58292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两种模式的选择</title><link>http://www.cppblog.com/woaidongmao/archive/2008/08/07/58291.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 07 Aug 2008 15:54:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/08/07/58291.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/58291.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/08/07/58291.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/58291.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/58291.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2008/08/07/58291.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/58291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-08-07 23:54 <a href="http://www.cppblog.com/woaidongmao/archive/2008/08/07/58291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一定要坚守的原则</title><link>http://www.cppblog.com/woaidongmao/archive/2008/08/05/58100.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Tue, 05 Aug 2008 15:47:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/08/05/58100.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/58100.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/08/05/58100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/58100.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/58100.html</trackback:ping><description><![CDATA[<p>1、不能从算法和数据结构的组织这个层面上考虑设计，而应该从从模块和数据流的层面上考虑设计。把数据流搞清楚，按照需求，拆分成能够完成需求的各自独立的模块，让数据从起点到终点流动，被处理，最后得到结果。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如：数据存储模块、价格发生器、价格过滤器、交叉盘价格合成器、价格发布器、视图模块；</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/ec5826bf7981_14456/image_2.png"><img height=455 alt=image src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/ec5826bf7981_14456/image_thumb.png" width=860></a> </p>
<p>2、根据数据流图，拆分出来的独立模块，设计类；</p>
<p>3、类的分别原则是：属于流程不同模块，即使功能相似或者相近，也不能合成一个类；</p>
<p>4、一个类只做有限的事情，大而全的类虽然有可能是一种方案，但决不是最好的方案，它增加了耦合和复杂性，维护性也很低；</p>
<p>5、类的实现部分，尽量不要直接调用类成员以外的数据，比在类的函数中，直接对某个全局对象调用方法，这样类函数执行的前提是：这个全局对象必须存在，而这是一种耦合。解耦是简单的，那就是把这个全局对象作为类函数的参数传入；</p>
<p>6、类的方法接口，应该只接受能够完成类方法所需要的数据，如果传递一个指针，这个指针包含的内容，可能远远超过类方法所需要的；</p>
<p>7、关于上一点的解决办法是：构建类需要参数的POD，不要怕转换，不要怕生成临时对象，事实上我需要这样做。</p>
<p>&nbsp;</p>
<p>===========================================================================================</p>
<p>改进后的版本</p>
<p>1、界面视图本来可以承担控制器的作用，也就是MVC简化成MV。但是这样就必须让视图来处理命令，试图必须具备双向的能力：即解析命令，并向下执行同步到模型（数据)；根据模型（数据)，同步视图，向上更新界面；</p>
<p>2、控制器和视图集中在视图里面，增加了视图的复杂性，如果增加一个命令控制器，最终变成MVC，那么视图就只需要具备向上更新UI的能力，向下执行命令更改模型（数据)的能力交给了命令控制器。这样就实现了一上一下，各司其职的架构；</p>
<p>3、形成视图的经常不只是一种数据流，往往多种数据流共同形成一个视图：比如下面的结构中，视图是由：配置流，价格流，日志流三种组合而成的；</p>
<p>4、增加命令控制器的作用的事显而易见的，它让业务控制的接口可以脱离视图而存在。反过来理解，如果用视图来同时充当用户命令接口，那么用户命令接口存在的前提是视图必须存在。而视图是多变的，或者说可以根本不存在，那么把用户命令接口放在其中极其不合适。试想一下，一个项目它可以是个对话框，可以是个多文档，也可以是个控制台，多变的界面，多变的视图，但是用户命令接口确实不便的，把用户命令耦合到视图的实现里面去，就不合适了；</p>
<p>5、把命令控制器抽离出来的另一个好处是：集中管理用户的命令，便于维护。试想一个如果对用户命令的处理分散在若干个.cpp文件，几十个C***Dailog的On***Button()消息相应函数里面，理解，调试，维护起来，将是一件多为痛苦的事情；</p>
<p>6、更多想写的一句话，就是业务逻辑，不要和界面耦合起来，<font color=#ff0000>界面需要做的就是：显示视图，接受用户命令两个功能，其他的都没必要在界面里面存在</font>。举个例子，用得很多的MFC OnTimer()函数，事实上定时操作应该是业务逻辑的部分，放在界面里执行就不合适了；</p>
<p>7、<font color=#ff0000>检测界面与业务逻辑耦合程度的一个标志就是：把程序里界面代码剥离后，业务逻辑依然完整，程序依然可以运行。</font>如上面所说的，界面中处理OnTImer()函数，则去掉界面代码后，业务逻辑就不完整了，少了执行定时业务处理的部分，这就是一中明显的界面与业务逻辑耦合。</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/ec5826bf7981_14456/image_6.png"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=462 alt=image src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/ec5826bf7981_14456/image_thumb_2.png" width=842 border=0></a> </p>
<p>8、程序可以分为很多功能模块，命令控制器能够控制这些功能模块的行为是应该，这些功能模块输出信息到视图里面也是应该的。</p>
<p>&nbsp;</p>
<p>===========================================================================================</p>
<p>struct ViewResult<br>{<br>&nbsp;&nbsp;&nbsp; struct ViewSource <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char&nbsp; symbol[12];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digits;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double minprice;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double minspread;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double peerminm;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL&nbsp;&nbsp;&nbsp; usepremium;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double premiumex;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp; session_current;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp;&nbsp; remark[256];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL&nbsp;&nbsp; session_enable;<br>&nbsp;&nbsp;&nbsp; } view_source;<br>&nbsp;&nbsp;&nbsp; struct ViewTrans<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL&nbsp;&nbsp; b_bid_success;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL&nbsp;&nbsp;&nbsp; b_ask_success;<br>&nbsp;&nbsp;&nbsp; }view_trans;<br>&nbsp;&nbsp;&nbsp; struct ViewPrice <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double bid;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double ask;<br>&nbsp;&nbsp;&nbsp; }view_price;<br>};
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; BOOL UpdateViewSource(int index, const ViewResult::ViewSource&amp; vs);<br>&nbsp;&nbsp;&nbsp; BOOL UpdateViewTrans(int index, const ViewResult::ViewTrans&amp; vt);<br>&nbsp;&nbsp;&nbsp; BOOL UpdateViewPrice(int index, const ViewResult::ViewPrice&amp; vp);<br>&nbsp;&nbsp;&nbsp; BOOL UpdateViewMsg(const ViewMsg&amp; vm);<br>p</p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/58100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-08-05 23:47 <a href="http://www.cppblog.com/woaidongmao/archive/2008/08/05/58100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>代码的整理</title><link>http://www.cppblog.com/woaidongmao/archive/2008/06/27/54824.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 27 Jun 2008 10:19:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/06/27/54824.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/54824.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/06/27/54824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/54824.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/54824.html</trackback:ping><description><![CDATA[<p>需要把自己的代码，和得到的代码整理起来放到一个称之为“my self”库里面；</p> <p>到处拷贝，粘贴绝对不是一个好的办法，保存一个备份，而不是多个备份；</p> <p><font color="#ff0000">只有一个备份，也就意味着代码需要达到通用级别的复用，不知不觉，你的设计就会改善。</font></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/54824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-06-27 18:19 <a href="http://www.cppblog.com/woaidongmao/archive/2008/06/27/54824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>语言的语言</title><link>http://www.cppblog.com/woaidongmao/archive/2008/05/17/50119.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 16 May 2008 16:46:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/05/17/50119.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/50119.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/05/17/50119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/50119.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/50119.html</trackback:ping><description><![CDATA[<p>QUOTE: <p><i>原帖由 "albcamus" 发表：</i><br>我感觉那种遇到大型项目问题，觉得目前的开发环境不够完美，从而为此设计一种语言的，都是顶尖级的牛人。一般?......... <p>最近新闻:面向语言的程序设计. <p>QUOTE: <p>借助工具的帮助，允许开发者创建自己的DSL。这样的DSL当然能够最贴切地描述领域问题，从而大大提高开发效率。 <p>&nbsp;</p> <p>&nbsp;</p> <p>[quote]<i>原帖由 "aero"]那种为项目开发语言的事情，应该是计算机的传说了吧。感觉现在，语言足够了。[/quote 发表：</i><br>“为项目”确实太奢侈了。<br>不过好的通用产品大多都有一套自己的脚本语言。<br>毕竟单纯的 .ini 配置文件的功能太弱了，<br>不能适应客户们无穷无尽的需求。<br>因此，要想做一个通用的、面向各种客户的产品，<br>必须要把业务有关的部分从核心里边剥离出来，以便于灵活配置。<br>我这段时间就天天在编这种破脚本，烦死了。</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/50119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-05-17 00:46 <a href="http://www.cppblog.com/woaidongmao/archive/2008/05/17/50119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>函数、模块、耦合</title><link>http://www.cppblog.com/woaidongmao/archive/2008/04/16/47304.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 16 Apr 2008 10:36:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/04/16/47304.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/47304.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/04/16/47304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/47304.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/47304.html</trackback:ping><description><![CDATA[<p>1、函数就是一个模块，必须独立；</p> <p>2、尽一切减少关联，降低耦合；</p> <p>3、努力不要调用其他对象，变量，仅仅完成自己的功能，如果要调用，应该作为变量传入；</p> <p>4、一点涉及到与具体应用相关的对象，那么这个源码的复用就是一句屁话。</p> <p>5、函数的调用规则应该是控制逻辑里的事情；</p> <p>6、耦合的模块很难进行自动化的单元测试。</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/47304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-04-16 18:36 <a href="http://www.cppblog.com/woaidongmao/archive/2008/04/16/47304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>服务器编程的思考</title><link>http://www.cppblog.com/woaidongmao/archive/2008/04/16/47220.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 16 Apr 2008 06:02:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/04/16/47220.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/47220.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/04/16/47220.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/47220.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/47220.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp; 1、所谓服务器软件，就是通过协议解析等等手段，把远在internet网络上的现实参与者，映射为系统内核里的抽象参与者，继而而加以处理。这里是“参与者”的概念，相当于系 统首先把外在的用户个体，一步一步拉近，抽象，最终变成系统内部的一个操作接口集合。另外，因为内部参与者是外部用户的在系统内的一个映射，需要维护好这一层关系。<br>&nbsp;&nbsp; <br>2、如果系统服务多个参与者，而参与者之间本身就存在交互的话。是让参与者直接交互还是通过间接的“桥”来交互。也就是说，系统内的参与者需要对系统了解吗？是需要了解多个接口还是一个接口？还是把系统当作一个黑盒来使用还是一个白盒来使用？后者耦合降低。但是作为“桥”的那个东西，复杂性也不言而喻，需要多多考虑一下；</p> <p>3、系统内的数据应该属于业务逻辑层还是数据层？关键的一点就是看这个数据对象是否需要持久性，是不是只是运行时存在。举个例子来说，数据库属于数据层，但是从数据库内取出数据缓存在系统内，用作判断就属于业务逻辑层内的东西。业务逻辑层的东西可以灵活构造，但是数据层的数据就相对稳定，也只要支持少量的接口，比如增、 删、修等。不能在数据层加入业务逻辑判断的代码，否则导致数据层和业务层耦合。业务逻辑如果需要判断数据层内部的一些东西，应该把这些数据缓存到业务层的零时对象内。</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/47220.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-04-16 14:02 <a href="http://www.cppblog.com/woaidongmao/archive/2008/04/16/47220.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>