写程序这么精简真的好吗?

2019-08-30 09:36:07 +08:00
 wsy190

我有一个同事写代码特别精简。。如:

public OutVoGlobal list(BatteryOrderDTO dto, UserInfo user) {

return new OutVoGlobal(EnumRetCode.SUCCESS).setData(orderMapper.list(dto.setBelong(user.getUserNo())));

}

之后这段代码有一些问题,让我来修改这段代码。。我就觉得这段代码的可读性特别的差。昨天和他讨论了一下,他觉得代码行数多影响阅读,他这样他看起来很舒服。以下是我加了判断后的:

public OutVoGlobal list(BatteryOrderDTO dto, UserInfo user) {

    OutVoGlobal outVoGlobal=new OutVoGlobal(EnumRetCode.SUCCESS);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    if(!StringUtils.isEmpty(dto.getStartTime())){
        try {
            sdf.parse(dto.getStartTime());
            dto.setStartTime(dto.getStartTime()+" 00:00:00");
        } catch (ParseException e) {
            dto.setStartTime("");
        }
    }
    if(!StringUtils.isEmpty(dto.getEndTime())){
        try {
            sdf.parse(dto.getEndTime());
            dto.setEndTime(dto.getEndTime()+" 23:59:59");
        } catch (ParseException e) {
            dto.setEndTime("");
        }
    }
    dto.setBelong(user.getUserNo());
    PageHelper.startPage(dto.getPageNo(), dto.getPageSize());
    List<BatteryOrder> list=orderMapper.list(dto);
    outVoGlobal.setData(list);
    return outVoGlobal;

}

如果没有改动的话这段代码我一定会这么写:

public OutVoGlobal list(BatteryOrderDTO dto, UserInfo user) {

    OutVoGlobal outVoGlobal=new OutVoGlobal(EnumRetCode.SUCCESS);
    dto.setBelong(user.getUserNo());
    PageHelper.startPage(dto.getPageNo(), dto.getPageSize());
    List<BatteryOrder> list=orderMapper.list(dto);
    outVoGlobal.setData(list);
    return outVoGlobal;
}

确实是代码增加了很多行,但是我觉得这样写当我要进行断点调试的时候会很舒服。而且当别人要改我代码的时候也能一目了然。。 然后他说如果你要加上面的新需求的话可以这么写

