吐槽一下,同事把java写的像C - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
moroumo
V2EX    程序员

吐槽一下,同事把java写的像C

  •  
  •   moroumo 2013-06-17 11:11:13 +08:00 8288 次点击
    这是一个创建于 4503 天前的主题,其中的信息可能已经有所发展或是发生改变。
    公司内基本都是用java开发的。前段时间我转入一个新项目组,这个项目组建立几年了。和几个已在项目组的老员工一起开发了新项目,现在code进入到review阶段。写核心代码的两个同事,一个资深的,一个毕业一年的。我在review代码的时候,发现这两个同事基本不讲究OO设计之类的。代码就是几个大函数,基本没有抽象。要说是C风格,也是比较差的C风格,模块划分也是比较差的。
    项目至少会持续两年左右,迭代开发,会不停的增加feature。所以后续再增加代码可能非常痛苦。

    我虽是老员工,但是相对这个项目组,还很新。有几次旁巧击的提过代码的问题,回答就是项目紧,或者refactor也就一两天的事,不着急。按照多年的经验,代码一旦完成,老板很难给时间去refactor的。
    50 条回复    1970-01-01 08:00:00 +08:00
    solesschong
        1
    solesschong  
       2013-06-17 11:23:24 +08:00   1
    把Java写得像C着实不易,足见C功力之深。。。实在忍不住吐槽。
    Golevka
        2
    Golevka  
       2013-06-17 11:40:28 +08:00   1
    把Java和C#当C用的掩面路过... 并表示这种imperative的语言我向来都只这么用
    moroumo
        3
    moroumo  
    OP
       2013-06-17 12:08:06 +08:00   1
    @Golevka 这么用也没什么。但项目大了以后,抽象后的代码更好增加新feature,好维护。
    bombless
        4
    bombless  
       2013-06-17 12:20:14 +08:00
    太习惯C了,那他java的抽象方式也用不好。
    你还不如让它就用C风格,让他用java风格到时候会更糟糕。
    jueying510
        5
    jueying510  
       2013-06-17 12:28:39 +08:00
    这个跟语言没关系,主要是项目开发规范不完善,同时开发人员在设计上缺乏多思考的缘故。目前这样的人很多,大家都想着快速交付功能,而忽略或者牺牲了代码质量,真的是饮鸩止渴。
    clowwindy
        6
    clowwindy  
       2013-06-17 12:43:59 +08:00   2
    代码写的烂就是写的烂,但不能说写得像 风格。

    Java 和 C++ 的面向对象只是个语法糖。C 语言的项目可以设计成面向对象的。

    比方说一个 dict 模块提供的 API 就是一个 struct dict 和一些以这个 struct 为第一个参数的一堆方法。
    railgun
        7
    railgun  
       2013-06-17 12:49:05 +08:00
    我也来吐槽一下,我接手的这个项目,之前的猛士硬是在ObjectiveC上面搭出了一个MFC风格的框架……
    join
        8
    join  
       2013-06-17 12:51:10 +08:00
    你见过哪个写c的是经常一个个大函数写的? 别黑我大c语言。
    master
        9
    master  
       2013-06-17 12:53:30 +08:00
    不能说写代码习惯不好就变成代码像C的风格吧
    Mutoo
        10
    Mutoo  
       2013-06-17 12:55:28 +08:00
    简单说是的面向过程思维已经僵化了吧。
    moroumo
        11
    moroumo  
    OP
       2013-06-17 13:52:20 +08:00
    @join @master
    的确不是想黑C,我也是C语言出身的。C用好struct和指针,划分好模块,写出的代码也是非常优雅的。
    只是除了代码的语法是java外,再怎么看代码组织或者思维,都是C的。
    xiaogui
        12
    xiaogui  
       2013-06-17 15:27:32 +08:00
    其实,这有的时候也跟部分的傻×公司有关。比如需求一直变,今天要这个,明天要哪个,整天在做的大部分都是无用功。一说就是,我们要新加一个什么什么功能,下午能出来吗?
    这种谁也扛不住。
    jjx
        13
    jjx  
       2013-06-17 15:42:46 +08:00
    结构化有结构化的好处, 如果用继承之类的, 整个类体系都要了解,看似简单,排错时更头疼
    seeker
        14
    seeker  
       2013-06-17 15:47:46 +08:00
    大部分老板对代码风格不太在意,只管你能make things done.
    于是coder也没必要时刻想着代码的可维护啊,可扩展啊,只管搞定了事.
    你花了几天时间给一个功能分好模块分好类,与此同时另外一个同事1天把功能完成,但是代码里面N多copy&paste,一个方法几千行.很不辛老板会赏识后者.
    chshouyu
        15
    chshouyu  
       2013-06-17 16:57:06 +08:00
    珍爱生命 我用python
    moroumo
        16
    moroumo  
    OP
       2013-06-17 17:20:30 +08:00
    大家都好现实啊,原来想做一个理想主义的coder还是很困难的啊。
    主要的要有这设计的意识,至少有个基本的审美观吧。

    半小时前接到新需求更改,这下可哭了。一些简单的需求是需要大改代码结构才能完成的。呵呵。
    ivenvd
        17
    ivenvd  
       2013-06-17 17:23:37 +08:00
    这也值得吐槽?看看我们的代码:

    switch(i){
    case 1:
    agentType = Constants.AGENT_1;
    break;
    case 2:
    agentType = Constants.AGENT_2;
    break;
    case 6:
    agentType = Constants.AGENT_6;
    break;
    case 10:
    agentType = Constants.AGENT_10;
    break;
    case 11:
    agentType = Constants.AGENT_11;
    break;
    case 12:
    agentType = Constants.AGENT_12;
    break;
    case 13:
    agentType = Constants.AGENT_13;
    break;
    case 20:
    agentType = Constants.AGENT_20;
    break;
    case 21:
    agentType = Constants.AGENT_21;
    break;
    case 22:
    agentType = Constants.AGENT_22;
    break;
    case 23:
    agentType = Constants.AGENT_23;
    break;
    case 24:
    agentType = Constants.AGENT_24;
    break;
    case 25:
    agentType = Constants.AGENT_25;
    break;
    default:
    agentType = Constants.AGENT_DEFAULT;
    }
    chchwy
        18
    chchwy  
       2013-06-17 17:53:33 +08:00
    重不是C的格好或。
    而是 "把Java得像C" 件事,明就反了Java的格,
    你反了一言的格,那就很享受到言的好。
    chemhack
        19
    chemhack  
       2013-06-17 17:54:50 +08:00
    碰到很多了,Javascript写的跟java一样,java写的跟c一样,c写的跟屎一样。。。。
    wang2191195
        20
    wang2191195  
       2013-06-17 18:10:29 +08:00 via iPhone
    @ivenvd 我擦 这种代码都能出现啊……
    kfc315
        21
    kfc315  
       2013-06-17 20:21:04 +08:00
    @ivenvd 哈哈哈……这
    leegorous
        22
    leegorous  
       2013-06-17 20:58:14 +08:00
    连个风格都要给人吐槽,写代码真不容易啊
    jasontse
        23
    jasontse  
       2013-06-17 21:01:32 +08:00 via iPad
    @ivenvd 无力吐槽。。。
    davepkxxx
        24
    davepkxxx  
       2013-06-17 21:24:14 +08:00
    果然厉害
    ivenvd
        25
    ivenvd  
       2013-06-18 01:38:55 +08:00
    @wang2191195 @kfc315 @jasontse 你们啊,Too Simple,这只是我随手找来的而已…… &_&

    我们想用 Python 发个 POST 请求,都是 fork 出一个 curl,然后解析输出的…… &_&
    stranbird
        26
    stranbird  
       2013-06-18 12:40:45 +08:00
    @ivenvd 代码最少的实现,挺好的啊。
    zhwei
        27
    zhwei  
       2013-06-18 12:42:28 +08:00
    @chemhack 厉害!
    bradlee
        28
    bradlee  
       2013-06-18 22:21:44 +08:00
    @clowwindy 这个正解 写的像C我理解为像linux kernel 或nginx那样的
    luikore
        29
    luikore  
       2013-06-18 22:23:58 +08:00   1
    这是赞美吧...
    colincat
        30
    colincat  
       2013-06-18 23:31:12 +08:00 via iPhone
    我无力吐槽我自己,我写的代码别人都能看懂,难道我也是c风格?要怪就怪你们的架构师吧
    pepsin
        31
    pepsin  
       2013-06-19 07:07:07 +08:00
    @railgun 想象一下Rails的Controller写了4000多行
    alexrezit
        32
    alexrezit  
       2013-06-19 07:31:49 +08:00
    hanf
        33
    hanf  
       2013-06-19 08:39:25 +08:00
    @moroumo 我表示非常同意,这表面上是风格问题,其实深层是流程和规范问题。要么不专业,要么偷懒不动脑。
    victor
        34
    victor  
       2013-06-19 16:07:22 +08:00
    @pepsin 跪了,如何写出4000行,求指教。
    pepsin
        35
    pepsin  
       2013-06-19 17:17:39 +08:00
    ivenvd
        36
    ivenvd  
       2013-06-20 00:09:51 +08:00
    @alexrezit 哈哈,你这个只是不会循环而已,我这个可是不会数组啊……显然实现你那个功能难度更高……
    Abruzzi
        37
    Abruzzi  
       2013-07-02 15:54:39 +08:00
    @ivenvd 之前看了那个switch的代码愕然了,然后仔细一想好像也不是那么容易改,最后用反射写出来:
    public void testSwitch(Integer i){
    try {
    Field field = Constants.class.getDeclaredField("AGENT_" + i);
    agentType = (String)field.get("AGENT_" + i);
    } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e ) {
    e.printStackTrace();
    }
    }
    觉得还不如之前那样安全。


    今天又看到你回复的数组,瞬间想捡砖拍死自己。
    tolbkni
        38
    tolbkni  
       2013-07-02 19:18:28 +08:00
    @Abruzzi 跪了!瞬间高端了
    Hashell
        39
    Hashell  
       2013-07-02 19:43:51 +08:00
    @ivenvd ..真巧,我今天看到同事用delphi的代码,是sql语句的查询变量.看着一行行的复制修改变量名中的数字..我好奇,工作量好大.他说,PHP的话我也知道变量名可以改的.我不忍心轻声说了一句,PHP循环输出这段代码吧.他说快完成了.我不忍心,用数组的应该好点,不知delphi有没有数组的说法.他说,这个要试试..然后就用大括号把这段代码括起来,好像用数组去弄了..
    Hashell
        40
    Hashell  
       2013-07-02 19:45:02 +08:00
    @ivenvd 补充一句..也是switch...case...case..
    kalintw
        41
    kalintw  
       2013-07-02 19:48:09 +08:00
    设计和写设计文档的时候不包括类设计和接口设计?设计好了怎么写成大函数?
    summic
        42
    summic  
       2013-07-02 19:49:26 +08:00
    看到 PHP 写得像Java的,变量夸张的占掉了一行
    angelface
        43
    angelface  
       2013-07-02 19:49:31 +08:00
    这个写法我见的多了, 一个方法2000来行, 都是小意思, 就是用c语言好手也不会这么写, 所以, 和C真的没毛关系 。。。
    akira
        44
    akira  
       2013-07-02 20:07:18 +08:00
    一个函数的长度尽量控制在25行以内,20年前老师教的。
    dorentus
        45
    dorentus  
       2013-07-02 20:21:48 +08:00   1
    @Abruzzi 不要被那个 switch 代码的作者的逻辑绕进去……

    一般这种,语言相关的性能问题暂且不论,我一般是会把 { 1 : Constants.AGENT_1, 13 : Constants.AGENT_13, ... } 这些放到一个字典容器里(或者干脆写成其它格式配置文件,在运行时加载),然后顶多再处理一些 Constants.AGENT_DEFAULT 的情形,就可以了。
    013231
        46
    013231  
       2013-07-02 20:49:42 +08:00
    @stranbird 你确定fork出curl再解析比直接用requests代少?
    ygtq
        47
    ygtq  
       2013-07-02 21:38:03 +08:00
    @akira 25行 有点夸张吧……
    angelface
        48
    angelface  
       2013-07-02 21:47:39 +08:00
    @ygtq 还好, 没看是20年前么, 也就是93年, 哈哈。
    marginleft
        49
    marginleft  
       2013-07-02 22:30:16 +08:00 via iPad
    @ivenvd 这是在凑字数?
    jasontse
        50
    jasontse  
       2013-07-02 23:04:43 +08:00 via iPad
    这是V2EX吗?我怎么觉得我走错地方了。。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1236 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 17:20 PVG 01:20 LAX 10:20 JFK 13:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86