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

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);

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

20365 次点击
所在节点    程序员
149 条回复
ech0x
2019-08-30 17:22:18 +08:00
还有变量名很多你们写起来不觉得起名字很麻烦嘛……
geekc3t
2019-08-30 17:24:01 +08:00
java 代码我现在一看就头疼.那么长.看不了
hantsy
2019-08-30 17:24:26 +08:00
看完这段代码,我怀疑我写是不是 Java,太恐怖了。
xzg
2019-08-30 17:32:32 +08:00
想起来一次代码走查,用 lambda 写的代码讲了半天(雾)
coolcfan
2019-08-30 17:36:36 +08:00
Debug 不要怕,IntelliJ 现在可以鼠标点选要 step in 哪个方法了
linjiayu
2019-08-30 17:40:18 +08:00
高可测才是关键
RorschachZZZ
2019-08-30 17:41:22 +08:00
可读性远比代码看着精简重要的多,而且他俩并不冲突。
zabio
2019-08-30 18:49:45 +08:00
为什么不用 kotlin 更简单
nihiue
2019-08-30 18:53:18 +08:00
写代码如说话,大的方面讲究条理分明,逻辑通顺,小的方面讲究适度冗余,简洁易懂。简短依靠的是思考以后的归纳抽象,而不是靠都写在一行,这里面的度与取舍需要写几年代码才能有所参悟
ztcaoll222
2019-08-30 19:12:04 +08:00
不建议把复杂的操作弄成一行, 但一行就能表达的不建议拆成多行
kuyuzhiqi
2019-08-30 19:14:58 +08:00
泄露公司代码,你可以不用来了!
tairan2006
2019-08-30 19:29:11 +08:00
其实还好…但是写一行太长了
raysmond
2019-08-30 19:32:38 +08:00
```java
public OutVoGlobal list(BatteryOrderDTO dto, UserInfo user) {
// 准备部分,设置查询条件
dto.setStartTime(parseTime(dto.getStartTime()));
dto.setEndTime(parseTime(dto.getEndTime()));
dto.setBelong(user.getUserNo());
PageHelper.startPage(dto.getPageNo(), dto.getPageSize());

// 业务逻辑部分
List<BatteryOrder> orders = orderMapper.list(dto);

// 返回结果
return new OutVoGlobal(EnumRetCode.SUCCESS).setData(orders);
}
```

小小的心得:

将代码分成几个部分:准备数据、执行业务逻辑、返回
每个部分集中放置代码,尽量简洁明了
每个部分代码可增可减,可以增加查询条件,可以对于查询结果进行处理计算,返回结果构造和重组
biossun
2019-08-30 19:35:02 +08:00
首先通常一行不应该这么长,否则读代码的时候就像读文章中的一个很长的句子,会比较费劲。比如古龙的小说对比金庸的。

不过写地好的话,倒也不是问题,就像金庸小说也不会真的有人明显感觉读着累。

但这段代码有一个更为麻烦的问题,在于它有一个四层深度的嵌套调用,通常嵌套调用的代码在阅读的时候需要来回查看才能梳理清楚。而写在一行里,会加重来回查看的难度。

所以最好能够把嵌套调用改写成链式调用(或顺序调用)。
如果真的不好改,应该换行。
yippees
2019-08-30 21:17:32 +08:00
由右到左的压栈式设计··
都链式出错日志跟踪?
可复用改写

LZ 代码正道。语法糖那种···
糖衣炮弹···
Pastsong
2019-08-30 21:24:51 +08:00
a || b ? c : d && e 用起来
default7
2019-08-30 21:32:35 +08:00
自娱自乐~
exonuclease
2019-08-30 23:14:31 +08:00
这你也有意见?那你看我写的长长的一串 linq 岂不是要疯了
zongwan
2019-08-30 23:25:13 +08:00
我觉得减少了引用, 挺不错
从接口设计上用了点心,OOP 才能写成这样
touno
2019-08-31 05:49:17 +08:00
你不觉得写代码跟说话一样吗?达到目的就好。

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

https://ex.noerr.eu.org/t/596413

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

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

© 2021 V2EX