﻿<?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++博客-deepway-文章分类-设计方法 &amp;　编程方法</title><link>http://www.cppblog.com/maxime/category/14157.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 14 Aug 2010 10:51:21 GMT</lastBuildDate><pubDate>Sat, 14 Aug 2010 10:51:21 GMT</pubDate><ttl>60</ttl><item><title>C++ 的前景和价值</title><link>http://www.cppblog.com/maxime/articles/122887.html</link><dc:creator>maxime</dc:creator><author>maxime</author><pubDate>Tue, 10 Aug 2010 00:27:00 GMT</pubDate><guid>http://www.cppblog.com/maxime/articles/122887.html</guid><wfw:comment>http://www.cppblog.com/maxime/comments/122887.html</wfw:comment><comments>http://www.cppblog.com/maxime/articles/122887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/maxime/comments/commentRss/122887.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/maxime/services/trackbacks/122887.html</trackback:ping><description><![CDATA[一方面在企业级系统开发（数据密集、业务规则复杂多变）中，C++已经基本被Java和C#等淘汰出局，另一方面在系统编程和嵌入式等更接近硬件的领域，又遭到C的强烈狙击。<br><br>如果在你的应用中，有两个需求同时发生，你就必须要考虑采用C++，第一是对性能的要求要高，还有一个是有很强的抽象和建模能力。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- <a title="专访Andrei Alexandrescu：对C++要有信心 保持乐观" href="http://blog.csdn.net/kamaliang/archive/2009/03/16/3995249.aspx">专访Andrei Alexandrescu：对C++要有信心 保持乐观</a><br><br><br>好的C++代码就是高效的、安全的、清晰的代码。<br><br>第一准则：将C++用在合适的地方，C++最适合用来开发&#8220;高性能的复杂组件&#8221;。<br><br>第二准则：选择了C++，就等于选择了C++的不安全性，请适应这一点，不要试图把C++变成另一个Java。<br><br>第三准则：按过程思考问题、按对象写代码，抽象化和模块化（接口）放在首位，其次才是复用性。<br>（保证代码安全的首要因素是抽象化、模块化，其次是设计规范性和代码规范性，最后才是智能指针等语言工具）<br><br>第四准则：按设计思路变更代码，不要按代码改代码。<br><br>第五准则：按编程范型做设计、按模式和规范书写代码。（范型是在充分理解问题域的基础上，对问题域作出合理的约束）<br><br>第五准则：复用性没有想象中重要，重复的理由之一是复杂，不要为了消除重复，让系统变得更复杂、更难以理解。<br><br>第六准则：保持代码可靠的办法是时间，好的代码是累积出来的，请用好代码版本管理工具。<br><br>第七准则：阅读、复查代码是发现bug的最有效的方法，请在单元测试之前、之后各做一次。<br><br>第八准则：请编写单元测试，它是发现常规bug的最可靠、最廉价的方法。<br><br>第九准则：请慎重使用智能指针、异常、模板，它们在解决问题的同时往往也引入了复杂性，必须对此作出权衡。<br><br>第十准则：请使用断言、日志、转储、调试工具，它们是解决bug的最后防线。<br><br>第十一准则：请在不影响性能的前提下，尽量使用C++标准库中的字符串、流、容器、算法等，编写安全、可靠的代码。<br><br>第十二准则：尽量使用优秀的开源项目组件库。<br><br><br>
<img src ="http://www.cppblog.com/maxime/aggbug/122887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/maxime/" target="_blank">maxime</a> 2010-08-10 08:27 <a href="http://www.cppblog.com/maxime/articles/122887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发环境备忘录</title><link>http://www.cppblog.com/maxime/articles/122132.html</link><dc:creator>maxime</dc:creator><author>maxime</author><pubDate>Tue, 03 Aug 2010 18:00:00 GMT</pubDate><guid>http://www.cppblog.com/maxime/articles/122132.html</guid><wfw:comment>http://www.cppblog.com/maxime/comments/122132.html</wfw:comment><comments>http://www.cppblog.com/maxime/articles/122132.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/maxime/comments/commentRss/122132.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/maxime/services/trackbacks/122132.html</trackback:ping><description><![CDATA[开发环境备忘录<br><br>开源项目托管：<br><a href="http://code.google.com/intl/zh-CN/"><u><font color=#810081>http://code.google.com/intl/zh-CN/</font></u></a><br><a href="http://www.codeplex.com/">http://www.codeplex.com/</a><br><br>代码版本管理：<br><a href="http://subversion.apache.org/">http://subversion.apache.org/</a><br><br>构建工具：<br><a href="http://buildbot.net/trac">http://buildbot.net/trac</a><br><br>代码排版检查：<br><a href="http://code.google.com/p/google-styleguide/">http://code.google.com/p/google-styleguide/</a><br><a href="http://code.google.com/p/zh-google-styleguide/">http://code.google.com/p/zh-google-styleguide/</a><br><a href="http://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py">http://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py</a><br><br>代码审查：<br><a href="http://www.reviewboard.org/downloads/">http://www.reviewboard.org/downloads/</a><br><br>单元测试：<br><a href="http://code.google.com/p/googletest/">http://code.google.com/p/googletest/</a><br><a href="http://code.google.com/p/gmock/">http://code.google.com/p/gmock/</a><br><br>日志模块：<br><a href="http://log4cplus.sourceforge.net/">http://log4cplus.sourceforge.net/</a><br><a href="http://code.google.com/p/google-glog/">http://code.google.com/p/google-glog/</a><br><br>内存模块：<br><a href="http://code.google.com/p/google-perftools/">http://code.google.com/p/google-perftools/</a><br><br>高性能网络组件<br>libevent<br>ACE<br>ICE<br><br>序列化模块<br><a href="http://code.google.com/p/protobuf/">http://code.google.com/p/protobuf/</a><br><br>
<img src ="http://www.cppblog.com/maxime/aggbug/122132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/maxime/" target="_blank">maxime</a> 2010-08-04 02:00 <a href="http://www.cppblog.com/maxime/articles/122132.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件中的错误分类</title><link>http://www.cppblog.com/maxime/articles/122004.html</link><dc:creator>maxime</dc:creator><author>maxime</author><pubDate>Mon, 02 Aug 2010 13:37:00 GMT</pubDate><guid>http://www.cppblog.com/maxime/articles/122004.html</guid><wfw:comment>http://www.cppblog.com/maxime/comments/122004.html</wfw:comment><comments>http://www.cppblog.com/maxime/articles/122004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/maxime/comments/commentRss/122004.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/maxime/services/trackbacks/122004.html</trackback:ping><description><![CDATA[<p>错误一词，在软件开发中，概念已经非常泛滥，本文中暂时指，软件中的一切非正常现象和事件。</p>
<p>低层事件：指硬件相关的错误，比如，除零、浮点错误、内存违例、中断指令。按照C++的观点，它们不属于C++异常的范畴，应由底层错误处理机制（检查防范或SEH异常）来防范或者包装成C++异常（笔者注：应该是从处理效率的角度考虑的）。具体来说，除零和浮点错误，应以防范为主，为了效率也可以用SEH保护代码段；中断指令属于用户特殊行为，由用户自行处理；内存违例，应该是绝对禁止的，以防范为主，一旦出现，即应该以未捕获的SEH异常的形式，抛给调试报错工具处理，必要时由其进行错误现场转储（笔者注：由于Win32各个平台下，默认调试报错工具常不一致、还受安装的调试软件影响，所以实践中，推荐用自定义的未捕获SEH异常处理函数替换系统标准处理过程，更可靠实现错误现场转储）。</p>
<p>C运行库事件：指abort调用、运行时安全检查(堆栈溢出)、_invalid_parameter错误。同样它们不属于C++异常的范畴，一旦出现，也立即终止程序。VC2005 C运行库将其直接抛给系统级的未捕获SEH异常处理函数来处理。(笔者注：可用_set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT), signal(SIGABRT, ...), _set_invalid_parameter_handler，来截获处理。而堆栈溢出，则需要截获UnhandledExceptionFilter来实现)。</p>
<p>标准C++库事件：new、terminate、unexpected调用。这些事件默认以SEH未捕获异常的方式处理。</p>
<p>SEH异常：SEH异常包括了上述的底层事件。SEH异常机制不释放局部对象，因此只推荐用于对底层异常机制的包装。</p>
<p>C++异常：按照C++异常被看成了一种错误处理机制，因此，它并不把底层事件看作异常，而只把throw视为异常，即C++异常机制只直接捕获软件异常，硬件异常需要间接捕获。理解这一点，将有助于我们真正理解C++异常是一种软件手段，而不是保护程序的万能灵药。C++异常会自动释放局部对象，这使得C++异常真正具有了资源安全性，当然前提是，使用局部对象自动释放的机制来保护资源分配。C++异常是应用层开发中错误处理的重要工具，这一点显然还未得到足够的重视，当然这是由于设计、使用C++异常都需要全新的思维观和设计技巧。</p>
<p>附：同步异常与异步异常<br>1) VC的C++ Exception 采用两种模式捕获异常：同步模式和异步模式。VC的工程的调试版本缺省使用异步模式，工程的发布版本缺省使用同步模式。在同步模式下，VC的编译器假定代码中只有在显示使用throw和调用函数的时候才会引发异常，因此，在同步模式下，VC编译出的代码比较小，但在这种模式下，try-catch对不能捕获内存访问异常与算术除零异常等。在异步模式下，VC的编译器为try块内的每一条语句生成异常捕获代码，在这种情况下，他能够捕获全部的异常，还能保证栈上对象在解栈中正确释放。为了要在发行版本中也能够捕获全部异常就需要打开异步模式，但代价是程序编译出代码变大，运行速度变慢。<br>2)编译选项：<br>同步模式的编译选项为/EHs或者/GX(等同于/EHsc)<br>异步模式的编译选项为/EHa<br></p>
<img src ="http://www.cppblog.com/maxime/aggbug/122004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/maxime/" target="_blank">maxime</a> 2010-08-02 21:37 <a href="http://www.cppblog.com/maxime/articles/122004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件运行日志</title><link>http://www.cppblog.com/maxime/articles/121988.html</link><dc:creator>maxime</dc:creator><author>maxime</author><pubDate>Mon, 02 Aug 2010 10:05:00 GMT</pubDate><guid>http://www.cppblog.com/maxime/articles/121988.html</guid><wfw:comment>http://www.cppblog.com/maxime/comments/121988.html</wfw:comment><comments>http://www.cppblog.com/maxime/articles/121988.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/maxime/comments/commentRss/121988.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/maxime/services/trackbacks/121988.html</trackback:ping><description><![CDATA[<p>软件运行日志&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>--------------------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp; 现代软件日益复杂，彻底消除软件中的错误已经被证明是不可能的，那么，及时发现错误、定位错误现场信息，迅速排除软件错误就成为非常重要的事情，甚至在软件实际运行环境中也是如此。软件运行日志就是捕获错误现场信息的一种重要手段。</p>
<p>&nbsp;&nbsp;&nbsp; 软件运行日志是给谁看的？我认为是软件维护人员、资深客户（比如客户方的系统管理员）。软件中的错误信息，应该分为两类，一类是软件用户能够理解的，另一类是软件用户不能理解的，需要软件维护人员介入的。前者，通常与软件用户的操作行为相关，软件用户在得到提示后，可以自行进行处理；而后者，通常与软件自身缺陷、软件部署环境问题相关的，只有软件维护人员才能处理的。很明显，对于后者的详细内容，没必要用告警对话框的方式提供给软件用户，而且这样做，会大大增加软件错误处理的复杂度。直接将其写入运行日志，是最简便、也最可靠的方法。可以想象下面的场景，应用软件在某台电脑上运行出错，软件维护人员或客户方系统管理员查看运行日志，发现了一些系统模块调用失败的信息，并与开发人员远程沟通，开发人员根据这些信息，迅速定位报告错误的代码，随后开发人员可能反馈，某个系统组件没有的到正确的配置，也可能反馈，软件中有一处缺陷，将在下一个版本或补丁包中得到修正。不管是哪一种情况，这一过程让我们感到的是效率和愉悦。</p>
<p>&nbsp;&nbsp;&nbsp; 在了解到软件日志是给谁看的之后，我们就可以合理制定软件中的错误处理策略。一些错误，我们需要逐层向上报，最终得到妥善处理或者向用户给出提示；另一些错误，我们直接将其信息写入软件运行日志，并向上反馈本函数发生了错误，未能成功执行。</p>
<p>&nbsp;&nbsp;&nbsp; 软件运行日志的内容有哪些？我认为可以分为：关键信息提示、警告提示、错误提示、致命问题提示、调试日志。关键信息提示，是指软件执行到了某些重要的节点，就将相应的信息写入软件运行日志，通过这些关键信息提示，我们可以了解软件的大致运行过程是否正常，而它成本非常低廉，相比安装庞大的开发调试环境。警告提示和错误提示，都是用于提示软件中的错误，那么两者之间的区别如何界定呢？还有，调试日志也是报告软件错误的，与这两者又如何相区别呢？</p>
<p>&nbsp;&nbsp;&nbsp; 我认为，调试日志与警告提示、错误提示的本质性区别在于，调试日志是面向开发人员的，是从软件执行的角度发出的；警告提示、错误提示是从软件功能的角度发出的。换而言之，调试日志是记录软件运行中的非正常现象，而警告提示、错误提示是记录软件某项功能失常的相关信息。</p>
<p>&nbsp;&nbsp;&nbsp; 我认为，警告提示、错误提示的本质性区别在于，警告提示是软件功能出现问题，但没有彻底失效；错误提示，就是此项功能完全失效，该项功能停止执行，立即返回；致命问题提示，则是软件整体安全受到威胁。反映到程序中，通常就是，在一个函数中检测到错误后，该函数以失败的方式返回，就报告错误提示；若函数仍能继续执行，就报告告警提示；若该错误严重违例，比如断言违例、内存溢出、堆栈溢出等威胁稳定性的错误，就报告致命问题提示。</p>
<p>&nbsp;&nbsp;&nbsp; 一般来说，致命性提示，通常是与软件自身缺陷引起的，应当引起开发人员的重视；警告提示、错误提示多半是软件运行环境配置问题引起的，但也不排除软件缺陷、用户操作等因素，应当引起软件维护人员、系统管理员的注意。</p>
<p>&nbsp;&nbsp;&nbsp; 对于软件维护人员，调试日志意义不大，而其数据输出量却往往相当大，因此，在软件部署运行环境下，通常应当通过配置开关，关闭调试日志输出。只有开发人员介入后，才有必要打开该开关，从而在缺乏调试工具的环境中，获得丰富的调试信息。</p>
<p>&nbsp;&nbsp;&nbsp; 总的来说，将每一种错误、每一种软件环境配置问题都以对话框的方式提示出来，或许可以减小维护成本，代价却是开发成本成几何级数增长；软件开发中省掉错误处理，的确可减少一些成本，代价是即便一个环境配置问题，都需要开发人员现场调试，软件维护成本大大增加。而软件运行日志，无疑是两者之间取得平衡的关键性武器。<br></p>
<img src ="http://www.cppblog.com/maxime/aggbug/121988.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/maxime/" target="_blank">maxime</a> 2010-08-02 18:05 <a href="http://www.cppblog.com/maxime/articles/121988.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编程的首要原则(s)是什么？</title><link>http://www.cppblog.com/maxime/articles/118890.html</link><dc:creator>maxime</dc:creator><author>maxime</author><pubDate>Mon, 28 Jun 2010 13:08:00 GMT</pubDate><guid>http://www.cppblog.com/maxime/articles/118890.html</guid><wfw:comment>http://www.cppblog.com/maxime/comments/118890.html</wfw:comment><comments>http://www.cppblog.com/maxime/articles/118890.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/maxime/comments/commentRss/118890.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/maxime/services/trackbacks/118890.html</trackback:ping><description><![CDATA[<blockquote>
<p><strong>KISS - Keep It Simple Stupid </strong></p>
<p><strong>DRY - Don't Repeat Yourself </strong></p>
<p><br>在这两句面前，我再写下任何东西都是多余的。</p>
<p>剩下的就是牢记和实践!<br><br>（此文是阅读下文的笔记。<a href="http://blog.csdn.net/pongba/archive/2009/03/09/3974110.aspx">http://blog.csdn.net/pongba/archive/2009/03/09/3974110.aspx</a>）</p>
<p>&nbsp;</p>
<p><br>Make it work, make it right, make it effective.<br>DOTDIW原则(Do One Thing,Do It Well).<br><br>摘自<a href="http://www.cppblog.com/converse/">http://www.cppblog.com/converse/</a></p>
</blockquote>
<img src ="http://www.cppblog.com/maxime/aggbug/118890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/maxime/" target="_blank">maxime</a> 2010-06-28 21:08 <a href="http://www.cppblog.com/maxime/articles/118890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>