大家觉得那种书写风格更好,这我和网上下载的一个外国人的代码对比

pgmsoul 2010-10-28 10:40:13
先看他的代码

HRESULT CPortForwardEngine::GetNextMapping( IEnumVARIANT* piEnumerator, CPortForwardEngine::PortMappingContainer& mappingContainer )
{
// uses the enumerator to get the next mapping and fill in a mapping container structure

USES_CONVERSION; // for conversion to CString's
if ( piEnumerator == NULL )
{
return E_FAIL;
}

VARIANT varCurMapping;
VariantInit(&varCurMapping);

HRESULT result = piEnumerator->Next( 1, &varCurMapping, NULL);
if( !SUCCEEDED(result) )
{
return E_FAIL;
}

if ( varCurMapping.vt == VT_EMPTY )
{
return E_FAIL;
}

IStaticPortMapping* piMapping = NULL;
IDispatch* piDispMap = V_DISPATCH(&varCurMapping);
result = piDispMap->QueryInterface(IID_IStaticPortMapping, (void **)&piMapping);
if( !SUCCEEDED(result) )
{
return E_FAIL;
}


// get external address

BSTR bStr = NULL;

result = piMapping->get_ExternalIPAddress( &bStr );
if( !SUCCEEDED(result) )
{
piMapping->Release();
piMapping = NULL;
return E_FAIL;
}

if( bStr != NULL )
mappingContainer.ExternalIPAddress = CString( OLE2T( bStr ) );

SysFreeString(bStr);
bStr = NULL;


// get external port

long lValue = 0;

result = piMapping->get_ExternalPort( &lValue );
if( !SUCCEEDED(result) )
{
piMapping->Release();
piMapping = NULL;
return E_FAIL;
}

mappingContainer.ExternalPort.Format( _T("%d"), lValue );


// get internal port

result = piMapping->get_InternalPort( &lValue );
if( !SUCCEEDED(result) )
{
piMapping->Release();
piMapping = NULL;
return E_FAIL;
}

mappingContainer.InternalPort.Format( _T("%d"), lValue );


// get protocol

result = piMapping->get_Protocol( &bStr );
if( !SUCCEEDED(result) )
{
piMapping->Release();
piMapping = NULL;
return E_FAIL;
}

if( bStr != NULL )
mappingContainer.Protocol = CString( OLE2T( bStr ) );

SysFreeString(bStr);
bStr = NULL;


// get internal client

result = piMapping->get_InternalClient( &bStr );
if( !SUCCEEDED(result) )
{
piMapping->Release();
piMapping = NULL;
return E_FAIL;
}

if( bStr != NULL )
mappingContainer.InternalClient = CString( OLE2T( bStr ) );

SysFreeString(bStr);
bStr = NULL;


// determine whether it's enabled

VARIANT_BOOL bValue = VARIANT_FALSE;

result = piMapping->get_Enabled( &bValue );
if( !SUCCEEDED(result) )
{
piMapping->Release();
piMapping = NULL;
return E_FAIL;
}

mappingContainer.Enabled = CString( ( (bValue==VARIANT_FALSE) ? _T("No") : _T("Yes") ) );


// get description

result = piMapping->get_Description( &bStr );
if( !SUCCEEDED(result) )
{
piMapping->Release();
piMapping = NULL;
return E_FAIL;
}

if( bStr != NULL )
mappingContainer.Description = CString( OLE2T( bStr ) );

SysFreeString(bStr);
bStr = NULL;

// clean up

piMapping->Release();
piMapping = NULL;


VariantClear( &varCurMapping );

return S_OK;

}




...全文
881 76 打赏 收藏 转发到动态 举报
写回复
用AI写文章
76 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zeilone 2010-10-30
  • 打赏
  • 举报
回复
LZ的代码看了让人很头疼
看不出逻辑流程,看不出重点
最重要的是,必须死盯着代码,稍眨下眼就窜行了
Defonds 2010-10-30
  • 打赏
  • 举报
