什么是程序的耦合?
耦合性,也叫耦合度,是對模塊間關聯程度的度量。耦合的強弱取決於模塊之間接口的復雜性、調用模塊的方式以及通過界面傳送數據的多少。
模塊間的耦合度是指模塊之間的依賴關系,包括控制關系、調用關系、數據傳遞關系。
模塊之間的關系越多,其耦合性越強,同時表明其獨立性越差。降低耦合性,可以提高其獨立性。
耦合性存在於各個領域,而非軟件設計當中獨有的。
在軟件工程中,耦合指的就是對象之間的依賴性。對象之間的耦合越高,維護成本越高。因此對象的設計應該讓類和構件之間的耦合盡可能的小。
軟件設計中通常用耦合度和內聚度作為衡量模塊獨立程度的標准。划分模塊的一個准則就是高內聚低耦合。
耦合是影響軟件復雜度和設計質量的一個重要因素,在設計上面我們應該采用以下原則:如果模塊間必須存在耦合,就盡量使用數據耦合,少使用控制耦合,限制公共耦合的范圍,盡量避免使用內容耦合。
耦合的種類
內容耦合,當一個模塊直接修改或者操作另一個模塊的數據時,或者一個模塊不通過正常入口而轉入另一個模塊時,這樣的耦合被稱為內容耦合。內容耦合是最高程度的耦合,盡量避免使用。
公共耦合,兩個或者兩個以上的模塊共同引用一個全局數據項,這種耦合被稱為公共耦合。在具有大量公共耦合的結構中,確定哪個模塊給全局變量附了一個指定的特定值是十分困難的。
外部耦合,一組模塊都訪問同一全局簡單變量而不是同一全局數據結構,而且不是通過參數表傳遞該全局變量的信息,則稱之為外部耦合。
控制耦合,一個模塊通過接口向另一個模塊傳遞一個控制信號,接收信號的模塊根據信號值而進行適當的動作,這種耦合被稱為控制耦合。
標記耦合,如果一個模塊A通過接口向兩個模塊B和C傳遞一個公共參數,那么稱B和C之間存在一個標記耦合。
數據耦合,模塊之間通過參數來傳遞數據,那么被稱為數據耦合。數據耦合是最低的一種耦合行事,系統中一般都存在這種類型的耦合,因為為了完成一些有意義的功能,往往需要將某些模塊的輸出數據作為另一些模塊的輸入數據。
非直接耦合,兩個模塊之間沒有直接關系,它們之間的聯系完全是通過主模塊的控制和調用來實現的。
內聚和耦合
內聚表示一個模塊內各個元素彼此結合的緊密程度,它是信息隱蔽和局部化概念的自然擴展。
內聚是從功能的角度來度量模塊之間的關系,一個好的內聚模塊應該恰好的做一件事情。
內聚描述的是模塊內的功能聯系,耦合則是軟件結構中各個模塊之間互相連接的異種度量。
耦合的強弱取決於模塊間接口的復雜程度、進入或者訪問一個模塊的點以及通過接口的數據。
程序講究的是低耦合,高內聚。就是同一個模塊當中的各個元素要高度緊密,但是各個模塊之間的相互依存卻要不那么緊密。
內聚和耦合是密切相關的,同其他模塊存在高耦合的模塊意味着低內聚,而高內聚的模塊意味着該模塊同其他模塊之間是低耦合。
在進行軟件設計時,應該力爭做到高內聚,低耦合。
解決耦合的思路
Jdbc是通過反射來注冊驅動的,此時的好處是,我們的類中不再依賴具體的驅動類,此時就算刪除了Mysql的驅動jar包,依然可以編譯。寫死的全限定類名,也可以通過使用配置文件配置來解決。
工廠模式解耦
在實際開發當中,我們可以把三層的對象都使用配置文件進行配置,當啟動服務器應用加載時,讓一個類中的方法通過讀取配置文件,把這些對象創建出來並保存起來。在接下里的時候,直接拿過來用就可以了。
這個讀取配置文件,創建和獲取三層對象的類就是工廠。
控制反轉-Inversion Of Control
把創建對象的權利交給框架,是框架的重要特征,並非面向對象編程的專用術語。它包括依賴注入和依賴查找。
Ioc的作用就是消減計算機程序的耦合。
首先考慮一個問題,創建出來的對象存放在哪里?多個對象肯定需要一個集合進行存儲。到底是選Map還是List,就需要看有沒有查找需求,有查找需求就選Map。
在應用加載時,創建一個Map,用於存放三層對象,這個Map就被稱之為容器。
工廠是負責給我們從容器中獲取指定對象的類,原先我們在獲取對象時,是采用new的方式主動進行獲取。現在我們在獲取對象時,同時和工廠要,有工廠為我們查找或者創建對象,是被動獲取。
這種采用被動接收獲取對象的方式的思想就是控制反轉,是Spring框架的核心之一。