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

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

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

18872 次点击
所在节点    程序员
149 条回复
wsy190
2019-08-30 09:42:15 +08:00
为了讨论这件事昨天还特意注册了一个账号。。。
第一发帖不太会用这个编辑器。。。
delectate
2019-08-30 09:50:41 +08:00
滥用语法糖、缩行、炫技的程序员,我们上次已经炖汤了,味道不错,就是肉有点塞牙。

下次再碰到这样的程序员,直接给我们送过来就行。
iiicarus
2019-08-30 10:04:04 +08:00
这样挺好的
shawnbluce
2019-08-30 10:04:06 +08:00
有一句话:“代码是写给人看的,顺便给机器执行”
gwybiaim
2019-08-30 10:09:24 +08:00
所有的目的是为了,可读性、可维护性。在很多代码规范里,长长的一行是不被推荐的。你也提到了,可读性差、不方便 debug,更关键的是,如果拆开多行,天然有变量名,对读代码来说,非常有利
wsy190
2019-08-30 10:25:40 +08:00
@shawnbluce 他是觉得这么写比写好多行看起来方便。。
而我是觉得看很多行方便容易理解,看他那一行很麻烦,还得挨个分析。。
pingpingping
2019-08-30 10:30:05 +08:00
据说古龙当初为了酒钱,老是分行分段么。。
还是金庸的排版好经典啊
0x11901
2019-08-30 10:55:22 +08:00
有的人总总觉得他有一点个人的理解,他要把他的那个理解给实现,他的理解就是小鱼人点四级跳,然后带个点金手来打架。这种理解他觉得很到位,其实没什么用的。你先把最普通的那种打法打好,再去尝试自己的想法……
zhanggg
2019-08-30 10:56:31 +08:00
建议让那个老哥看看人月神话,软件工程本质还是工程,自己一个人炫技不考虑其他人感受,完全就是 XX
当然一人全栈的项目除外,你爱咋写咋写
IceChen
2019-08-30 11:01:21 +08:00
链式调用,没什么问题。。
好的链式调用,连起来,就是一句话。。
wsy190
2019-08-30 11:02:55 +08:00
@0x11901
其实这是个 98 年的小同事写的。。(我 94。。)
wysnylc
2019-08-30 11:08:29 +08:00
链式调用,没任何问题啊
链式调用一样可以写注释
而且第二段代码和第一段完全不一样,第一段只是单纯的 set 第二段有大量的判断逻辑能一样比较?
链式调用也是炫技?我活在 2000?
LuciferGo
2019-08-30 11:08:39 +08:00
如果是刚开始写代码的人,还是建议改过来,代码的可读性、可维护性还是很重要的,长长的写一行自己看有时候都不方便看,更不要说交给后续接手的人了。
wysnylc
2019-08-30 11:09:33 +08:00
还有 SimpleDateFormat 高并发下存在问题,都已经禁用的东西你还敢用
你多久没有学过新技术?
wsy190
2019-08-30 11:12:03 +08:00
@IceChen
我是觉得这句话干的事情有点多。不过确实是没问题。。刚用阿里编码规范扫描了一下,都没问题。。。但是我觉得第一次读起来不算太习惯。。

new OutVoGlobal(EnumRetCode.SUCCESS).setData(orderMapper.list(dto.setBelong(user.getUserNo()))
1:新建了一个 OutVoGlobal
2:给 OutVoGlobal 赋了一个 EnumRetCode.SUCCESS 的值
3:给 OutVoGlobal 的 Date 赋值 A
4:A 是用 orderMapper.list(dto)查的
5:给 dto 设置了一个 belong,belong 的值是从 user 中拿的。。

我改他代码是因为他 dto 中的东西需要重新判断一下。
dto 里面有个开始时间和结束时间,前端有可能传过来的是汉字,我需要 try catch 一下,如果发生异常我把这个字段改为空字符串。确实是可以在他这句话之前加判断。
但是按照正常逻辑来讲应该是在他代码的第 5 步来判断吧。。

其实我还是坚持他这么写可读性不好。。但是确实是可以在他这句话之前加判断。(也不清楚是不是自己水平不行。。不过我总觉得再让我重新来一遍我还是得看到第五步。。)
wsy190
2019-08-30 11:14:02 +08:00
@wysnylc 小作坊公司。。。刚工作一年多。。技术确实是不到位。。大佬喜怒。。
closedevice
2019-08-30 11:18:02 +08:00
记住一句话,代码时写给人看的,顺便给机器执行.对于团队工程,通用的可阅读性是第一要义.
wysnylc
2019-08-30 11:18:52 +08:00
@wsy190 #16 非大佬,只是觉得你纠结的东西微不足道
写代码多写注释,代码千变万化注释一行足以
如果给你一个十万行代码的类,但是注释就一句 输入 1 返回 1 你觉得哪个更好?
代码只要不出错没并发就是好代码,写法因人而异
记住有一万个哈姆雷特,你只是其中一个罢了
alphatoad
2019-08-30 11:19:51 +08:00
没有可读性的代码就是屎山
queuey
2019-08-30 11:25: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