用个现实的例子 http://ideone.com/gkEwk5
我是真的不知道这种写法哪里比较糟糕,希望有人可以指点
一步步走下来一目了然,发生问题 caller 也能知道是错在哪里
唯一我自己看不顺眼的是那些 goto,不过 c 没办法做到 raii 似乎也只能这样
相对的写法 http://ideone.com/sJSdO9
虽然逻辑一样,但是我觉得这缩排很丑,而且错误处理离出错的地方太远
我反倒更不喜欢看到一大堆 short circuit evaluation
以同一个例子来说
if ((socket(...) >= 0)
&& (bind(...) == 0)
&& (listen(...) == 0)
&& (accept(...) >= 0)) {
...
}
当这段出问题的时候,有办法马上找出是哪个步骤造成的吗
我比较笨,要我 debug 我可能会
1. 在 socket bind listen accept 里面加 log 看是谁没走进去
2. 把这个 if 拆开,分别看他们的回传值
但是 1. 的情况也许我是用别人的 library,不一定能修改
用 2. 的作法我想结果自然而然会变成上面连结的形式
难道 debug 完再改回 short circuit evaluation 吗
想和大大们讨论看看
※ 引述《guest2008 (guest)》之铭言:
: ※ 引述《workworkwork (Miyada vv)》之铭言:
: : 这是我"前"公司的经验了
: : 一开始以为公司内有严格的coding style规定是件好事
: : 我也赞成公司要有一致的coding style
: : (像我以前看过apache的C code
: : 全部CODE都像同一人写出来的一样)
: : 而公司内也会有人code review你的部份
: : 一切听起来都很完美
: : 一开始听到有规定coding style和code reviewer也很开心
: : 但因这一切都因为公司里有一个奇怪的规定而毁了
: : "code不可以用code formatter去扫"
: : 我承认自己写程式常会漏勾
: : 所以写完会花很多心力在检查有没有BUG 是否会被攻击 资安问题等等....
: : 但在这间公司发现一个很奇怪的事情
: : "有资安漏洞的CODE大家会很有耐心的教 空格没空好会被骂的狗头淋头"
: : 搞到最后一段程式写完我只知道检查空格....
: : 最后的最后我决定离职的原因是出在reviewer
: : 和reviewer的code观念差太多 跟本无法共事
: : 例如:
: : 1.
: : 有时为了避免太多层出现===>
: : if(a)
: : {
: : //do a things
: : if(b)
: : {
: : //do b things
: : if(c)
: : {
: : //do c things
: : }
: : }
: : }
: : 会改成====>
: : if(!a)
: : {
: : return ;
: : }
: : //do a things
: : if(!b)
: : {
: : return ;
: : }
: : //do b things
: : if(!c)
: : {
: : return ;
: : }
: : //do c things
: : 但因为这写法code reviewer没看过
: : 她直接在辨公室里开飙
: 这个我看起来 A 跟 B 根本没什么不同,但 B 确实比较糟糕。
: 因为都是 X条件触发,处理 X条件,再继续往下做。
: 但你是 X不成立,就返回。这个 !X 不是好方法,实际上对系统架构没帮助。
: 你要让系统结构很维护,避免那么多{}层出现,
: 框到到底那个 } 是对应那个 { 都不知道了,应该这样写:
: if(
: fun_A() == true
: && fun_B == true
: && fun_C == true
: && .......
: )
: {
: 做某件事
: }
: function fun_A()
: {
: if(....) return(false);
: return(true);
: }
: 下略,自己补上 fun_B()..fun_C()。
: 这样写有啥好处??
: (1) 最大好处就是太多层后,真的不知道那个 } 是对应那个 {
: 也就是你一直在数空格数到底空对了吗?
: (2) 除错超快,注意我是直接每个判别直接写一行,
: 你写的落落长后,除非你是天下奇杷,脑袋超清楚,
: 要不然肯定会错啦~~这个地方我除错的速度绝对比你快。
: 我直接一行一行 // && fun_C() == true
: 就找出问题了。
: 甚至未来你某个条件不想再用就像上面一样 mark 掉就好了。
: 以上给参考,你自己去评估三种写法哪种最好。
: 另外如果有人又要出来跟我战他要用 class 写法最好,
: 还是说这个写法糟透了,那是他家的事,我不出来应战。
: 我只是恰好路过,出来建议一下而已。