通过实例告诉你,什么样的代码叫做具有可读性

大家经常说代码可读性,那么什么样的代码才叫具有可读性呢?怎样才能写出具有可读性的代码呢?
下面通过一个实例,来说明什么叫代码可能读性,并分享一些新爷总结的编码经验,帮你更好的写出高可读性代码。

看下面这段代码,这段代码的功能是实现DES加密解密的。重点关注 encryptPropertydecryptPropertyperformDESedeCoder 这三个方法就OK了,其他代码细节可以不用关注。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class DESedeCoder {
private byte[] key;
private byte[] readKeyFromProperty() {
String keyStr = "2LOMSMT9SKOI43URQAXWUCWCBCPWEE4XWT4OTR";
byte[] result = Base64.decodeBase64(keyStr);
return result;
}
private void iniKey() {
this.key = this.readKeyFromProperty();
}
public String encryptProperty(String clearText) {
if(this.key == null) {
this.iniKey();
}
return this.performDESedeCoder(clearText, this.key, true);
}
public String decryptProperty(String clearText) {
if(this.key == null) {
this.iniKey();
}
return this.performDESedeCoder(clearText, this.key, false);
}
public String performDESedeCoder(String inputStr, byte[] key, boolean encrypt) {
String result = null;
String KEY_ALGORITHM = "DES";
String CIPHER_ALGORITHM = "DES";
try {
DESedeKeySpec e = new DESedeKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
SecretKey secretKey = keyFactory.generateSecret(e);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
byte[] input;
if(encrypt) {
cipher.init(1, secretKey);
input = inputStr.getBytes();
} else {
cipher.init(2, secretKey);
input = Base64.decodeBase64(inputStr);
}
byte[] data = cipher.doFinal(input);
if(data == null) {
result = inputStr;
} else if(encrypt) {
result = Base64.encodeBase64String(data);
} else {
result = new String(data);
}
} catch (Exception e) {
result = inputStr;
}
return result;
}

代码点评:这段代码的核心是 performDESedeCoder这个方法。该方法接受三个参数,其中一个参数是boolean encrypt ,如果该参数为true,表示执行加密操作,相反则执行解密操作。
同时该类提供了两个方法encryptPropertydecryptPropertyperformDESedeCoder方法进行了封装。这样看起来貌似没什么问题。而且对关健方法进行了二次封装,方便使用。

再来看实现同样功能的另一段代码,俗话说的好,没有比较就没有伤害。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class DescodecUtil {
private final static String defaultKey = "2LOMSMT9SKOI43URQAXWUCWCBCPWEE4XWT4OTR";
private final static String KEY_ALGORITHM = "DES";
private final static String CIPHER_ALGORITHM = "DES";

//解密
public static String decrypt(String encryptData){
String decryptData = null;
byte[] defaultByteKey = Base64.decodeBase64(defaultKey);
try {
DESedeKeySpec deSedeKeySpec = new DESedeKeySpec(defaultByteKey);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
SecretKey secretKey = keyFactory.generateSecret(deSedeKeySpec);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE,secretKey);
Object input = Base64.decodeBase64(encryptData);
byte[] data = cipher.doFinal((byte[]) input);
if (data != null){
decryptData = new String(data);
}
} catch (Exception e) {
e.printStackTrace();
}
return decryptData;
}

//加密
public static String encrypt(String data){
String decryptData = null;
byte[] defaultByteKey = Base64.decodeBase64(defaultKey);
try{
DESedeKeySpec deSedeKeySpec = new DESedeKeySpec(defaultByteKey);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
SecretKey secretKey = keyFactory.generateSecret(deSedeKeySpec);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] input = data.getBytes();
byte[] prepareData = cipher.doFinal(input);
if (prepareData != null){
decryptData = Base64.encodeBase64String(prepareData);
}
}catch (Exception e){
e.printStackTrace();
}
return decryptData;
}

代码点评:这段代码应该不用我点评了,代码结构清晰易懂,一共两个函数,一个加密,一个解密。
我相信大部分程序员会更喜欢第二段代码。因为无论在可维护性和可读性方面,都强过第一段代码。

如何写出具有可读性代码,最主要的原则之一就是函数单一职责。在定义方法的时候应该遵循一个方法只做一件事的原则。反例中的performDESedeCoder方法,同时做了两件事情,即做加密又做解密。不仅增加了函数内代码逻辑复杂度,还增加使用函数方出错概率,因为很容易把trueflase弄混了。

下面我把我的经验总结一下,供大家参考交流

  1. 函数单一职责,如上例。
  2. 尽量少的函数参数,多则乱,乱则容易出错。
  3. 清晰易懂的函数及变量命名,不要担心名字过长,毕竟我们的显示器都变大了。
  4. 准确明了的函数及变量注释。
    不要使用晦涩但是很炫酷的语法糖,除非它能提高性能。
  5. 尽量使用空行隔开函数与函数,函数与全局变量的距离。不要为了节省显示空间,而把代码都缩减的很紧凑(写技术文章除外)。人均住房面积都提高了,何况代码块乎。

最后,希望大家记住一句话,你写的代码,虽然是给机器看的,但更多是给你的同事和你自己看的。
请善待你和你的同事,尽你最大努力写出简单清晰的代码。

-------------本文结束-------------
坚持原创技术分享,您的支持将鼓励我继续创作!
0%