代碼簡潔之四 統一抽象層次


我是一個phper,但是也寫java,ruby,python,go等代碼。最近一直focus on coding in clean,覺得拋開語言的門第之見,從思想上總結如何寫更優雅代碼的方式和方法,也希望閱讀了本文的朋友留言討論。當然我還是用php做代碼演示,不過靈感是來自於《代碼簡潔之道》的java代碼。

首先我要提出一個概念:寫代碼和寫文章是完全一樣的事情。

文章可以寫得短小精悍,也可寫得冗余拖沓。可以寫得言簡意干、調理清晰,也可被寫成雲里霧里的天書。

同樣的現象也會發生在我們寫得代碼上。一千個coder可能寫出超過一千種style的代碼。那些丑陋的代碼不僅諱莫如深,而且會腐爛到讓整個程序都崩坍。

寫好一手好代碼, 我覺得涉及的點太多,我下面只談一個概念:封裝的抽象層次。

其實代碼無論是面向過程,還是面向對象方式或者AOP方式去編寫,只是代碼的組織方式不同罷了。具體到每一行的書寫,我希望是做到一行一個調用,每個封裝的函數是同一個抽象層次,每個函數里面的封裝調用也是同一個抽象層次。如果不在同一個抽象層次,那么就會讓可讀性變差,讓人不知道總的步驟邏輯的脈絡 ,每當這個時候就需要move methods和extract method。

做一個更好的攻城獅,需要有好的鼻子,能夠smell到壞代碼中的bad 味道。

最近在寫一個API項目,還是用的restful+mongo方式,然后在model層里面我對驗證的鈎子程序作了驗證調用的封裝,大致如下:

    public function validation()
    {
        $this->checkRequire();
        $this->checkPhone();
        $this->checkNumeric();
        $this->checkRegion();

        return $this->validationHasFailed() != true;
    }

 

每一行調用都是檢查某類型字段的有效性,看起來也沒什么錯。但實際上最后一行的checkRegion和checkPhone的抽象程度比其他幾個要低,他們已經不是某類型的字段的檢查,而是具體到phone字段的有效性和行政區域的有效性的檢查。我們可以根據實際的業務做一些調整,我的調整如下:

 public function validation()
    {
        $this->checkRequire();
        $this->checkRegex();
        $this->checkNumeric();
        $this->checkArray();

        return $this->validationHasFailed() != true;
    }

    /**
     * 檢查所有涉及需要正則匹配有效性的字段
     */
    public function checkRegex()
    {
        $this->checkPhone();
        $this->checkId();
        $this->checkWeiXinID();
    }

    /**
     * 檢查所有至少必須是數組類型字段
     */
    public function checkArray()
    {
        $this->checkRegion();
        $this->checkTags();
        $this->checkServices();
    }

這樣改了之后,感覺代碼層次更分明了,也更容易閱讀。其實很可能有很多人會反對我的調整方法。他們會吐槽:把這些調用層次弄那么深入,感覺會加到代碼運行成本,也讓查閱代碼需要不斷地跳轉調用的地方,還讓代碼變多了(因為有新的一層封裝,當然代碼行數會增加)。其實寫代碼就是在找平衡,我還是非常支持在《代碼簡潔之道》里面說的成本維度順序:
代碼簡潔性。
功能完整。
執行效率(速度)。
編程所用時間。
健壯性。
靈活性


編程本就是折中的結果。時間成本和質量之間做平衡。

放在第一條的就是簡潔,而簡潔最重要的一點是可讀性。調用層次深在語言層次上的消耗可以忽略不計,隨着php7的穩定版發布,它的性能已經double了,何況還有zend做一層代碼緩存的方法。再者查詢代碼可以使用高效的ide(或者你像我一樣是vimer死忠,早就把vim弄得插件化了)去查閱,完全不會增加閱讀難度,反而由於抽象層次一致,更理解代碼上的實現和業務邏輯的梳理。


免責聲明!

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



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