写点什么

程序中变量的抽取的时机,变量命名,变量位置

用户头像
sdutyq
关注
发布于: 2021 年 03 月 18 日

抽取变量目的是方便阅读理解。


先看个代码示例,功能是持久化文章到文件系统,分成了 3 步:

1.   计算保存文件的路径

2.  数据库存储对象转 Json 字符串

3.  把 json 字符串保存到对应的文件中

对应的代码如下:

     var articlePath = FileStoreUtil.getArticlePath(articleDo.getIdPin());     var articleJson = JsonUtils.writeValueAsString(articleDo);     FileStrStore.setValue(articlePath, articleJson);    
复制代码


为什么要抽取 articlePath 和 articleJson 变量?而不是如下代码:

FileStrStore.setValue(FileKeyUtil.getArticlePath(articleDo.getIdPin()), JsonUtils.writeValueAsString(articleDo));
复制代码

虽然更简单,但我想大部分人阅读的时候还是会在人脑中把代码翻译为上面的 3 句代码来理解,变量是为了节省阅读者的脑运算,需要为阅读者搭建便于理解的梯子或台阶。

那为什么 articleDo.getIdPin()不抽取个变量呢?因为本身就很易读,不需要再给台阶了。


变量命名的相对性

如何命名是相对的,方法代码块中出现的局部变量有上下文,没必要太长,但也别命名 a,b,c,毕竟别人也要看,结合上下文能懂就行。JDK 的 var 新语法设计也是同理,局部范围结合上下文可以省略类型。

比如上面代码中命名 var articleJson,很容易感知是字符串类型。如果方法上下文只操作文章一个实体,改为 var json 也是很易读的。

变量命名在所处上下文能很容易理解的前提下,尽可能短,去除无用信息。


变量定义位置

变量的声明位置应该就近,变量尽可能离使用的地方近些,减少影响的作用域。

反例,统一在函数开始声明所有变量

var a = xx;var b = xxx;var c = xxxx;
//逻辑块1中使用变量 abXXXXXXXXXXXXXX=a*bXXXXXXXXXXXX
//逻辑块2中使用变量 cXXXXXXXXXXXXXX=c*XXXXXXXXXXXX
复制代码

应该改为就近,当然更优秀的做法是把两个逻辑抽象为小方法。就近让不同代码块无依赖,已经为小方法的抽取做好了准备。

//逻辑块1中使用变量 abvar a = xx;var b = xxx;XXXXXXXXXXXXXX=a*bXXXXXXXXXXXX
//逻辑块2中使用变量 cvar c = xxxx;XXXXXXXXXXXXXX=c*XXXXXXXXXXXX
复制代码


变量其他建议

•          命名能具体就不要模糊,明明是只狗,就不要叫动物了

•          多维度业务数据 Map 嵌套结构很难看懂,最好体现每个维度的业务语义来取代 Map<Map>结构。

•          不允许以 list,map,entry,temp 等命名,要思考表达的真实意思。


发布于: 2021 年 03 月 18 日阅读数: 10
用户头像

sdutyq

关注

还未添加个人签名 2019.10.15 加入

还未添加个人简介

评论

发布
暂无评论
程序中变量的抽取的时机,变量命名,变量位置