﻿<?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++博客-蔚蓝海岸-最新评论</title><link>http://www.cppblog.com/luckycat/CommentsRSS.aspx</link><description>摇曳着曙光,
那支温柔漂亮的笔杆,
用孩子的笔体写下:相信未来!</description><language>zh-cn</language><pubDate>Wed, 26 May 2010 12:46:43 GMT</pubDate><lastBuildDate>Wed, 26 May 2010 12:46:43 GMT</lastBuildDate><generator>cnblogs</generator><item><title>re: Google Test测试框架</title><link>http://www.cppblog.com/luckycat/archive/2010/05/26/116417.html#116422</link><dc:creator>luckycat</dc:creator><author>luckycat</author><pubDate>Wed, 26 May 2010 15:00:00 GMT</pubDate><guid>http://www.cppblog.com/luckycat/archive/2010/05/26/116417.html#116422</guid><description><![CDATA[@ouyang<br>GoogleTest同样可以用于测试Win32 GUI Application。<br>你的想法可能是MFC写出来的应用是没有对应的控制台，所以GoogleTest无法将输出结果显示出来(实际上Win GUI应用程序也可以同时具备Console Output，只不过这需要手工编码实现，默认情况下是没有的)，当然GoogleTest已经考虑到这个问题了，GoogleTest支持将测试结果以XML文件格式输出.参考下面的链接:<a target="_new" href="http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide#Controlling_Test_Output">http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide#Controlling_Test_Output</a><img src ="http://www.cppblog.com/luckycat/aggbug/116422.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luckycat/" target="_blank">luckycat</a> 2010-05-26 23:00 <a href="http://www.cppblog.com/luckycat/archive/2010/05/26/116417.html#116422#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: Google Test测试框架</title><link>http://www.cppblog.com/luckycat/archive/2010/05/26/116417.html#116420</link><dc:creator>ouyang</dc:creator><author>ouyang</author><pubDate>Wed, 26 May 2010 14:25:00 GMT</pubDate><guid>http://www.cppblog.com/luckycat/archive/2010/05/26/116417.html#116420</guid><description><![CDATA[感觉Google Test测试一下WIN32无界面程序还算可以，测试MFC程序就没法测试了？<img src ="http://www.cppblog.com/luckycat/aggbug/116420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luckycat/" target="_blank">ouyang</a> 2010-05-26 22:25 <a href="http://www.cppblog.com/luckycat/archive/2010/05/26/116417.html#116420#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: C/C++ Debug工具</title><link>http://www.cppblog.com/luckycat/archive/2010/04/06/108515.html#111726</link><dc:creator>Tuotoo</dc:creator><author>Tuotoo</author><pubDate>Tue, 06 Apr 2010 02:25:00 GMT</pubDate><guid>http://www.cppblog.com/luckycat/archive/2010/04/06/108515.html#111726</guid><description><![CDATA[#ifdef DEBUG<br>应该是<br>#ifndef DEBUG<br>吧？<img src ="http://www.cppblog.com/luckycat/aggbug/111726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luckycat/" target="_blank">Tuotoo</a> 2010-04-06 10:25 <a href="http://www.cppblog.com/luckycat/archive/2010/04/06/108515.html#111726#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: C/C++ Debug工具</title><link>http://www.cppblog.com/luckycat/archive/2010/03/16/108515.html#109798</link><dc:creator>zmm</dc:creator><author>zmm</author><pubDate>Tue, 16 Mar 2010 00:57:00 GMT</pubDate><guid>http://www.cppblog.com/luckycat/archive/2010/03/16/108515.html#109798</guid><description><![CDATA[为什么要包括在do{}while中呢？<img src ="http://www.cppblog.com/luckycat/aggbug/109798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luckycat/" target="_blank">zmm</a> 2010-03-16 08:57 <a href="http://www.cppblog.com/luckycat/archive/2010/03/16/108515.html#109798#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 设计的两难:选择异常还是两段构造</title><link>http://www.cppblog.com/luckycat/archive/2010/03/08/108899.html#109159</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Sun, 07 Mar 2010 17:28:00 GMT</pubDate><guid>http://www.cppblog.com/luckycat/archive/2010/03/08/108899.html#109159</guid><description><![CDATA[@luckycat<br>两段构造的话，你的类的其他成员函数也应该在构造不成功的时候抛出异常，并没有任何区别，我的例外还减少了别人可能忘记第二段构造的概率。<br><br>当然这是对一个库的要求，应用程序不一定要如此严格。<img src ="http://www.cppblog.com/luckycat/aggbug/109159.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luckycat/" target="_blank">陈梓瀚(vczh)</a> 2010-03-08 01:28 <a href="http://www.cppblog.com/luckycat/archive/2010/03/08/108899.html#109159#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 设计的两难:选择异常还是两段构造</title><link>http://www.cppblog.com/luckycat/archive/2010/03/06/108899.html#109069</link><dc:creator>luckycat</dc:creator><author>luckycat</author><pubDate>Sat, 06 Mar 2010 13:27:00 GMT</pubDate><guid>http://www.cppblog.com/luckycat/archive/2010/03/06/108899.html#109069</guid><description><![CDATA[@陈梓瀚(vczh)<br>你列举的判断标准都值得借鉴，不过你后续补充的对&quot;例外情况&quot;的处理方式不敢苟同:<br>因为构造可能没有成功，那么我们需要调用IsAvailable之类的函数，甚至于后续需要因为判断之前构造函数的状态来<br>对调用的每个成员函数进行&quot;try catch&quot;或者还要从&quot;每个成员函数的返回值中来判断之前的构造操作是否成功&quot;.<br>这种设计是可行的，但对类的使用者来说太复杂.<br>这种情况下我觉得使用&quot;两段构造&quot;可能更好一些，我们只需要判断&quot;两段构造&quot;是否成功即可，如果构造成功，在后续的成员函数调用过程中，<br>就再也不用为了确认构造函数的状态来对每个被调用的成员函数进行&quot;try catch&quot;或检查返回值的操作，这样的设计应该更简洁一些.<img src ="http://www.cppblog.com/luckycat/aggbug/109069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luckycat/" target="_blank">luckycat</a> 2010-03-06 21:27 <a href="http://www.cppblog.com/luckycat/archive/2010/03/06/108899.html#109069#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 设计的两难:选择异常还是两段构造</title><link>http://www.cppblog.com/luckycat/archive/2010/03/06/108899.html#109067</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Sat, 06 Mar 2010 13:06:00 GMT</pubDate><guid>http://www.cppblog.com/luckycat/archive/2010/03/06/108899.html#109067</guid><description><![CDATA[对于类库的设计者，其实有一个很简单的判断标准。<br><br>1：如果一个输入错误，调用者必须知道并处理，那么就采用“不处理就崩溃”方法，迫使调用者处理。在C++里面的唯一方法就是使用异常了。举个例子，对一个容器的下标访问越界，这个时候operator[]不可能返回一个可用的返回值，而且也不能用错误信息去污染返回值，譬如返回pair&lt;bool, T&gt;，因此直接抛出异常。<br><br>2：如果一个构造函数发生错误之后，这个对象是绝对不能被碰的，那么采用异常。因为在try-catch结构里面，构造函数完蛋了，那么那个正在被构造的对象你是没有办法获取的。<br><br>3：异常可以用来在大量函数互相递归的时候（譬如说语法分析器）迅速跳到最外层，此处作为控制代码流程而使用。<br><br>这里我也接受一个例外，譬如说2，如果构造函数发生错误但是我并不想立刻抛出异常（因为有些状态在构造函数里面想知道也比较麻烦），那么除了需要一个类似bool IsAvailable()const函数来告诉你以外，所有该类成员的非法操作（譬如说在错误的构造状态下调用一个成员函数）都必须抛出异常，或者【绝对不产生任何副作用】的同时给一个返回值说明调用失败。<img src ="http://www.cppblog.com/luckycat/aggbug/109067.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luckycat/" target="_blank">陈梓瀚(vczh)</a> 2010-03-06 21:06 <a href="http://www.cppblog.com/luckycat/archive/2010/03/06/108899.html#109067#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 设计的两难:选择异常还是两段构造</title><link>http://www.cppblog.com/luckycat/archive/2010/03/06/108899.html#109011</link><dc:creator>chentan</dc:creator><author>chentan</author><pubDate>Sat, 06 Mar 2010 00:55:00 GMT</pubDate><guid>http://www.cppblog.com/luckycat/archive/2010/03/06/108899.html#109011</guid><description><![CDATA[qiaojie 讨论很精彩<br>我的习惯是 模块边界会检查参数合法性，并报告给调用者<br>模块内部的代码尽量多的用assert<img src ="http://www.cppblog.com/luckycat/aggbug/109011.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luckycat/" target="_blank">chentan</a> 2010-03-06 08:55 <a href="http://www.cppblog.com/luckycat/archive/2010/03/06/108899.html#109011#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 设计的两难:选择异常还是两段构造</title><link>http://www.cppblog.com/luckycat/archive/2010/03/05/108899.html#109002</link><dc:creator>luckycat</dc:creator><author>luckycat</author><pubDate>Fri, 05 Mar 2010 14:40:00 GMT</pubDate><guid>http://www.cppblog.com/luckycat/archive/2010/03/05/108899.html#109002</guid><description><![CDATA[@qiaojie<br>谢谢赐教!<br><br>&quot;像std::invalid_arguement基本没人会去用&quot;这句话说得有点绝对了，用的人应该还是有一些的，可能我们没有接触到.<br>另外，我们总是被&quot;天朝&quot;代表，想不到这次被 qiaojie 代表了:)<br><br>你说&quot;保证参数的正确性是调用者的责任，而不是被调用的函数的责任&quot;，<br>这一点我也同意，不过我觉得作为函数的设计者，我们不应当对用户所传递的参数有太多理想化的假设，所以我们应当在函数中进行参数合法性的检查，<br>一方面，可以在函数的入口处尽早发现非法参数的问题，这样就不至于后续会使用错误的参数在函数中进行一些无意义的操作.<br>另一方面，在函数入口处检查参数的合法性，可以增强函数的健壮性，进一步增强系统的健壮性.<br>举个例子，如果传递给函数的实参不应该是NULL指针，用户却以NULL作为实参调用函数，假设我们没有进行对应参数合法性检查，<br>那么后续基于这个NULL实参的操作可能会导致系统&quot;coredump&quot;.<br><br>对于参数的合法性检查，在debug版本和release版本下应该都需要进行，类似于&quot;assert(0 &lt; age &amp;&amp; age &lt; 200);&quot;这种检测参数的合法性的代码只在debug版本下可以起作用，<br>在release版本下就不起用了，也就不能在release版本下作为参数合法性检查的工具.<br>在debug版本下，如果assert断言失败，那么我们可以看到对应的abort信息，然后程序异常退出.<br>实际上这样做可能有的时候并不合适，因为在一些情况下，仅仅是参数非法，我们可以进行相应的处理而不需要系统因此而退出运行.<br><br>&quot;强调不要用异常或者错误返回值，是因为盲目的大量使用这类错误处理机制会导致整个项目变得混乱&quot;<br>这句话如果仅仅是理论上来探讨&quot;如何让系统设计的更优雅&quot;，那么这无疑可以作为一个&quot;系统设计准则&quot;，<br>但是在实际的开发过程中，有的时候一个函数内部出现&quot;非正常情况&quot;的可能性实在是太多了，我们必须要进行相应的处理.<br>如果我们既不使用&quot;异常&quot;也不使用&quot;返回错误码&quot;的形式来告知调用者，<br>那么在反馈给调用者&quot;函数内部出现非正常情况&quot;这一点上我们将&quot;无能为力&quot;，但我们又必须在这一点有所作为.<br><br>在大多数情况下，&quot;异常&quot;和&quot;错误码&quot;可能是我们仅有的两个选择方案，如何选择其一作为最终的处理方案，<br>甚至如何在不使用&quot;异常&quot;和&quot;错误码&quot;的前提下也达到相同的效果，这是一件很&quot;纠结&quot;的事情.<br><br><br>追求系统在架构和代码设计上的完美是开发者的一个方向，但是有时我们需要考虑&quot;追求完美的代价&quot;，<br>在时间，人力以及成本的多重影响下，很多时候我们必须放弃对最优方案的探索，而选择一种&quot;不那么完美但是可行，可以很好解决问题&quot;的方案.<br>也许这个时候作为函数调用状态反馈的&quot;异常&quot;和&quot;错误码&quot;机制会在我们的思考和运用范围之内.<br><br><br><img src ="http://www.cppblog.com/luckycat/aggbug/109002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luckycat/" target="_blank">luckycat</a> 2010-03-05 22:40 <a href="http://www.cppblog.com/luckycat/archive/2010/03/05/108899.html#109002#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 设计的两难:选择异常还是两段构造</title><link>http://www.cppblog.com/luckycat/archive/2010/03/05/108899.html#109000</link><dc:creator>qiaojie</dc:creator><author>qiaojie</author><pubDate>Fri, 05 Mar 2010 13:56:00 GMT</pubDate><guid>http://www.cppblog.com/luckycat/archive/2010/03/05/108899.html#109000</guid><description><![CDATA[@luckycat<br>保证参数的正确性是调用者的责任，而不是被调用的函数的责任，如果你对此有疑问的话可以去阅读一下契约式编程。当然，我并没有说不需要去检查参数的合法性，而是强调应该用assert(0 &lt; age &amp;&amp; age &lt; 200);这样的断言来检查参数合法性，这个为什么强调不要用异常或者错误返回值，是因为盲目的大量使用这类错误处理机制会导致整个项目变得混乱，如果任意一个带参数的函数都会因为参数非法而抛异常，那么我在外面接到异常的时候会非常困惑，到底该如何正确处理那么多可能出现的异常？如果是用错误返回值的话就更麻烦，每个函数调用都要进行检查，代码及其繁琐。错误处理机制是整个软件设计的重要环节，他不像接口设计那么显而易见，所以在设计上更应该小心规划合理使用，在<br>哪里会出异常，哪里该接异常应该做到心中有数正确处理，否则就会陷入混乱。<br>当然，凡事无绝对，我说的这种使用方式并不适用于组件级或者系统级程序，系统级程序必须要采用防御性编程策略来检测参数的合法性并向调用者报告错误（因为无法预期调用者如何调用函数），这常需要付出代价，常导致系统级提供的API接口跟应用程序之间阻抗适配，需要在应用程序内进行适当的封装。而你的例子显然不属于这类程序。<br><br>另外你拿std::invalid_arguement出来我觉得毫无意义，C++标准里不成熟不完善甚至很烂的东西多了去，说上三天三夜也说不完。C++的异常机制尤其不完善，备受争议。像std::invalid_arguement基本没人会去用。<img src ="http://www.cppblog.com/luckycat/aggbug/109000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luckycat/" target="_blank">qiaojie</a> 2010-03-05 21:56 <a href="http://www.cppblog.com/luckycat/archive/2010/03/05/108899.html#109000#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>