public OutVoGlobal list(BatteryOrderDTO dto, UserInfo user) {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    if(!StringUtils.isEmpty(dto.getStartTime())){
        try {
            sdf.parse(dto.getStartTime());
            dto.setStartTime(dto.getStartTime()+" 00:00:00");
        } catch (ParseException e) {
            dto.setStartTime("");
        }
    }
    if(!StringUtils.isEmpty(dto.getEndTime())){
        try {
            sdf.parse(dto.getEndTime());
            dto.setEndTime(dto.getEndTime()+" 23:59:59");
        } catch (ParseException e) {
            dto.setEndTime("");
        }
    }
   return new OutVoGlobal(EnumRetCode.SUCCESS).setData(orderMapper.list(dto.setBelong(user.getUserNo()))
}

我一想,这么写也可以呢。但是我还是觉得他最后那个 return 看起来太麻烦了,我又没有理由反驳他。 其实在写代码的过程中我发现他有好多的习惯我都不习惯。比如说我一般都是这么写:

OutVoGlobal outVoGlobal=new OutVoGlobal(EnumRetCode.SUCCESS);

…… if(StringUtils.isEmpty(XXX)){

outVoGlobal.setCode("1000");
outVoGlobal.setInfo(XXX+"不能为空");
// return outVoGlobal.setCode("1000").setInfo(XXX+"不能为空");
return outVoGlobal;

} if(StringUtils.isEmpty(SSSS)){

outVoGlobal.setCode("1000");
outVoGlobal.setInfo(SSS+"不能为空");
return outVoGlobal;

} …… return outVoGlobal;

如果我也用了插件的话我会这么写

OutVoGlobal outVoGlobal=new OutVoGlobal(EnumRetCode.SUCCESS);

…… if(StringUtils.isEmpty(XXX)){

return outVoGlobal.setCode("1000").setInfo(XXX+"不能为空");

} if(StringUtils.isEmpty(SSSS)){

 return outVoGlobal.setCode("1000").setInfo(SSS+"不能为空");

} …… return outVoGlobal;

他如果写的话会这么写:(加了 @Accessors(chain = true)的前提下)

…… if(StringUtils.isEmpty(XXX)){

return new OutVoGlobal().setInfo(XXX+"不能为空").setCode("1000");

} if(StringUtils.isEmpty(SSSS)){

 return new OutVoGlobal().setInfo(SSS+"不能为空").setCode("1000");

} …… return new OutVoGlobal(EnumRetCode.SUCCESS);

大家觉得是先把这个变量在开始的时候声明了好还是在用到的时候直接返回好呢?

然后还有别的:

if (userData == null) return outError(outVo, EnumRetCode.NO_REGISTER, "未查询到用户信息, userNo -->{}", user.getUserNo()); else if (!userData.getPwd().equals(pwd = encrypt(user.getUserNo(), user.getPwd())))

        return outError(outVo, EnumRetCode.ERROR_PWD, "密码错误, userNo -->{} | pwdData -->{} | pwdInput -->{}", user.getUserNo(), userData.getPwd(), pwd);

else if (!StringUtils.isEmpty(userData.getOpenId()) && !openid.equals(userData.getOpenId())) // 删除上一个用户信息

        redisUtil.delMapKey(param.getUserKey() + userData.getOpenId(), "userInfo", "null");

这种。。。if 和 else if 他后面都跟了一行,之后 他就省去了{} 他特别喜欢这么写代码。可是我每次看都要自己看一下才知道他是怎么做的。。虽然说他只写了一行,但是我看的时候还是会脑补成我写的那样。。

if (!"0000".equals(TokenUtil.verify(outVo, tokenMap).getCode()))

        return outVo;

他还喜欢把变量声明写在一行上。。

String openid = (String) tokenMap.get("openid"),userMapKey;

这样的代码我找 userMapKey 就很懵逼。。

再贴一段代码: if (userMap == null || userMap.get("userInfo") == null) {

        // 获取已绑定的用户信息
        if ((user = userInfoDao.getByOpenId(openid)) == null) return null;

        redisUtil.saveMapSecond(userMapKey, "userInfo", JSONObject.toJSONString(user), appParam.getCacheTime());

    } else

        user = JSONObject.parseObject(userMap.get("userInfo").toString(), UserInfo.class);

反正我是看不习惯。。。大家觉得呢。这么写是好还是不好呢。。

18960 次点击
所在节点    程序员
149 条回复
wsy190
2019-08-30 11:52:50 +08:00
@leafre 又没说看不懂,团队协作提提意见怎么了?而且我也是抱着讨论的心思和他谈的
再说了,我和别人讨论,关你什么事?你有资格评论我的帖子?
STRRL
2019-08-30 11:53:54 +08:00
我在工作中喜欢用 chain 这种方式 稍微有些复杂的 try-catch 都会再写一个 private 方法装一下
然后无论拆不拆开 可加 fianal 的变量记得加 final...
vmskipper
2019-08-30 11:54:37 +08:00
越复杂的东西,越要写的简单,越少的依赖
SuperMild
2019-08-30 11:55:29 +08:00
如果没有裁判,是很难分清是非对错的。比如这种,必须有一个组长之类的人,和大家讨论后制定一份代码风格手册,类似于 Google、阿里做的那些 Java 风格手册,这样有规矩才能分对错。

不然的话谁都不服谁,两个地位相同的人讨论这种问题效率是很低的,你说的再有道理,但是他不服气呀,如果没有裁判,“道理”的力量很微弱。
chanchan
2019-08-30 11:57:44 +08:00
除了 if else 省略花括号,变量声明在一行.别的我觉得没问题
Sapp
2019-08-30 11:57:44 +08:00
链式调用要这么写

```

xx
.xxx() // 注释
.xxx() // 注释
.xxx(
oo.xx()
)
.xxx(
oo
.xx()
.xxx()
)

```
sonxzjw
2019-08-30 11:58:29 +08:00
你同事这样是一种变成风格,链式编程,有些语言哲学里很提倡例如 scala,确实阅读性不错。
我一度也很喜欢这种做法,但后来发现 java 中(其他的未生产上丰富的现实经验,但差不多吧)这样写很难快速的定位问题。每一个链相当于都会有异常,这样几乎无法精确捕获并处理。

所以后来我还是拆分开来写了,坑别人事小,坑自己事大,到最后有问题还是得分开来搞。
jiezhi
2019-08-30 12:00:00 +08:00
用 builder 会清爽很多吧
passerbytiny
2019-08-30 12:02:26 +08:00
我本来想看看楼主说得是啥,然而我根本看不下去主题描述。

只说一点,在不使用缩写、转义等替代描述的情况下,代码越少,可读性越高但可调整型(断点调试、后续追加代码)越低。“?:”三目描述符就是一个典型,可读性很高,但是当要调试,或者追加更多逻辑的时候,就不如“ if else ”方便。
Sornets
2019-08-30 12:05:22 +08:00
当我觉得这个代码以后不会我来维护并且我心情比较差的时候,会写成你同事这种。

其他情况,会写成你这种
zzczzc
2019-08-30 12:12:16 +08:00
我自己的话会喜欢用语法糖吧,工作还是尽量多考虑可读性好点
karnaugh
2019-08-30 12:14:22 +08:00
最近我也遇到类似的事情,我的思考结论是:
两个角度,因为是自己写的代码,每个东西是用来干啥的都知道,所以缩写成一条感觉看着很干净。。。
但是!!
到别人看的时候简直就是死了🐴了,难懂的雅痞,过个半年一年的,他再回来看着一条代码,估计他也得看半天

这种“我觉得”的负优化经常会有,只是因为自己的角度限制了思维,你可以自己写几个这样的代码让他看,他大概就知道自己写的这个代码有多屎了
izoabr
2019-08-30 12:26:40 +08:00
用过 Python 的觉得这些都是乱码,太乱太复杂了
c0011
2019-08-30 12:30:11 +08:00
我看你的你同事的代码头疼。
pjzhong
2019-08-30 12:34:12 +08:00
现在除了技术隔阂,还有风格隔阂了?
tudouxiong
2019-08-30 12:34:43 +08:00
@leafre 感谢 block
jason19659
2019-08-30 12:37:05 +08:00
设置为当日零点 dto.setStartTime(dto.getStartTime()+" 00:00:00"); 这么写真的没问题吗。。。万一时区不一样。。
blackmirror
2019-08-30 12:37:18 +08:00
这代码粘得看得我头痛
WuMingyu
2019-08-30 12:40:52 +08:00
链式的分行写 可以不
Tink
2019-08-30 12:41:35 +08:00
能写到一行并且出现问题能够很轻易判断问题在哪的程序员很厉害

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/596413

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX