做一個不復制粘貼的程序員[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. 使用AOP
  3. 代碼生成


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM