關於抽象和具體

2021-09-08 15:40:15 字數 2798 閱讀 2310

什麼是抽象呢?首先不必澄清什麼是抽象,而從什麼算抽象說起,穩定的、高層的就代表了抽象。就像乙個公司,最好保證了高層的穩定,才能保證全域性的發展。在進行系統設計時,穩定的抽象介面和高層邏輯,也代表了整個系統的穩定與柔性。兵熊熊一窩,將良良一窩,軟體的構建也正如打仗,良好的設計都是自上而下的。而對具體的程式設計實踐而言,介面和抽象類則代表了語言層次的抽象。

追溯概念的分析,一一過招,首先來看依賴於具體,如圖3-3所示。

因此,為了分離這種緊耦合,最好的辦法就是隔離,引入中間層來分離變化,同時確保中間層本身的穩定性,因此抽象的中間層是最佳的選擇(如圖3-4所示)。

以例而理,從最常見的服務端邏輯舉例,如下所示:

public inte***ce iuserservice

public class userservice : iuserservice

如果依賴於具體:

public class usermanager

或者依賴於抽象:

public class usermanager

二者的區別僅在於引入了介面iuserservice,從而使得usermanager對於userservice的依賴由強減弱。然而對於依賴的方式並非僅此一種,設計模式中的智慧型正是通過各種程式設計技巧進行依賴關係的解耦,值得關注和學習,後文將對設計模式進行概要性的討論。

總結一番,什麼是抽象,什麼是具體?在作者看來,抽象就是系統中對變化封裝的戰略邏輯,體現了系統的必然性和穩定性,能夠被具體層次復用和覆寫;而具體則包含了與具體實現相關的邏輯,體現了系統的動態性和變動性。因此,抽象是穩定的,而具體是變動的。

bob大叔在《agile principles, patterns, and practices》一書中直言,程式中所有的依賴關係都應終止於抽象類或者介面,就是對面向抽象程式設計一針見血的回應,其原因歸根到底源自於對抽象和具體的認知和分解:關聯應該終止於抽象,而不是具體,保證了系統依賴關係的穩定。具體類發生的修改,不會影響其他模組或者關係。那麼如何做到這種理想的依賴於抽象的設計呢? 

層次清晰化

將複雜的問題簡單化,是人類思維的普世智慧型,也自然而然是實現軟體設計的基本思路。將複雜的業務需求通過建模過程的抽象化提煉,去粗取精,去偽存真,凡此種種。而抽象的過程,其目標之一就是形成對於複雜問題簡單化的處理過程,只有形成層次簡單的邏輯才能將複雜需求中的關係梳理清晰,而依賴的本質正如上文所言,不就是處理關係嗎?

所以,清晰的層次劃分,進而形成的模組化,是實現系統抽象的必經之路。 

分散集中化 由

需求而設計的過程,就是乙個分散集中化的過程,把需求相關的業務通過開發流程的需求分析過程進行整理,逐步形成需求規格說明、概要設計和詳細設計等基本流程。分散集中化,是乙個梳理需求到形成設計的過程,因此對於把握系統中的抽象和具體而言,是乙個重要的分析過程和手段。現代軟體工程已經對此形成了科學的標準化流程處理邏輯,例如可以借助uml更加清晰地設計流程、分析設計要素,進行標準化溝通和交流。

具體抽象化

封裝變化點

總的來說,抽象和變化就像一對孿生兄弟,將具體的變化點隔離出來以抽象的方式進行封裝,在變化的地方尋找抽象是面對抽象最理想的方式。所以,如何去尋找變化是設計要解決的首要問題,例如工廠模式的目標是封裝物件建立的變化,橋接模式關注物件間的依賴關係變化等。23個經典的設計模式,從某種角度來看,正是對不同變化點的封裝角度提出的不同解決方案。

這一設計原則還被稱為soc(separation of concerns)原則,定義了對於實現理想的高耦合、低內聚目標的統一規則。 3

.設計的哲學

