代码之丑
郑晔
开源项目 Moco 作者
19833 人已学习
新⼈⾸单¥59
登录后,你可以任选2讲全文学习
课程目录
已完结/共 24 讲
代码之丑
15
15
1.0x
00:00/00:00
登录|注册

10 | 变量声明与赋值分离:普通的变量声明,怎么也有坏味道?

你好,我是郑晔。
我们已经用连续几讲的篇幅在挑战很多人固有的编程习惯了,从各种控制语句,到 getter 和 setter,甚至连直接使用基本类型都已经成了坏味道,这一讲,我们再来挑战一个很多人习以为常的编程习惯:变量的声明与赋值。
我估计有人已经露出了惊讶的表情。你可能会想:要说前面几种坏味道可能确实是编码没有做好,该封装没封装,该返回没返回,一个变量声明怎么还会有坏味道啊?难道是变量声明都不让用了吗?
诚然,变量声明是写程序不可或缺的一部分,我并不打算让你戒掉变量声明,严格地说,我们是要把变量初始化这件事做好。

变量的初始化

我们先来看一段代码:
EpubStatus status = null;
CreateEpubResponse response = createEpub(request);
if (response.getCode() == 201) {
status = EpubStatus.CREATED;
} else {
status = EpubStatus.TO_CREATE;
}
这段代码在做的事情是向另外一个服务发请求创建 EPUB(一种电子书格式),如果创建成功,返回值是 HTTP 的 201,也就表示创建成功,然后就把状态置为 CREATED;而如果没有成功,则把状态置为 TO_CREATE。后面对于 TO_CREATE 状态的作品,还需要再次尝试创建。
这里,我们暂且把是否要写 else 放下,这是我们在前面已经讨论过的一个坏味道。
我们这次的重点在 status 这个变量上,虽然 status 这个变量在声明的时候,就赋上了一个 null 值,但实际上,这个值并没有起到任何作用,因为 status 的变量值,其实是在经过后续处理之后,才有了真正的值。换言之,从语义上说,第一行的变量初始化其实是没有用的,这是一次假的初始化。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文讨论了变量声明与初始化分离的编程习惯,并强调了一次性完成变量初始化的重要性。作者指出,这种习惯有助于提高代码清晰度和可读性,减少业务处理与变量初始化混在一起的复杂度。文章还提倡在能够使用final的地方尽量使用final,限制变量的赋值,并在异常处理的场景中采用一次性完成变量初始化的方式。此外,文章还探讨了集合的初始化方式,从传统的命令式方式转变为声明式方式,以及如何用声明式的标准来发现代码中的坏味道。总的来说,本文强调了编程风格与时俱进的重要性,以及一次性完成变量初始化的重要性。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《代码之丑》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(26)

  • 最新
  • 精选
  • 桃子-夏勇杰
    有一种当年读Effective系列从书的感觉

    作者回复: 这个比喻,我很欣慰。

    2021-01-21
    2
    31
  • webmin
    刷新了认知,给我植入了"声明式”和"做什么”两个思想

    作者回复: 恭喜你,又进阶了。

    2021-01-21
    15
  • 阎魔502
    List<Permission> permissions = List.of( Permission.BOOK_READ, Permission.BOOK_WRITE ); check.grantTo(Role.AUTHOR, permissions); 使用Arrays.asList 方式同样可以达到相同的效果

    作者回复: 嗯,不同版本的JDK

    2021-03-22
    6
  • 刘大明
    说来惭愧,项目中从来没有一个同事用过final。 学到了用声明式的标准来看代码

    作者回复: 学到一招,就可以用起来。

    2021-01-21
    5
  • huaweichen
    看了这一篇,觉得现存的代码,好多地方要改。。。

    作者回复: 没白学就好

    2021-01-21
    4
  • adang
    第一个例子,会尽量用三目运算符的写法,类似于这样 ``` CreateEpubResponse response = createEpub(request); EpubStatus status = (response.getCode() == 201) ? EpubStatus.CREATED : EpubStatus.TO_CREATE; ``` 老师,不知道这样算是取巧吗?

    作者回复: 可以是可以,就是通常来说,三目运算符写出来的代码不算清晰。

    2021-01-21
    2
    4
  • 6点无痛早起学习的和尚
    这几天早上起床就来刷这个课,之前一直没有留言,但是昨天看了之前的一个代码,然后发现了很多前面几章讲的坏味道(比如过长的消息链等),今天又学到了变量声明,记起来之前代码也有这样的问题,今天就立马去改了,点赞这门课

    作者回复: 学以致用

    2021-04-09
    3
  • Geek_3b1096
    List.of今天就用上了!

    作者回复: 于是,代码就好了一点点。

    2021-01-28
    2
    3
  • 明星
    老师示例中的 final CreateEpubResponse response = createEpub(request); final EpubStatus status = toEpubStatus(response); private EpubStatus toEpubStatus(final CreateEpubResponse response) { if (response.getCode() == 201) { return EpubStatus.CREATED; } return EpubStatus.TO_CREATE; } response和status 没想明白在什么情况下会被改变,final 防止改变这两个变量的意图可以理解,但是是防止程序运行过程中被其他线程误改变值?还是防止其他开发的同事调用或修改这段代码的时候一不小心对变量进行了赋值?

    作者回复: 不用考虑什么情况下会改变,设置成 final 就是告诉别人,它不会变。

    2021-01-28
    3
  • Aprelude
    response状态的那个方法参数为什么不传reponse.getcode而要把整个reponse传进去

    作者回复: 这取决于我们认为决定状态的是什么,可能是状态码,也可能从内容中取出来。这个例子里面目前只用到了状态码,其实是可以只传状态码的。

    2021-06-30
    2
    1
收起评论
显示
设置
留言
26
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部