V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
moroumo
V2EX  ›  程序员

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

  •  
  •   moroumo · 2013-06-17 11:11:13 +08:00 · 7858 次点击
    这是一个创建于 4184 天前的主题,其中的信息可能已经有所发展或是发生改变。
    公司内基本都是用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
    代码写的烂就是写的烂,但不能说写得像 C 风格。

    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   ·   实用小工具   ·   2883 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 06:46 · PVG 14:46 · LAX 22:46 · JFK 01:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.