Java如何给变量取合适的命名

一.变量命名风格

  变量命名风格通常会根据不同的变量类型来区分,以Java语言为例,根据变量类型不同有两种命名风格:

1)类成员变量、局部变量

  类成员变量、局部变量通常采用驼峰命名风格,如下:

String userName;

2)静态成员变量、枚举值、常量

  静态成员变量、枚举值、常量通常采用所有字母大写、多个单词以英文下划线连接,如:

public static final int MAX_YEARS = 25;
​
// 建议枚举类都以Enum结尾
enum ColorEnum {
  RED(0, "红色"),
  YELLOW(1, "黄色"),
  GREEN(2, "绿色"),
  WHITE(3, "白色"),
  BLACK(4, "黑色");
  private int code;
  private String name;
​
  Color(int code, String name) {
    this.code = code;
    this.name = name;
  }
}

二.变量命名最高境界

  在函数命名那篇中我们说的函数命名最高境界是见字如面,那么对于变量命名来说,最高境界是什么呢? 我认为是:自解释,即"代码即注释"。

  为什么这么说呢,因为通常来说一个函数是会有函数注释的,即使函数名字取的不好,如果注释写的比较清楚,对于后续维护人员来说也是了解函数具体功能的一种方式。

  而变量则不同,在一个工程里面,变量的数量远远大于函数的数量,所以不太可能对于每个变量都去写注释,所以如果一个工程的变量命名很糟糕,那么对于后续维护人员来说将是毁灭性的打击,因为每读到一个变量,可能就需要去猜测变量的含义,我想没有哪个人愿意读到这样的代码,永远记住一点:"代码是写给人看的,不是写给机器看的"。

  譬如下面这段代码的命名就非常糟糕:

ppn = (cpn > 1) ? (cpn - 1) : cpn;
npn = (cpn < tpn) ? (cpn + 1) : tpn;
p = new Page(ppn, cpn, npn, tpn);

  上面这段代码估计只有原作者清楚地知道各个变量的含义是啥了,

  如果修改为下面这种写法,可读性会好很多,并且一目了然,很容易知道其大概意图是计算分页信息:

prePageNum = (curPageNum > 1) ? (curPageNum - 1) : curPageNum;
nextPageNum = (curPageNum < totalPageNum) ? (curPageNum + 1) : totalPageNum;
page = new Page(prePageNum, curPageNum, nextPageNum, totalPageNum);

三.变量命名最佳实践

1)采用名词或者形容词来命名变量

  变量一般情况下建议使用名词、名字组合或者形容词,因为变量一般形容的是一种事物或者事物的属性,所以用名词或者名词组合更容易让人理解,而形容词一般用于bool类型的变量。

2)避免使用单字母变量,尽量细化变量含义

  在程序中,尽量避免使用单字母变量,唯一可以接受使用单字母变量的场景只有for循环,不过还是不太推荐在for循环中使用单字母变量(用pos、index比for循环的i、j、k要好很多)。

  举个例子,比如下面这行代码:

double calConeVolume(double b, double d) {
return Math.PI * b * b * d / 3;
}

  咋一看这个函数参数感觉挺清晰,但是一细看,b是什么?d又是什么?如果我要用这个函数,该怎么传参?估计大部人是一脸懵逼状,只能进去看实际的函数实现才知道b是圆锥体半径,d是圆锥体高度;

  那么怎么优化这段代码命名呢?其实很简单,稍微细化一下变量含义,让变量名自己去表达实际意图:

double calConeVolume(double radius, double height) {
return Math.PI * radius * radius * height / 3;
}

3)变量命名前后用词需统一

  在同一个工程或者一个场景下,变量命名风格需前后统一,比如total和sum都能表示总计的意思,那么所有需要用到"总计"含义的地方要么全部使用total、要么全部使用sum。

  保持前后命名风格统一是保证工程代码良好可读性的关键保证。

4)集合变量用类型或者复数s作为后缀

  在java中,有很多集合,比如List、Map、Set等,那么集合变量该怎么命名呢?

  一般可采取两种方式:

使用复数s结尾

List<Student> students = new ArrayList<>();

用集合类型作为后缀

List<Student> studentList = new ArrayList<>();

  上面两种方式均可,没有比较明显的偏好,根据实际场景决定。第一种方式相对更简洁,第二种在局部作用域里面有多种相关的集合变量时区分度更大,比如:

List<Student> studentList = new ArrayList<>();
Map<Long, Student> studentMap = Maps.newHashMap();
​
for (Student stu : studentList) {
 studentMap.put(stu.getId, stu);
}

  我的建议是如果局部作用域只有一种类型的集合,那么推荐使用复数形式;如果局部作用域有多个相关的集合类型,那么推荐用类型结尾。

