OOP與AOP的理解
本人是搞android開發的,平時對OOP運用比較多,對其思想也自然比較熟悉。相比之下大多數android開發者對AOP的比較預設,所以這裡來總結一下兩者的區別
1.概念
OOP是面向物件程式設計,核心思想是將客觀存在的不同事物抽象成相互獨立的類,然後把與事物相關的屬性和行為封裝到類裡,並通過繼承和多型來定義類彼此間的關係,最後通過操作類的例項來完成實際業務邏輯的功能求。
AOP是面向切面程式設計,核心思想是將業務邏輯中與類不相關的通用功能切面式的提取分離出來,讓多個類共享一個行為,一旦這個行為發生改變,不必修改類,而只需要修改這個行為即可。
2.區別
OOP面向物件的三大特徵 : 封裝 , 繼承 , 多型 。這些特徵也說明了OOP是面向物件的,我們做什麼都是考慮一個物件,我們需要完成一個任務的時候一般都想著把一些操作封裝成一個類,所有的變數和操作都封裝到一個類裡面,那麼這個類就是我們的物件,我們要實現某個特定的功能,首先也想想著在這個物件裡面去實現。
OOP將功能分散到不同的物件中去。讓不同的類設計不同的方法,這樣程式碼就分散到一個個的類中。可以降低程式碼的複雜程度,提高類的複用性。
但是在分散程式碼的同時,也增加了程式碼的重複性。比如說,我們在兩個類中,可能都需要在每個方法中做日誌。按照OOP的設計方法,我們就必須在兩個類的方法中都加入日誌的內容。也許他們是完全相同的,但是因為OOP的設計讓類與類之間無法聯絡,而不能將這些重複的程式碼統一起來。然而AOP就是為了解決這類問題而產生的,它是在執行時動態地將程式碼切入到類的指定方法、指定位置上的程式設計思想。
比如Android中一些按鍵統計、生命週期統計,特定統計都是比較瑣碎的事情,要利用面向物件的思想去實現都不是很完美,這就要求去一一實現,顯得很瑣碎。
OOD/OOP面向名詞領域,AOP面向動詞領域。
如果說面向物件程式設計是關注將需求功能劃分為不同的並且相對獨立,封裝良好的類,並讓它們有著屬於自己的行為,依靠繼承和多型等來定義彼此的關係的話;那麼面向方面程式設計則是希望能夠將通用需求功能從不相關的類當中分離出來,能夠使得很多類共享一個行為,一旦發生變化,不必修改很多類,而只需要修改這個行為即可。
兩者不但不是互相競爭的技術而且彼此還是很好的互補。面向物件程式設計主要用於為同一物件層次的公用行為建模。它的弱點是將公共行為應用於多個無關物件模型之間。而這恰恰是面向方面程式設計適合的地方。有了 AOP,我們可以定義交叉的關係,並將這些關係應用於跨模組的、彼此不同的物件模型。AOP 同時還可以讓我們層次化功能性而不是嵌入功能性,從而使得程式碼有更好的可讀性和易於維護。它會和麵向物件程式設計合作得很好。
總結起來就是
1、面向目標不同:簡單來說OOP是面向名詞領域,AOP面向動詞領域。
2、思想結構不同:OOP是縱向結構,AOP是橫向結構。
3、注重方面不同:OOP注重業務邏輯單元的劃分,AOP偏重業務處理過程的某個步驟或階段。
3.AOP在android中的運用
從技術上來說,AOP基本上是通過代理機制實現的。代理模式體現了AOP的思想。
Android中基於AOP實現的庫有ButterKnife、dagger2、EventBus3.0、Retrofit 2.0等等,不是說這些庫完全基於AOP實現,只是說裡面部分功能基於AOP。
關於android中AOP部分,再深入就是AspectJ的使用,這是一種類似Java的語言,與java相互相容,可在android平臺執行。有興趣的可以點連結學習
最後說下,兩者之間是一個相互補充和完善的關係,如果能掌握好其各自優勢並運用,對我們的程式設計是非常有幫助的