大家经常说代码可读性,那么什么样的代码才叫具有可读性呢?怎样才能写出具有可读性的代码呢?
下面通过一个实例,来说明什么叫代码可能读性,并分享一些新爷总结的编码经验,帮你更好的写出高可读性代码。
看下面这段代码,这段代码的功能是实现DES加密解密的。重点关注 encryptProperty
,decryptProperty
,performDESedeCoder
这三个方法就OK了,其他代码细节可以不用关注。
1 | public class DESedeCoder { |
代码点评:这段代码的核心是 performDESedeCoder
这个方法。该方法接受三个参数,其中一个参数是boolean encrypt
,如果该参数为true
,表示执行加密操作,相反则执行解密操作。
同时该类提供了两个方法encryptProperty
和decryptProperty
对performDESedeCoder
方法进行了封装。这样看起来貌似没什么问题。而且对关健方法进行了二次封装,方便使用。
再来看实现同样功能的另一段代码,俗话说的好,没有比较就没有伤害。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
46public 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
方法,同时做了两件事情,即做加密又做解密。不仅增加了函数内代码逻辑复杂度,还增加使用函数方出错概率,因为很容易把true
和flase
弄混了。
下面我把我的经验总结一下,供大家参考交流
- 函数单一职责,如上例。
- 尽量少的函数参数,多则乱,乱则容易出错。
- 清晰易懂的函数及变量命名,不要担心名字过长,毕竟我们的显示器都变大了。
- 准确明了的函数及变量注释。
不要使用晦涩但是很炫酷的语法糖,除非它能提高性能。 - 尽量使用空行隔开函数与函数,函数与全局变量的距离。不要为了节省显示空间,而把代码都缩减的很紧凑(写技术文章除外)。人均住房面积都提高了,何况代码块乎。
最后,希望大家记住一句话,你写的代码,虽然是给机器看的,但更多是给你的同事和你自己看的。
请善待你和你的同事,尽你最大努力写出简单清晰的代码。