關于抽象有感

本人菜鳥一枚,最近學習設計模式之余對于抽象忽有一絲明悟。因記性不好怕以后遺忘,便總結記錄一下。如果錯誤,望分享指出。

首先說個栗子

在我初中那會,移動卡有專門移動的手機,聯通有專門聯通的手機,電信有專門移動的手機。

我記得高中那時候,我用了存了好久的錢在學校旁邊的移動手機店里買了我人生的第一部手機,同時也買了一張移動的電話卡。

移動信號好,但是那玩意話費貴啊,流量也貴。那時候正好有大王卡出來,我就想換張聯通的卡。結果搞了大王卡發(fā)現用不了,為什么呢?因為我是移動的手機,用不了聯通的卡。那沒辦法,咋辦?那時候又沒錢只好等著換新手機,只是我心中暗暗下定決心下次一定要買一部全網通的手機。


抽象這個詞其實就跟它的名字一樣就很抽象。

搜狗漢語對他的解釋為,「從許多事物中,舍棄個別的、非本質的屬性,抽出共同的、本質的屬性的過程,是形成概念的必要手段」

通過抽取一些事物的共同點,形成某種概念可以來概述形容這些事物。抽象是一個過程,抽象后得到的結果就是一類事物的統(tǒng)稱。

比如說,水果,是蘋果,梨子,橘子等等可以用水果的特點來形容的事物的統(tǒng)稱。

那么,在程序中抽象的意義在哪里呢?我直接想要什么用什么不好嗎?

在依賴倒置原則中,有這么一個說法「高層次的類不應該依賴于低層次的類。兩者都應該依賴于抽象接口。抽象接口不應依賴于具體實現。具體 實現應該依賴于抽象接口?!?/p>

為什么這么做呢?其實通過最開始的例子就可以知道了。

電話卡可以當成一個抽象類或者接口,而移動卡,聯通卡,電信卡可以當做是電話卡這個抽象的具體實現。如果把我們的手機當做一個函數,那么電話卡就是這個函數所需要的參數。也就是手機依賴電話卡,也就是我只要是電話卡就行了不用管是移動還是聯通還是電信。但是如果是那種合約機,將參數定指定成了移動的??赡芪易铋_始用沒有差別,但是人生跟我們的項目一樣都是不是一成不變的,可能有一點我需求變了,變成了聯通卡。那怎么辦呢,那就只能搞個聯通的手機。如此往復,對于代碼來說就是特別的冗余。對于生活來說,就是家里有礦。

「可以使程序的設計者把主要精力放在程序的設計上,而不必拘泥于細節(jié)的實現」

我覺得這句話把整個面向抽象的意義總結的很到位。程序設計者可以不用去管具體的實現方式是怎樣的,因為細節(jié)是不斷變化的。但是對于整個項目的架構來說,這一個塊我可能只需要知道他有這個功能就行了。但是他怎么實現的,我不需要知道。這樣有助于日后程序的擴展以及解耦,以不變應萬變。

很多人都知道API接口,其實API跟程序內部的抽象接口也是有同理之處的。

對于API接口來說,我們只需要這個接口可以獲取xx功能的數據,可以完成xx功能。API接口只需要給出一個具體的API文檔,根據文檔獲取數據就行了。然后調用著根據返回的數據格式來使用數據。

那么對于抽象接口來說呢,其實也是一樣的。每個抽象接口都規(guī)定了一些方法。然后所有實現了這個抽象接口的都必須實現這個方法,然后我不需要知道每個細節(jié)具體是怎么實現的。我只知道根據抽象接口的方法來使用就可以了。

API接口通過參數文檔來約束自己,而抽象接口本身就是一個約束。

對于實際使用案例來說,舉個例子。

假設我們對于數據庫的需求只有增刪改查4個功能,但是我們有不同的數據庫,比如sqlserver,MySQL等等等等。

假如我們需要一個中間類來專門幫我們處理數據庫的連接,到我們要傳入針對每個數據庫不同的dbhelper類。如果我們針對每個數據庫都新建一個方法的話,那么假如數據庫特別多呢?(別杠,這本來就是假設。為了舉例子)

并且每個數據庫的方法其實都差不多,就只要增刪改查。

那么如果我們如果定義一個DB抽象類或者DB接口,約束了增刪改查4個方法。然后接下來的所有數據庫使用的Dbhelper類都繼承DB接口。

這樣接下來傳入中間類的參數是不是就可以用DB接口來傳遞了,而我們使用的時候只需要傳入對應的實現類就行了。同時在以后需求增加或者修改的時候,也不會影響中間類的參數。因為你只要繼承這個DB接口就可以了。

在這里DB接口就相當于約束,所有繼承他的類,都必須滿足這個約束。

這整個數據模塊,我需要增刪改查我就只需要使用DB就行了,不需要去指定的依賴具體的實現類。具體的,你什么時候使用什么時候指定就行了。也就是前文所說,「可以使程序的設計者把主要精力放在程序的設計上,而不必拘泥于細節(jié)的實現」。

個人認為,軟件工程師,主要體現在工程師三字。工程師與工人的差別,一個是把高樓設計出來,而一個是根據設計將高樓做出來。

愿你我前程似海奔騰萬里
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容