之所以花如此篇幅來講述乙個看似簡單的問題,其實最終理想是回歸到軟體設計目標這個命題上。如果悉心鑽研就可發現,設計的最後就是對關係的處理,正如同生活的意義在於對社會的適應一樣。因此,回歸到設計的目標上就自然可知,完美的設計過程就是對關係的處理過程,也就是對依賴的梳理過程,並最終形成一種合理的耦合結果。

所以,物件導向並不神秘,以生活的現實眼光來看更是如此。把物件導向深度濃縮起來,可以概括為: 

目標:重用、擴充套件、相容。 

核心:低耦合、高內聚。 

手段:封裝變化。 

思想:面向介面程式設計、面向抽象程式設計、面向服務程式設計。

其實,就是這麼簡單。在這種意義上來說,物件導向思想是現代軟體架構設計的基礎。下面以三層架構的設計為例,來進一步感受這種依賴哲學在具體軟體系統中的應用。關於依賴的抽象和對變化隔離的基本思路,其實也是實現典型三層架構或者多層架構的重要基礎。只有使各個層次之間依賴於較穩定的介面,才能使得各個層次之間的變化被隔離在本層之內,不會造成對其他層次的影響,這完全符合開放封閉原則追求的優良設計理念。將這種思路表達為設計,可以表示為如圖3-5所示的形式。

由圖3-5可知,idataprovider作為隔離業務層和資料層的抽象,iservice作為隔離業務層和表現層的抽象,保證了各個層次的相對穩定和封裝。而體現在此的設計邏輯,就正是對於抽象和耦合基本目標概念的體現,例如作為重用的單元,抽象隔離保證了對外發布介面的單一和穩定,所以達到了最高限度的重用;通過引入中間的穩定介面,達到了不同層次的有效隔離,層與層之間體現為輕度耦合,業務層只持有idataprovider就可以獲取資料層的所有服務,而表現層也同樣如此;最後,這種方式顯然也直接實踐了面向介面程式設計,面向抽象程式設計的經典理念。

同樣的道理,對於架構設計的很多概念,放大可以擴充套件為面向服務設計所借鑑,放小這正是反覆降調的依賴倒置原則在類設計中的基本思想。因此,牢記一位軟體大牛的說法:軟體設計的任何問題,都可以通過引入中間邏輯得到解決。而這個中間邏輯,很多時候被封裝為抽象,是最為合理和智慧型的解決方案。

讓我們再次高頌《老子》的小國寡民論,來回味關於依賴哲學中,如何實現更好的和諧統一以及如何遵守科學的軟體管理思想:鄰國相望,雞犬之聲相聞,民至老死,不相往來。

php抽象類定義和具體應用

抽象類 abstract class 就是定乙個乙個公共的基類,而將特定的細節留給繼承者來實現。具體的說,當需要建立乙個基礎的物件的時候,建立所需的某些方法並沒有完整定義出來時,就要用到抽象類。通過抽象概念可以讓讓專案架構擁有更好的擴充套件性。例如 abstract class abstractcl...

物件導向中的抽象和具體類的理解

物件導向軟體開發的乙個基本方法就是抽象,到底什麼是抽象呢?抽象是從眾多的事物中抽取出共同的 本質性的特徵,而捨棄其非本質的特徵。例如蘋果 香蕉 生梨 葡萄 桃子等,它們共同的特性就是水果。得出水果概念的過程,就是乙個抽象的過程。要抽象,就必須進行比較,沒有比較就無法找到共同的部分。共同特徵是指那些能...

關於抽象類和介面

1 什麼是抽象類 包含抽象方法的類叫做抽象類,抽象類中並不都是抽象方法 2.什麼時候建立抽象方法 當父類中對這個方法沒有實現沒有任何的實際意義,而在子類中實現有其意義,這時候就可以把這種方法成乙個抽象的方法,這個類就成了抽象的類 3.抽象類和普通類的區別 1 抽象方法必須為public或者prote...