Loading... > 变量初始化最好一次性完成。 用声明式的标准来看代码,是一个发现代码坏味道的重要参考 # 一、初始化和业务掺杂在一起 ```cpp 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 状态的作品,还需要再次尝试创建。 **这种代码真正的问题就是不清晰,变量初始化与业务处理混在在一起。** 解决方法: 我们提取出了一个函数,**将 response 转成对应的内部的 EPUB 状态**。 ```cpp const CreateEpubResponse response = createEpub(request); const EpubStatus status = toEpubStatus(response); private: EpubStatus toEpubStatus(const CreateEpubResponse response) { if (response.getCode() == 201) { return EpubStatus.CREATED; } return EpubStatus.TO_CREATE; } ``` 在能够使用 const 的地方尽量使用 const ,限制变量的赋值。 # 二、集合初始化 ```cpp List<Permission> permissions; permissions.push_back(Permission.BOOK_READ); permissions.push_back(Permission.BOOK_WRITE); check.grantTo(Role.AUTHOR, permissions); ``` 这里先给 permission 初始化成了一个 List,这个时候,permissions 虽然存在了,但我们并不会把它传给 grantTo 方法,它还不能直接使用,因为它还缺少必要的信息。然后,我们将 BOOK\_READ 和 BOOK\_WRITE 两个枚举对象添加了进去,这样,这个 permissions 对象才是我们真正需要的那个对象。 **这种代码是非常常见的,声明一个集合,然后,调用一堆添加的方法,将所需的对象添加进去。** 解决办法: 使用构造函数,初始化的时候就将形参传给它。 ```cpp // c++11 initializer list syntax: List<Permission> permissions = {Permission.BOOK_READ, Permission.BOOK_WRITE}; check.grantTo(Role.AUTHOR, permissions); ``` 这个 List 一旦创建好了,就是不能修改了,对应的实现就是各种添加、删除之类的方法全部都禁用了。 Note: 变量的声明和赋值是分离的。二者分离带来的问题就是,把赋值的过程与业务处理混杂在一起。发现变量声明与赋值分离一个做法就是在声明前面加上 const,用“不变性”约束代码。 最后修改:2025 年 07 月 01 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