面向對象是什麼?我面向的是一個世界!

    每次說到面向對象,都讓我想起當年最開始學習計算機的那段日子,因爲“只要膽子大,一週七天假”、“六十分萬歲多一分浪費”的這些口號麻痹着自己,學藝不精的我心安理得的將所有的功能敲進一個方法,爲了實現功能而實現功能,能寫死的一定寫死,導致每次有啥要改的地方都要將代碼從頭到尾修改一遍。

    然後我學到了面向對象。

    我覺得我叩開了新世界的大門。

 (圖片源自網絡,侵刪)

    隨着開發經驗的不斷增長,一個和現實世界完全不一樣但又無處不相似的世界慢慢刻在了我的生活裏,它不斷地進化,飛速的進化,用幾十年甚至幾年的時間進化出一個又一個複雜龐大卻不斷趨於完備的生物。EJB、String、 Struts、Hibernate、MyBatis、SVN、Git、SpringBoot、SpringCloud、Dubble、Zookeeper、MySQL等等等等,這些龐然大物推動着這個世界飛速進化着。我開始明白爲啥大部分的框架都在用小動物的圖標作爲自身的代表,因爲框架的開發者的眼中,這就是自己的孩子吧。而這個世界的飛速演化,正是因爲面向對象思想的不斷完善以及進步。

    那麼,面向對象到底是個啥?

    面向對象,是一種對現實世界理解和抽象的方法,是計算機編程發展到一定階段後的產物。

    簡而言之,就是將功能和行爲封裝進一個對象,強調具備功能行爲的對象。

    再通俗點的話,比如你是超市老闆,最開始的時候,超市的進貨、上架、標價、出售、維護、記賬都是由你自己完成,這就是最開始的面向過程。

/**
 * 超市類
 */
class Supermarket {
    private Logger logger = LoggerFactory.getLogger(Supermarket.class);
​
    /**
     * 超市運行方法
     */
    public void run(){
        logger.info("進貨");
        logger.info("上架");
        logger.info("出售");
        logger.info("維護");
        logger.info("標價");
        logger.info("記賬");
    }
}

    但是隨着顧客越來越多,超市越開越大,慢慢的你開始力不從心了,於是你找了幾個服務員,有人負責進貨和上架,有人負責出售和維護,有人負責標價和記賬,這就是面向對象。

/**
 * 超市類
 */
class Supermarket {
    private Logger logger = LoggerFactory.getLogger(Supermarket.class);
​
    /**
     * 超市運行方法
     */
    public void run(){
        new Salesperson("李明").work("進貨", "上架");
        new Salesperson("李雷").work("出售", "維護");
        new Salesperson("韓梅梅").work("標價", "維護");
    }
}
​
/**
 * 售貨員
 */
class Salesperson {
    private Logger logger = LoggerFactory.getLogger(Salesperson.class);
​
    private String name;
​
    public Salesperson(String name){
        this.name = name;
    }
​
    /**
     * 工作
     */
    public void work(String...jobs){
        for (String job : jobs) {
            logger.info(this.name + "正在做工作:" + job);
        }
    }
}

    ​面向對象有什麼優勢呢?首先你不需要再凡事都自己幹了,員工可以去做,降低了耦合性。如果你突然還想加一個打掃衛生的功能,你只需要再招一個打掃衛生的員工就好了,提高了可維護性。所以面向對象對於系統的功效就是降低了耦合,提高了可維護性。

 

    ​面向過程是具體化的,流程化的,解決一個問題,你需要一步一步去實現。

    ​面向對象是模型化的,你只需抽象出一個類,這是一個封閉的盒子,在這裏你擁有數據也擁有解決問題的方法。需要什麼功能直接使用就可以了,不必去一步一步的實現,至於這個功能是如何實現的,我們可以忽略,只要我們會用就可以了。 就像你不會記賬,但是你可以招一個會記賬的員工就好了。

    ​面向對象的思維就像是一個二次元的世界,每個對象也會有自己的行爲以及動作,我們的程序就是將這些對象構建出來,然後讓他們去有機的去完成一些任務,就像是在公司裏的我們,每一個人單獨拿出來都是一個對象,每一個人負責的工作是不同的,單獨拿出來這個工作可能毫無意義,但是所有人的工作加起來就變成了一個有序運作的公司整體​。

