13 | 落后的代码风格:使用“新”的语言特性和程序库升级你的代码
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了如何利用“新”的语言特性和程序库升级代码风格,以提高代码表达性和减少错误发生的概率。作者以Java 8的语言特性Optional为例,说明了如何避免空指针异常的问题。通过使用Optional对象容器,可以在取出对象之前判断其是否存在,从而减少“忘记判断”的概率。文章还提到了其他语言如Kotlin或Groovy针对空对象问题的解决方案。总的来说,文章强调了随着语言的不断演进,采用新的语言特性和程序库可以提升代码质量和可维护性。文章还介绍了函数式编程对代码风格的改善,以及如何理解列表转换思维,提高代码表达性。通过讲解新的代码风格,鼓励读者不断学习和改善自己的代码,不停留在过去的编程风格中。
《代码之丑》,新⼈⾸单¥59
全部留言(15)
- 最新
- 精选
- Jxin我认为Stream语言设计上有疏忽。 问题: Stream的语意表示一次数据流,或者说一次循环。所以不管是map还是filter都是在这一次循环中每个元素执行的一个job。然而stream却有.parallel()和.sequential()的语意,感觉起来就像是可以随意改变当前这一次数据流的执行方式,但实际上一次数据流只能有一种执行方式。 结论:应该是get出并行的parallelStream()或者get出串行的sequentiaStream(),这样在语意上会更明确些。毕竟执行方式在stream中是一个排他项,他不该被变更。
作者回复: .parallel()和.sequential(),除非明确地知道执行结果,否则,不要使用。
2021-01-319 - Jxin1.勘误 Optional<Author> author = book.getAuthor(); String name = author.orElse(null); -> String name = author.map(Author::getName).orElse(null); 原理: 因为Optional内部做了判空处理 好处: 更语意化的表达 个人见解: 这里 author.map(Author::getName).orElse(null); 刚开始用时,会觉得map里面会报空指针的问题,因为在执行map时感觉就会抛出异常。个人认为这有违常规java开发的心智模型。因为java开发习惯了null的存在,因而在map中做空判断,就像是在map中偷偷多做了一件事,有点超出预期?
作者回复: 多谢提示,已经修改。 心智模型就是要不断提升的。
2021-01-316 - 桃子-夏勇杰感觉多写了Optional ,代码变得更加累赘了?毕竟这是一种实现细节,如果混在业务代码里面,是不是也是一种坏味道呢?
作者回复: 看你怎么评价什么算是累赘了,这是一种减少犯错几率的做法,另外,Optional 本身有很多方法可以简化代码的编写。Optional 也是一种需要习惯的构造块,和函数式编程的其它内容是一样的,需要适应一下,适应之后,它就是和 if、for 之类一样的东西。
2021-01-2826 - Geek_344b93我觉得应该是把Optional给封装到一个模型中,然后模型标记可能@Nullable。一来我认为隐藏了于业务无关的空判断,二来,其他调用者不用再写一个相同的判断语句
作者回复: 如果有更好的 Optional 解决方案,可能是语法的改进,就像 Groovy 和 Kotlin 那样。
2021-02-083 - kougazhang请教一个问题:业务实践中感觉函数式的扩展性不太好。 比如文中的例子: public ChapterParameters toParameters(final List<Chapter> chapters) { List<ChapterParameter> parameters = chapters.stream() .filter(Chapter::isApproved) .map(this::toChapterParameter) .collect(Collectors.toList()); return new ChapterParameters(parameters); } 这段代码在后续的维护中,经常会出现“后续维护时需要 map 的时候需要加 if 条件,尽早打破循环”的情况。 所以,第一次实现需求时写成老师说的这个样子不难,可是后续随着项目演进还是觉得拆成 for 方便。 这种情况该怎么避免呢?
作者回复: 本质上,还是不习惯函数式的原语map、filter、reduce,我在《软件设计之美》中专门讲了,不妨去看看。
2021-11-2422 - NiceBenlambda表达式虽然简洁,但是在代码出现bug的时候,不好调试。也许是集合中某个参数问题,但是通过lambda的debug时,没办法精确定位到。
作者回复: 现在的IDE可以在lambda里设置断点,也还好,不过,还是写测试更好。
2021-01-282 - adang对于 Optional,在 Ruby 上早期会用 try 后来版本升级改为 &. 写起来很方便。 写 Ruby 的那会儿,有很多程序员是从其它语言转过去的,写出来的代码有很多前一种语言的"烙印",团队 Leader 会要求大家时常翻看 Ruby 的代码规范,规范里有明确要求的严格按照规范来,这样尽量保持代码风格统一。
作者回复: 这是对的,统一风格很重要,这是上一讲的主题。
2021-01-282 - Hobo我是写C#的,像这个列表转换在C#中的体现就是Linq吧,不过一些复杂查询我都写的很长😓😓
作者回复: 不完全是,Linq 的目标是构建一种查询的方式。
2021-01-281 - crtmsvc非常喜欢这一讲
作者回复: 可以转发分享给更多的朋友。
2021-03-06 - Luke我的经验是,只有了解了新语汇解决什么问题,才能改变自己的编写习惯。 不断学习新的代码风格,不仅要知道如何做,也需要掌握新的代码风格是为了解决什么样的问题而产生的,我觉得这一点很重要,就像之前如果不了解 optional 是为了解决 null 忘记判断,或者在Java 语汇中,判断null 比较繁琐而产生的,那么 optional 对于我充其量是一个语法糖。 很多新特性,在读了郑大的解析后,我才从意识上切换了过来。 受益匪浅!2021-12-273