前言
Perl語言之父拉里·沃爾曾說過程序員有三大美德:懶惰、急躁、傲慢,很多程序員在平時工作中常常做很多重復的事情,寫很多重復的代碼,如果有懶惰的思想,就可以避免很多重復,從而提高開發效率,增加編程樂趣,我們需要的是一種智慧的懶惰。
舉個生活中重復的例子,我們會關注一些大佬的博客,為了看他們有沒有更新博文,我們經常會挨個點進他們的博客主頁。如果會用RSS的話,只要點進RSS客戶端首頁,就能看到哪些博主有了新的文章。生活中重復的例子還有很多,本系列文章只談談編程中的重復。
說到代碼層面的重復,不得不提起一個著名的軟件設計原則:DRY(Don’t Repeat Yourself),大概說的是應該避免重復的代碼。不過也有人寫過《DRY原則的危害》的文章,主要說不要過度抽象,不要太教條。我覺得各種技術、思想、原則,如果正確地使用都會有好處的,反之則會帶來一些危害,如果不會用那不如不用。
重復的危害大家應該都有體會,比如浪費時間、不利於重構、容易出錯等。選擇復制粘貼其實也是一種懶惰,懶於思考,這會讓我們工作十年,每年寫的是一樣的代碼,一直沒有進步。順帶提一下復制粘貼的技巧,有種叫歷史粘貼板的東西,IDEA和Win10都有這個功能。
Talk is cheap. Show me the code.
下面舉一個避免復制粘貼的代碼例子,這其實屬於后面第四篇文章所談的代碼生成。Java項目中經常會寫很多枚舉類,一般這些枚舉有兩個字段,一是枚舉值,對應數據庫中存在的字段,二是枚舉類型描述,用於展現,而且常常需要一個根據枚舉值獲取枚舉實例的方法。我們可以使用IDE的模板文件功能,只要確定枚舉類名,就可以自動生成所有的模板代碼。IDEA配置在"Settings -> Editor -> File and Code Templates -> Files -> Enum"下粘貼以下代碼(省略了注釋),完整代碼見我的Gist: idea-enum-file-template.java . 當需要新建一個枚舉類型時,只要在"Create New Class"對話框中輸入類名,"Kind"選擇"Enum"即可。
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
public enum ${NAME} {
;
private final int value;
private final String desc;
${NAME}(int value, String desc) {
this.value = value;
this.desc = desc;
}
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
private static final Map<Integer, ${NAME}> MAP = Arrays.stream(${NAME}.values())
.collect(Collectors.toMap(${NAME}::getValue, e -> e));
public static ${NAME} getByValue(Integer value) {
return MAP.get(value);
}
}
本系列的目錄
給自己挖個坑,后面博文從以下方面談談如何做一個不復制粘貼的程序員:
- 使用模板方法模式
- 使用AOP
- 代碼生成