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) {
// ...
}

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

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

(0)

相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  • 详解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 "

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

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

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

    一.变量命名风格 变量命名风格通常会根据不同的变量类型来区分,以Java语言为例,根据变量类型不同有两种命名风格: 1)类成员变量.局部变量 类成员变量.局部变量通常采用驼峰命名风格,如下: String userName; 2)静态成员变量.枚举值.常量 静态成员变量.枚举值.常量通常采用所有字母大写.多个单词以英文下划线连接,如: public static final int MAX_YEARS = 25; ​ // 建议枚举类都以Enum结尾 enum ColorEnum { RED(0

  • 浅析Java进制转换、输入、命名问题

    Java进制转换和C语言C++没有什么区别,不过因为我对进制转换不太熟悉,此处特记录一下生疏部分: 十进制转二进制:除以二取余数,直到商为零,余数顺序倒过来取就是二进制表示的数值.(八进制.十六进制同理) 二进制转八进制:二进制数值三位一组计算数值. 二进制转十六进制:二进制四位一组计算数值. 八进制.十六进制转二进制 是 二进制转八进制十六进制 的逆运算. Java输入输入似乎比C/C++要复杂(?) 首先要引入包util下的Scanner,创建Scanner的一个对象,之后才可以执行输入.

  • Java 中的变量类型

    目录 1.局部变量 2.成员变量(实例变量) 3.类变量 1.局部变量 在方法或语句块中定义的变量被称为局部变量.变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁. 局部变量声明在方法.构造方法或者语句块中: 局部变量在方法.构造方法.或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁: 访问修饰符不能用于局部变量: 局部变量只在声明它的方法.构造方法或者语句块中可见: 局部变量是在栈上分配的. 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用. 2.成员

  • maven配置文件pom增加变量取版本号方式

    目录 maven配置文件pom增加变量取版本号 1.定义版本号 2.取版本号,方便以后架包版本升级 maven读取程序版本号的3种方法 方法1 方法2 方法3 maven配置文件pom增加变量取版本号 1.定义版本号 <properties> <spring.version>3.2.2.RELEASE</spring.version> </properties> 2.取版本号,方便以后架包版本升级 <dependency> <groupId

  • java数据类型与变量的安全性介绍

    目录 一.标识符 二.数据类型 三.变量 1.无初始化 2.赋值超出范围 3.long与float的使用 4.除法的使用 5.浮点数的精度问题 6.boolean类型变量的使用 7.类型提升 四.初始字符串 一.标识符 在java中规定标识符中只能包含:字母,数字及下划线和$ 符号,但不能以数字开头,严格区分大小写. 参考标准当中的规定:1.类名:大驼峰,每个单词首字母大写(HelloWorld)2.方法名:小驼峰,从第二个单词开始每个单词首字母大写(helloWorld)3.变量名:小驼峰 不

  • java简单网页抓取的实现方法

    本文实例讲述了java简单网页抓取的实现方法.分享给大家供大家参考.具体分析如下: 背景介绍 一 tcp简介 1 tcp 实现网络中点对点的传输 2 传输是通过ports和sockets ports提供了不同类型的传输(例如 http的port是80) 1)sockets可以绑定在特定端口上,并且提供传输功能 2)一个port可以连接多个socket 二 URL简介 URL 是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址. 互联网上的每个文件都有一个唯一的

  • JAVA使用爬虫抓取网站网页内容的方法

    本文实例讲述了JAVA使用爬虫抓取网站网页内容的方法.分享给大家供大家参考.具体如下: 最近在用JAVA研究下爬网技术,呵呵,入了个门,把自己的心得和大家分享下 以下提供二种方法,一种是用apache提供的包.另一种是用JAVA自带的. 代码如下: // 第一种方法 //这种方法是用apache提供的包,简单方便 //但是要用到以下包:commons-codec-1.4.jar // commons-httpclient-3.1.jar // commons-logging-1.0.4.jar

  • java中Servlet Cookie取不到值原因解决办法

    java中Servlet Cookie取不到值原因解决办法 现象: 在测试带Cookie的HTTP请求时发现,服务端用request.getHeader("cookie")可以去到值; 但是用request.getCookies()却不行 Cookie mycookies[] = request.getCookies(); 中永远获取不到uid的值:(80端口号除外) 原因: 查了浏览器的具体cookie值,发现 http://localhost:8080/ 访问的时候,cookie值

  • Java非静态成员变量之死循环(详解)

    1.非静态成员变量 当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环 例子: public class ConstructorCls { private ConstructorCls obj=new ConstructorCls(); } public class TestC { public static void main(String[] args) { ConstructorCls c =new ConstructorCls(); } } 结果: Exception in

  • 详解Java获取环境变量及系统属性的方法

    环境变量这个概念不陌生, 就是操作系统的环境变量. 系统变量就是java本身维护的变量. 通过 System.getProperty 的方式获取. 对于不同的操作系统来说, 环境变量的处理可能会有一些不统一的地方, 比如说: 不区分大小写 等等. Java 获取环境变量 Java 获取环境变量的方式很简单: System.getEnv()  得到所有的环境变量 System.getEnv(key) 得到某个环境变量的值 Map map = System.getenv(); Iterator it

随机推荐