(圖片源自網絡,侵刪)

​    ​在最開始的機器語言時代,程序猿開發是比較困難的,因爲人需要將想讓機器運轉的行爲轉換爲機器的二進制編碼錄入進去​。這就像我們的世界最開始只有水、空氣這種元素的時候。

    ​到了後來的彙編語言,定義了基本的語法結構、操作符和數據類型,但是本質還是針對特定的硬件編程,比如cpu​。就像是世界開始產生單細胞生物了。

    再到後面的高級語言,類似於C++/Java/.NET​。抽象出來了語言,實現了硬件無關性,不需要再面對硬件編程。而且類似於Java這種通過實現一個jvm虛擬機,屏蔽了各個操作系統的差異,同時定義了一個標準的目標代碼(class文件),只要class文件滿足jcp定義的規範,就可以被jvm執行。就像世界的生物開始進化出了動物植物等各種高等生物​。

    ​而現在,這個二次元的各種生物正在不斷的進化中,各種框架的不斷髮展,核心思想依然是面向對象,在機器學會使用自然語言之前,人類依舊需要通過面向對象的思想,將自然語言轉換爲計算機程序。

(圖片源自網絡,侵刪)

    ​最後,引用一段《大話設計模式》中大鳥給小菜講的故事:

    ​“話說三國時期,曹操帶領百萬大軍攻打東吳,大軍在長江赤壁駐紮,軍船連成一片,眼看就要滅掉東吳,統一天下,曹操大悅,於是大宴衆文武,在酒席間,曹操詩性大發,不覺吟道:‘喝酒唱歌,人生真爽……’衆文武齊呼:‘丞相好詩!’於是一臣子速命印刷工匠刻版印刷,以便流傳天下。”

    ​“樣張出來給曹操一看,曹操感覺不妥,說道:‘喝與唱,此話過俗,應改爲‘對酒當歌’較好!’於是此臣就命工匠重新來過。工匠眼看連夜刻版之工,徹底白費,心中叫苦不迭。只得照辦。”

    ​“樣張再次出來請曹操過目,曹操細細一品,覺得還是不好,說:‘人生真爽‘太過直接,應改問語纔夠意境,因此應改爲‘對酒當歌,人生幾何……’當臣子轉告工匠之時,工匠暈倒……”

 

大鳥:“小菜你說,這裏面問題出在哪裏?”

小菜:“是不是因爲三國時期活字印刷還未發明,所以要改字的時候,就必須要整個刻板全部重新刻。”

大鳥:“說得好!如果是有了活字印刷,則只需更改四個字就可,其餘工作都未白做。豈不妙哉。

一、要改,只需更改要改之字,此爲可維護

二、這些字並非用完這次就無用,完全可以在後來的印刷中重複使用,此乃可複用

三、此詩若要加字,只需另刻字加入即可,這是可擴展

四、字的排列其實可能是豎排可能是橫排,此時只需將活字移動就可做到滿足排列需求,此是靈活性好。”

    ​“而在活字印刷術出現之前,上面的四種特性都無法滿足,要修改,必須重刻,要加字,必須重刻,要重新排列,必須重刻,印完這本書後,此版已無任何可再利用價值。”

小菜:“是的,小時候我一直奇怪,爲何火藥、指南針、造紙術都是從無到有,從未知到發現的偉大發明,而活字印刷僅僅是從刻版印刷到活字印刷的一次技術上的進步,爲何不是評印刷術爲四大發明之一呢?原來活字印刷是思想的成功,面向對象的勝利。”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章