Re: [讨论] 因为空格~我离开了一间公司

楼主: holydc (のヮの)   2014-09-07 04:52:24
用个现实的例子 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 写法最好,
: 还是说这个写法糟透了,那是他家的事,我不出来应战。
: 我只是恰好路过,出来建议一下而已。
作者: guest2008 (guest)   2014-09-07 06:13:00
程式是人写的不用太拘泥.写log找bug写法本来就没错.架构或者除错法真的还是要看状况而定怎样处理.真的坚持某种方法才是不好. 我那种"排版写法"比较适合独立事件的判别式..独立事件这样写确实开开关关较快有时候程式太复杂..不知道哪段出错..过去的习惯都是加上 /* if...*/ 结果太多 /* /* 反而出问题这样写有时候可以把这整段全关闭..不需要加上一堆/* */只要加上 && 1 == 0 就可以关闭了
作者: bleed1979 (十三)   2014-09-07 06:51:00
善用debugger单步执行处理short circuit
作者: guest2008 (guest)   2014-09-07 07:03:00
debugger不是万能的..这socket案例真的写log除错会较快socket有时候是结束字符换行的问题..你去按F10按到发疯这个问题都找不到.还有很多状况log除错都会比F10好用
作者: alog (A肉哥)   2014-09-07 08:12:00
unit testing 配 log 除错就很够了不过开发的方式要稍微调整,不然unit testing做不出来
作者: andymai (人生只有一次)   2014-09-07 11:22:00
debugger应该有expression evaluators吧?
作者: atst2 (atst2)   2014-09-07 13:10:00
呃...你的ret值都已经把错误原因标出来了,会很难除错吗?
作者: yauhh (小y宝贝)   2014-09-07 19:38:00
我觉得,会认为这样有问题,是因为把函数都拿来用做步骤使用.其实发生问题时,从格式来看,它应该会指出是哪一行.

Links booklink

Contact Us: admin [ a t ] ucptt.com