5)禁止使用is作为bool类型的类成员变量前置

  在java中,禁止用is作为bool类型的类成员变量的前缀,因为is作为前缀会导致序列化/反序列出现问题,阿里的java代码规范中也明确提到了这一点,所以在写代码的时候最好还是遵守公认的规范,不然哪天说不定就踩坑了。

6)尽量避免使用缩写进行命名

  有些时候,变量名可能有点长,不利于代码可读性,因此很多时候在写代码的时候喜欢用缩写来命名,但这个不是一个好的习惯,除非使用的缩写是大家都会使用的约定俗称的缩写。

  比如下面这个命名:

int averageStudentAge; => int avgStudentAge;

  因为avg大家都知道是average的缩写,所以这么写问题不大,不会引起歧义;

  但是下面这种缩写命名:

res
tmp
cnt

  就不是好的缩写命名,因为不同的人阅读可能会有不同的理解:

res => response、resource、result
tmp => temporary、template
cnt => count、content、context

  附上一些约定俗称的缩写:

全称 缩写
identification id
average avg
maximum max
minimum min
buffer buf
error err
message msg
image img
length len
library lib
password pwd
position pos
data transfer object dto
view object vo

7)抛弃掉flag变量

  国内一些早期的教材上,到处充斥着各种flag风格的变量,这种命名方式对于大型工程简直就是噩梦,比如:

int flag = getDoctorFlag(doctorId);
if (flag == 1) {
//....
}

  看到这段代码,读者会有疑问flag变量的含义是什么?flag值为1的时候又代表什么含义?是医生的值班/在岗状态、还是医生的身体状态?估计读者的内心是崩溃的。

  如果优化成下面这种形式:

DutyStatus doctorDutyStatus = getDoctorDutyStatus(doctorId);
if (doctorDutyStatus == DutyStatus.ONLINE) {
// ...
}

  就比上面的形式清晰多了,很容易看出来判断的是医生的值班/在岗状态。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2020-10-26

变量声明时命名与变量作为对象属性时命名的区别解析

这个标题实在拗口,Javascript命名变量所遵循的规则 1.第一个字符必须是字母.汉字字符. 下划线(_)或美元符号($) 2.剩下的可以是下划线.汉字字符. 美元符号和任何字母.数字 以下声明变量是正确的 复制代码 代码如下: var p,$p,_p; var 长,宽; 以下是错误的 复制代码 代码如下: var .p;//只能是字母.数字.下划线或美元符号 var -p;//只能是字母.数字.下划线或美元符号 var p*;//只能是字母.数字.下划线或美元符号 var 4p,4长;//

你必须知道的JavaScript 变量命名规则详解

变量命名还应遵守以下某条著名的命名规则: 著名的变量命名规则Camel 标记法首字母是小写的,接下来的字母都以大写字符开头.例如: 复制代码 代码如下: var testValue = 0, secondValue = "hi";Pascal 标记法 首字母是大写的,接下来的字母都以大写字符开头.例如: 复制代码 代码如下: var TestValue = 0, SecondValue = "hi";匈牙利类型标记法 在以 Pascal 标记法命名的变量前附加一个小

Python 变量类型及命名规则介绍

首字母为英文和下划线,其它部分则可以是英文.数字和下划线(即:_),而变量名称是区分大小写,即变量temp与Temp为不同变量.变量的基本用法如下: 复制代码 代码如下: # 例:使用变量a = 10b = 20print a + b>>> 30   # 输出a加b的值a = 'hello'b = 'python'print a + ' ' + b>>> hello python  # 输出a加b的值 上面几个例子是使用变量进行运算,python的变量可以分为数字.字符

超全面的javascript中变量命名规则

前言 变量的命名相对而言没有太多的技术含量,今天整理有关于变量命名相关的规则,主要是想告诉大家,虽然命名没有技术含量,但对于个人编码,或者说一个团队的再次开发及阅读是相当有用的.良好的书写规范可以让你的JavaScript代码更上一个台阶,也更有利于团队的再次开发和阅读代码. 全名原则 变量名区分大小写,允许包含字母.数字.美元符号($)和下划线,但第一个字符不允许是数字,不允许包含空格和其他标点符号 变量命名长度应该尽可能的短,并抓住要点,尽量在变量名中体现出值的类型 尽量避免使用没有意义的命

老生常谈javascript变量的命名规范和注释

简单说,标识符命名规则如下: 第一个字符可以是任意Unicode字母,以及美元符号($)和下划线(_). 第二个字符及后面的字符,还可以用数字. 下面这些都是合法的标识符. arg0 _tmp $elem π 下面这些则是不合法的标识符. 1a 23 *** a+b -d 中文是合法的标识符,可以用作变量名. var 临时变量 = 1; JavaScript有一些保留字,不能用作标识符:arguments.break.case.catch.class.const.continue.debugge

详解Python中的变量及其命名和打印