回复
老外的直观。
楼主的紧凑。
cumt_TTR 2010-10-30
  • 打赏
  • 举报
回复
老外的代码好看,清晰
有点教科书的 味道
noahhu 2010-10-30
  • 打赏
  • 举报
回复
楼主真的觉得这种封装后的函数代码不会有人去看么?那么楼主现在是不是在看这段代码呢?

[Quote=引用 71 楼 pgmsoul 的回复:]

我问大家一个问题
C/C++ code

for(int i=0;i<n;i++)
{
}


谁会把它for语句里的内容分成3行来写呢?原因只有一个,没有调试和断点的必要。

代码凡是写成一行就是不许要调试的。

无非就是个Com调用,返回值只要不是S_OK我都不关心它是什么,函数是做什么的我都不知道,实际上也没有必要知道,谁知道com了都干什么了呢,我要的是最终结果,我只需要知……
[/Quote]
noahhu 2010-10-30
  • 打赏
  • 举报
回复
还是喜欢前面的代码,注释很全,也很清晰,维护要容易得多。

试想,如果是别人写的代码,用楼主的方式排,看起来似乎更紧凑。但是如果需要修改某一具体的部分的话,即便是让楼主来维护,可能只有先通读全部代码了。自己写程序或工作量少的时候还行,但将这样的代码用到实际工作上,尤其是多人协作的时候,楼主这种编码风格,应该很难受到其他同事的欢迎。
pgmsoul 2010-10-30
  • 打赏
  • 举报
回复
我问大家一个问题

for(int i=0;i<n;i++)
{
}

谁会把它for语句里的内容分成3行来写呢?原因只有一个,没有调试和断点的必要。

代码凡是写成一行就是不许要调试的。

无非就是个Com调用,返回值只要不是S_OK我都不关心它是什么,函数是做什么的我都不知道,实际上也没有必要知道,谁知道com了都干什么了呢,我要的是最终结果,我只需要知道整个函数返回false或true。

如果我要调试这一段代码我肯定不这么写,
如果我要给人看,我肯定加上必要的注释。

但是这段程序,实际上都是不必要的。

我只是觉得,原作者写了太多无用的东西,而他无非就是遵循所谓的风格罢了,而这种风格在程序界是很流行的。

我觉得redleaves说的很好,我不要goto是因为goto不太美观,还要娶个名字,也是为了遵循不用goto的准则吧。不过实际上除了goto和循环,还真没发现更好的办法呢。

这个函数本身就是封装,是一个类的成员函数,所以我不在乎它好看不好看,是不是易于调试,写完它,我自己都不会在去看它。
wyfwx 2010-10-29
  • 打赏
  • 举报
回复
个人感觉风格没有好坏之分,只要能容易看就好了.
ningto.com 2010-10-29
  • 打赏
  • 举报
回复
第一种好, 你的太密密麻麻了
asd2002061 2010-10-29
  • 打赏
  • 举报
回复
不要偷懒。。
无尽大海 2010-10-29
  • 打赏
  • 举报
回复
喜欢第一中风格,松紧适度!
rendao0563 2010-10-29
  • 打赏
  • 举报
回复
1. 美观是一部分, 重点代码还是用来调试的. 你不加{} 放在一行, 打断点都不方便.
2. COM的返回值HRESULT代码的是否出现系统问题, 应用层的返回值还是要判断的. 并且HRESULT返回值 判断方式应该是用SUCCEEDED , 你可以参考一下SUCCEEDED宏定义, 就知道他并不是只判断是否等于0.
3. 代码量大说明要做流程拆分. 分拆成几个小函数即可.
4. 关于NULL

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

5. 好的编码习惯可以极大的减少手误等低级错误出现的几率.
6. 关于效率. 不成熟的优化=劣化. 成熟的优化要经过实践的检验. 不要想当然.
Rico_Liu 2010-10-29
  • 打赏
  • 举报
回复
这个人是靠代码大小来拿工资,所以尽量写大点,老板右键属性,看看代码体积在觉得支付多少工资。

