1. 程式人生 > >做一個不復制貼上的程式設計師[0]: 概述

做一個不復制貼上的程式設計師[0]: 概述

前言

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);
        }
    }

本系列的目錄

給自己挖個坑,後面博文從以下方面談談如何做一個不復制貼上的程式設計師:

  1. 提取方法
  2. 使用模板模式
  3. 使用AOP
  4. 程式碼生成