在程序中,变量就是一个名称,让我们更加方便记忆. cars = 100 space_in_a_car = 4.0 drivers = 30 passengers = 90 cars_not_driven = cars - drivers cars_driven = drivers carpool_capacity = cars_driven * space_in_a_car average_passengers_per_car = passengers / cars_driven print "

IntelliJ IDEA使用快捷键重命名项目、变量、文件等方法总结

我表示,我在刚刚使用这个编辑器的时候,还真不知道怎么去重命名一个变量,重命名一个文件,或者一个文件夹. 理论上讲,你要是改动一个地方,那么,其他所有引用的地方,应该跟着都给自动的改了的. 不然,你一个个的改,要是引用的地方多了去了,那不改死你啊. 所以,这肯定有个方便快捷的地方来实现这个功能的.说这么多,也就一个快捷键的事. (有兄台表示:我这个是eclipse的快捷键.没错,这就是eclipse上的快捷键吧,这个是可以设置的) 至于这个快捷键,不要太在意,因为,我们使用的系统不同,键盘映射不同

和孩子一起学习python之变量命名规则

变量命名规则 下面是关于变量名(也称为标识符)的一些规则 必须以一个字母或一个下划线字符开头.后面可以使用一个字母.数字或下划线字符的序列,长度不限. 字母可以是大写或小写,大小写是不同的.也就是说,Ax不同于aX. 数字可以是从0到9(包括0到9)的任意数字字符. 除了字母.数字和下划线字符,不能使用其他字符.空格.标点符号和其他字符在变量名中都是不允许的. 唯一允许出现的特殊字符是下划线字符.也许你不知道这是什么,下面给出几个例子: First_number=15 Student_name=

javascript 命名规则 变量命名规则

JavaScript变量匈牙利命名法 匈牙利命名法语法: 变量名=类型+对象描述 类型指变量的类型 对象描述指对象名字全称或名字的一部分,要求有明确含义,命名要容易记忆容易理解. 提示: 虽然JavaScript变量表面上没有类型,但是JavaScript内部还是会为变量赋予相应的类型. 提示: 匈牙利命名法是一位微软程序员发明的,多数的C,C++程序都使用此命名法. JavaScript变量匈牙利命名类型 JavaScript变量起名类型 变量命名前缀 Array 数组 a Float 浮点

JavaScript 变量命名规则

JScript 是一种区分大小写的语言. 第一个字符必须是一个 ASCII 字母(大小写均可),或一个下划线(_).注意第一个字符不能是数字. 后续的字符必须是字母.数字或下划线. 变量名称一定不能是 保留字. 下面给出合法变量名称的一些示例: _pagecount Part9 Number_Items 下面给出无效变量名称的一些示例: 99Balloons // 不能以数字开头.Smith&Wesson // "与"符号(&)字符用于变量名称是无效的.

深入理解Python中变量赋值的问题

前言 在Python中变量名规则与其他大多数高级语言一样,都是受C语言影响的,另外变量名是大小写敏感的. Python是动态类型语言,也就是说不需要预先声明变量类型,变量的类型和值在赋值那一刻被初始化,下面详细介绍了Python的变量赋值问题,一起来学习学习吧. 我们先看一下如下代码: c = {} def foo(): f = dict(zip(list("abcd"), [1, 2 ,3 ,4])) c.update(f) if __name__ == "__main__

Python之变量类型和if判断方式

Python基础 1.数据类型(举几个最常用的) 整数型(int),可以理解为不带小数点的数字,比如13,-456等 浮点型(float) ,带小数点的数字,比如456.13,-798.13等 字符串(string),用'',"",''' '''或者""" """包裹的任意文本,比如'132',"abc"等, 如果输入的文本中包括''或者""需要在前面加\转义,比如'i\'m ok'这样

python变量命名的7条建议

前言 Quora 问答社区的一个开发者投票统计,程序员最大的难题是:如何命名(例如:给变量,类,函数等等),光是如何命名一项的选票几乎是其它八项的投票结果的总和.如何给变量命名,如何让它变得有意义成了程序员不可逾越的难题,这篇文章参考了 Clean Code ,提供7条命名建议,希望能在取名字的过程中给你带来一些帮助. 以下都是基于Python3.7语法 1.使用有意义而且可读的变量名 差 ymdstr = datetime.date.today().strftime("%y-%m-%d&quo

Python新手学习标准库模块命名

与Python标准库模块命名冲突 Python的一个优秀的地方在于它提供了丰富的库模块.但是这样的结果是,如果你不下意识的避免,很容易你会遇到你自己的模块的名字与某个随Python附带的标准库的名字冲突的情况(比如,你的代码中可能有一个叫做email.py的模块,它就会与标准库中同名的模块冲突). 这会导致一些很粗糙的问题,例如当你想加载某个库,这个库需要加载Python标准库里的某个模块,结果呢,因为你有一个与标准库里的模块同名的模块,这个包错误的将你的模块加载了进去,而不是加载Python标