不知道啥公司,从没听说过这样的公司……
Rico_Liu 2010-10-29
  • 打赏
  • 举报
回复
特反感if,else等不加大括号,不换行的。
以后要加个什么操作,特容易出现逻辑错误,而且不好设断点。
redleaves 2010-10-29
  • 打赏
  • 举报
回复
第一段代码清楚是比较清楚.但有几个问题
1.战线太长, 看起来麻烦. 很容易在维护过程中把逻辑人为的弄复杂.当逻辑关系复杂到一定程度的时候,估计没有多少人会去做逻辑的优化.事实上很多逻辑可以用卡诺图优化得比较简短的.
2.资源释放点太多. 维护很容易出错. 这也是不用GOTO的教条主义. 经验丰富的老手应该会选择用GOTO集中管理资源.
3.用C++写C程序. 既然这样,还不如用纯C来写.那样编译也快得多. 如果是C++程序,多数会选择自动资源管理.这样,也不会不每个出口都做资源释放了. 而且对于一些常用的数据, 应该有一些简化的封装. 每一步都去用API不是C++的风格,而且容易出错.错误处理的代价也很大.

第二段代码和第一段代码的主要变化就是资源释放的动作.楼主用while和break实现资源的集中管理.其它的地方,在逻辑上没有大的变化.
其实这种做法也是不用GOTO的教条主义所影响的. 在这段代码里,用GOTO是最好的选择. 而while/do while + break这类做法.在有嵌套时才比较有应用价值.
另外,楼主的 if(xxx) break;风格我很不赞同. 通常, 就算if后只有一条语句,我也会写{}.这可以避免修改出错.而且楼主的代码应该在适当的地方加些空行.

一般对过小段的过程,或是出口3~5个以内的过程.选择在条件满足的时候,立即return比较好. 而对于较大的过程,或是出口比较多的过程,或是出口要释放资源的过程,选择用GOTO或类似的机制统一出口,并集中管理资源相对要好一些.
  • 打赏
  • 举报
回复
老外写得好,因为这跟我的原则是一致。*_~
不喜欢将 return、break 之类跟 if 放在同一行,那样调试程序的时候,不好设置断点。
mm304321141 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 65 楼 wobuguan 的回复:]

楼主的代码更紧凑,但是:

这种写法不好:
if(piMapping) piMapping->Release();
在用调试器检测的时候,如果把断点放在那一行上,不能马上看出后半句有没有执行。

一个函数至少应该有一个注释说明一下这个函数是做什么的。在不浪费纸张的情况下,我可能会加一些空格,看起来舒服些。

好像while循环只执行一次?那么为什么要用循环呢?
[/Quote]

用break可以跳过下面的代码,直接执行清理操作,编译器也会优化掉这种“傻瓜循环”,只是一种控制流程的手段。
WOBUGUAN 2010-10-29
  • 打赏
  • 举报
回复
楼主的代码更紧凑,但是:

这种写法不好:
if(piMapping) piMapping->Release();
在用调试器检测的时候,如果把断点放在那一行上,不能马上看出后半句有没有执行。

一个函数至少应该有一个注释说明一下这个函数是做什么的。在不浪费纸张的情况下,我可能会加一些空格,看起来舒服些。

好像while循环只执行一次?那么为什么要用循环呢?
mm304321141 2010-10-29
  • 打赏
  • 举报
回复
为什么不用

do{
//...
}while(false);
勉励前行 2010-10-29
  • 打赏
  • 举报
回复
太緊湊的代碼很難修改調試。
太松散的代碼,經常翻頁,一頁如果表達不了一段意思,看起來很費勁。

如果分多個段,給出段落分隔,並適當簡要地說明該段落的用意。說明段落用意後,該段最好在一個屏幕內可以看完。一個函數要完成的任務,如果完成流程復雜代碼長,應該在函數頭給出流程算法說明。


lx_616_at_yeah_net 2010-10-28
  • 打赏
  • 举报
回复

不知不觉也就写成这种了。。。

绝不是为了骗代码量和工资什么的~

加载更多回复(56)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