為什麼弱內聚不利於軟體修改
⑴ 什麼是弱耦合
弱耦合是流體與固體相當於分開,流體受到的載荷由固體變形折算。
在每一步內分別對流體動力方程和結構動力方程一次求解,通過把第一個物理場的結果作為外荷載加於第二個物理場來實現兩個場的耦合。
對於弱耦合,其優點是可以重新利用現有的通用流體和結構軟體,並且可以分別對每一個軟體單獨地制定合適的求解方法,缺點是計算過程比較復雜。強耦合比較適用於對耦合場的理論分析;弱耦合比較適用於對耦合場的數值計算。
(1)為什麼弱內聚不利於軟體修改擴展閱讀
耦合可以分為以下幾種,它們之間的耦合度由高到低排列如下:
(1) 內容耦合。當一個模塊直接修改或操作另一個模塊的數據時,或一個模塊不通過正常入口而轉入另一個模塊時,這樣的耦合被稱為內容耦合。內容耦合是最高程度的耦合,應該避免使用之。
(2) 公共耦合。兩個或兩個以上的模塊共同引用一個全局數據項,這種耦合被稱為公共耦合。在具有大量公共耦合的結構中,確定究竟是哪個模塊給全局變數賦了一個特定的值是十分困難的。
(3) 外部耦合 。一組模塊都訪問同一全局簡單變數而不是同一全局數據結構,而且不是通過參數表傳遞該全局變數的信息,則稱之為外部耦合。
(4) 控制耦合 。一個模塊通過介面向另一個模塊傳遞一個控制信號,接受信號的模塊根據信號值而進行適當的動作,這種耦合被稱為控制耦合。
(5) 標記耦合 。若一個模塊A通過介面向兩個模塊B和C傳遞一個公共參數,那麼稱模塊B和C之間存在一個標記耦合。
(6) 數據耦合。模塊之間通過參數來傳遞數據,那麼被稱為數據耦合。數據耦合是最低的一種耦合形式,系統中一般都存在這種類型的耦合,因為為了完成一些有意義的功能,往往需要將某些模塊的輸出數據作為另一些模塊的輸入數據。
(7) 非直接耦合 。兩個模塊之間沒有直接關系,它們之間的聯系完全是通過主模塊的控制和調用來實現的。
⑵ 高內聚低耦合的知識
軟體架構設計的目的簡單說就是在保持軟體內在聯系的前提下,分解軟體系統,降低軟體系統開發的復雜性,而分解軟體系統的基本方法無外乎分層和分割。但是在保持軟體內在聯系的前提下,如何分層分割系統,分層分割到什麼樣的粒度,並不是一件容易的事,這方面有各種各樣的分解方法,比如:關注點分離,面向方面,面向對象,面向介面,面向服務,依賴注入,以及各種各樣的設計原則等,
耦合可以分為以下幾種,它們之間的耦合度由高到低排列如下:
(1) 內容耦合:一個模塊直接訪問另一模塊的內容,則稱這兩個模塊為內容耦合。
若在程序中出現下列情況之一,則說明兩個模塊之間發生了內容耦合:
1. 一個模塊直接訪問另一個模塊的內部數據。
2. 一個模塊不通過正常入口而直接轉入到另一個模塊的內部。
3. 兩個模塊有一部分代碼重疊(該部分代碼具有一定的獨立功能)。
4. 一個模塊有多個入口。
內容耦合可能在匯編語言中出現。大多數高級語言都已設計成不允許出現內容耦合。這種耦合的耦合性最強,模塊獨立性最弱。
(2) 公共耦合:一組模塊都訪問同一個全局數據結構,則稱之為公共耦合。公共數據環境可以是全局數據結構、共享的通信區、內存的公共覆蓋區等。如果模塊只是向公共數據環境輸入數據,或是只從公共數據環境取出數據,這屬於比較鬆散的公共耦合;如果模塊既向公共數據環境輸入數據又從公共數據環境取出數據,這屬於較緊密的公共耦合。
公共耦合會引起以下問題:
1. 無法控制各個模塊對公共數據的存取,嚴重影響了軟體模塊的可靠性和適應性。
2. 使軟體的可維護性變差。若一個模塊修改了公共數據,則會影響相關模塊。
3. 降低了軟體的可理解性。不容易清楚知道哪些數據被哪些模塊所共享,排錯困難。
一般地,僅當模塊間共享的數據很多且通過參數傳遞很不方便時,才使用公共耦合。
(3) 外部耦合:一組模塊都訪問同一全局簡單變數,而且不通過參數表傳遞該全局變數的信息,則稱之為外部耦合。
(4) 控制耦合:模塊之間傳遞的不是數據信息,而是控制信息例如標志、開關量等,一個模塊控制了另一個模塊的功能。
(5) 標記耦合:調用模塊和被調用模塊之間傳遞數據結構而不是簡單數據,同時也稱作特徵耦合。表就和的模塊間傳遞的不是簡單變數,而是像高級語言中的數據名、記錄名和文件名等數據結果,這些名字即為標記,其實傳遞的是地址。
(6) 數據耦合:調用模塊和被調用模塊之間只傳遞簡單的數據項參數。相當於高級語言中的值傳遞。
(7) 非直接耦合:兩個模塊之間沒有直接關系,它們之間的聯系完全是通過主模塊的控制和調用來實現的。耦合度最弱,模塊獨立性最強。
總結:耦合是影響軟體復雜程度和設計質量的一個重要因素,為提高模塊的獨立性,應建立模塊間盡可能鬆散的系統,在設計上我們應採用以下原則:若模塊間必須存在耦合,應盡量使用數據耦合,少用控制耦合,慎用或有控制地使用公共耦合,並限制公共耦合的范圍,盡量避免內容耦合。
內聚有如下的種類,它們之間的內聚度由弱到強排列如下:
(1) 偶然內聚:一個模塊內的各處理元素之間沒有任何聯系,只是偶然地被湊到一起。這種模塊也稱為巧合內聚,內聚程度最低。
(2) 邏輯內聚:這種模塊把幾種相關的功能組合在一起, 每次被調用時,由傳送給模塊參數來確定該模塊應完成哪一種功能 。
(3) 時間內聚:把需要同時執行的動作組合在一起形成的模塊稱為時間內聚模塊。 (4) 過程內聚:構件或者操作的組合方式是,允許在調用前面的構件或操作之後,馬上調用後面的構件或操作,即使兩者之間沒有數據進行傳遞。簡單的說就是如果一個模塊內的處理元素是相關的,而且必須以特定次序執行則稱為過程內聚。(5) 通信內聚:指模塊內所有處理元素都在同一個數據結構上操作或所有處理功能都通過公用數據而發生關聯(有時稱之為信息內聚)。即指模塊內各個組成部分都使用相同的數據數據或產生相同的數據結構。(6) 順序內聚:一個模塊中各個處理元素和同一個功能密切相關,而且這些處理必須順序執行,通常前一個處理元素的輸出時後一個處理元素的輸入。
例如某模塊完成工業產值求值的功能,前一個功能元素求總產值,後一個功能元素求平均產值,顯然該模塊內兩部分緊密關聯。
順序內聚的內聚度比較高,但缺點是不如功能內聚易於維護。
(7) 功能內聚:模塊內所有元素的各個組成部分全部都為完成同一個功能而存在,共同完成一個單一的功能,模塊已不可再分。即模塊僅包括為完成某個功能所必須的所有成分,這些成分緊密聯系、缺一不可。
功能內聚是最強的內聚,其優點是它的功能明確。判斷一個模塊是否功能內聚,一般從模塊名稱就能看出。如果模塊名稱只有一個動詞和一個特定的目標(單數名詞),一般來說就是功能內聚,如:「計算水費」、「計算產值」等模塊。功能內聚一般出現在軟體結構圖的較低層次上。
功能內聚模塊的一個重要特點是:他是一個「暗盒」,對於該模塊的調用者來說,只需要知道這個模塊能做什麼,而不需要知道這個模塊是如何做的。
總結:在模塊劃分是,要遵循「一個模塊,一個功能」的原則,盡可能使模塊達到功能內聚。
高內聚,低耦合的系統有什麼好處呢?事實上,短期來看,並沒有很明顯的好處,甚至短期內會影響系統的開發進度,因為高內聚,低耦合的系統對開發設計人員提出了更高的要求。高內聚,低耦合的好處體現在系統持續發展的過程中,高內聚,低耦合的系統具有更好的重用性,維護性,擴展性,可以更高效的完成系統的維護開發,持續的支持業務的發展,而不會成為業務發展的障礙。
⑶ 什麼是高耦合低內聚
高耦合低內聚:塊間聯系高,塊內聯系低。
其中內聚是從功能角度來度量模塊內的聯系,一個好的內聚模塊應當恰好做一件事。它描述的是模塊內的功能聯系。
而耦合是軟體結構中各模塊之間相互連接的一種度量,耦合強弱取決於模塊間介面的復雜程度、進入或訪問一個模塊的點以及通過介面的數據。
高內聚低耦合,是軟體工程中的概念,是判斷設計好壞的標准,主要是面向對象的設計,主要是看類的內聚性是否高,耦合度是否低。
(3)為什麼弱內聚不利於軟體修改擴展閱讀:
程序開發中的低耦合高內聚
模塊之間聯系越緊密,其耦合性就越強,模塊之間越獨立則越差,模塊間耦合的高低取決於模塊間介面的復雜性,調用的方式以及傳遞的信息。
形象的說,就是要將代碼寫的和電腦一樣,主類就是電腦的主機箱,當程序需要實現什麼功能的時候只需要加其他的類引入介面,就像電腦上的usb介面。
一個完整的系統,模塊與模塊之間,盡可能的使其獨立存在。也就是說,讓每個模塊,盡可能的獨立完成某個特定的子功能。
模塊與模塊之間的介面,盡量的少而簡單。如果某兩個模塊間的關系比較復雜的話,最好首先考慮進一步的模塊劃分。這樣有利於修改和組合。
在程序開發中,盡量做到低耦合高內聚,這樣程序的維護成本以及可讀性也會大大增強。
⑷ 說說耦合與內聚有何區別,他們如何影響軟體模塊的設計實現。
內聚標志一個模塊內各個元素彼此結合的緊密程度,它是信息隱蔽和局部化概念的自然擴展,一個 好的內聚模塊應當恰好做一件事。它描述的是模塊內的功能聯系; 耦合是軟體結構中各模塊之間相互連接的一種度量,耦合強弱取決於模塊間介面的復雜程度、進入或訪問一個模塊的點以及通過介面的數據。簡單地說,對象之間的 耦合度就是對象之間的依賴性。指導使用和維護對象的主要問題是對象之間的多重依賴性。對象之間的耦合越高,維護成本越高。因此對象的設計應使類和構件之間 的耦合最小。
⑸ 關於軟體工程基本原理中模塊的問題
在設計好軟體的體系結構後,就已經在宏觀上明確了各個模塊應具有什麼功能,應放在體系結構的哪個位置。我們習慣地從功能上劃分模塊,保持「功能獨立」是模塊化設計的基本原則。因為,「功能獨立」的模塊可以降低開發、測試、維護等階段的代價。但是「功能獨立」並不意味著模塊之間保持絕對的孤立。一個系統要完成某項任務,需要各個模塊相互配合才能實現,此時模塊之間就要進行信息交流。
比如手和腳是兩個「功能獨立」的模塊。沒有腳時,手照樣能幹活。沒有手時,腳仍可以走路。但如果希望跑得快,那麼邁左腳時一定要伸右臂甩左臂,邁右腳時則要伸左臂甩右臂。在設計一個模塊時不僅要考慮「這個模塊就該提供什麼樣的功能」,還要考慮「這個模塊應該怎樣與其它模塊交流信息」。
本節將論述評價模塊設計優劣的三個特徵因素:「信息隱藏」、「內聚與耦合」和「封閉——開放性」。
5.2.1 信息隱藏
在一節不和諧的課堂里,老師嘆氣道:「要是坐在後排聊天的同學能象中間打牌的同學那麼安靜,就不會影響到前排睡覺的同學。」
這個故事告訴我們,如果不想讓壞事傳播開來,就應該把壞事隱藏起來,「家醜不可外揚」就是這個道理。為了盡量避免某個模塊的行為去干擾同一系統中的其它模塊,在設計模塊時就要注意信息隱藏。應該讓模塊僅僅公開必須要讓外界知道的內容,而隱藏其它一切內容。
模塊的信息隱藏可以通過介面設計來實現。一個模塊僅提供有限個介面(Interface),執行模塊的功能或與模塊交流信息必須且只須通過調用公有介面來實現。如果模塊是一個C++對象,那麼該模塊的公有介面就對應於對象的公有函數。如果模塊是一個COM對象,那麼該模塊的公有介面就是COM對象的介面。一個COM對象可以有多個介面,而每個介面實質上是一些函數的集合。[Rogerson 1999]
美國也許是世界上丑聞最多的國家,因為它追求民主,不懂得「隱藏信息」。但美國又是軟體產業最發達的國家,模塊化設計的方法都是美國人倡導的,他們應該很懂得「隱藏信息」。真是前後矛盾,這些美國佬!
5.2.2 內聚與耦合
內聚(Cohesion)是一個模塊內部各成分之間相關聯程度的度量。耦合(Coupling)是模塊之間依賴程度的度量。內聚和耦合是密切相關的,與其它模塊存在強耦合的模塊通常意味著弱內聚,而強內聚的模塊通常意味著與其它模塊之間存在弱耦合。模塊設計追求強內聚,弱耦合。
一、內聚強度
內聚按強度從低到高有以下幾種類型:
(1)偶然內聚。如果一個模塊的各成分之間毫無關系,則稱為偶然內聚。
(2)邏輯內聚。幾個邏輯上相關的功能被放在同一模塊中,則稱為邏輯內聚。如一個模塊讀取各種不同類型外設的輸入。盡管邏輯內聚比偶然內聚合理一些,但邏輯內聚的模塊各成分在功能上並無關系,即使局部功能的修改有時也會影響全局,因此這類模塊的修改也比較困難。
(3)時間內聚。如果一個模塊完成的功能必須在同一時間內執行(如系統初始化),但這些功能只是因為時間因素關聯在一起,則稱為時間內聚。
(4)過程內聚。如果一個模塊內部的處理成分是相關的,而且這些處理必須以特定的次序執行,則稱為過程內聚。
(5)通信內聚。如果一個模塊的所有成分都操作同一數據集或生成同一數據集,則稱為通信內聚。
(6)順序內聚。如果一個模塊的各個成分和同一個功能密切相關,而且一個成分的輸出作為另一個成分的輸入,則稱為順序內聚。
(7)功能內聚。模塊的所有成分對於完成單一的功能都是必須的,則稱為功能內聚。
二、耦合強度
耦合的強度依賴於以下幾個因素:(1)一個模塊對另一個模塊的調用;(2)一個模塊向另一個模塊傳遞的數據量;(3)一個模塊施加到另一個模塊的控制的多少;(4)模塊之間介面的復雜程度。
耦合按從強到弱的順序可分為以下幾種類型:
(1)內容耦合。當一個模塊直接修改或操作另一個模塊的數據,或者直接轉入另一個模塊時,就發生了內容耦合。此時,被修改的模塊完全依賴於修改它的模塊。
(2)公共耦合。兩個以上的模塊共同引用一個全局數據項就稱為公共耦合。
(3)控制耦合。一個模塊在界面上傳遞一個信號(如開關值、標志量等)控制另一個模塊,接收信號的模塊的動作根據信號值進行調整,稱為控制耦合。
(4)標記耦合。模塊間通過參數傳遞復雜的內部數據結構,稱為標記耦合。此數據結構的變化將使相關的模塊發生變化。
(5)數據耦合。模塊間通過參數傳遞基本類型的數據,稱為數據耦合。
(6)非直接耦合。模塊間沒有信息傳遞時,屬於非直接耦合。
如果模塊間必須存在耦合,就盡量使用數據耦合,少用控制耦合,限制公共耦合的范圍,堅決避免使用內容耦合。
5.2.3 封閉——開放性
如果一個模塊可以作為一個獨立體被其它程序引用,則稱模塊具有封閉性。如果一個模塊可以被擴充,則稱模塊具有開放性。
從字面上看,讓模塊具有「封閉——開放性」是矛盾的,但這種特徵在軟體開發過程中是客觀存在的。當著手一個新問題時,我們很難一次性解決問題。應該先縱觀問題的一些重要方面,同時作好以後補充的准備。因此讓模塊存在「開放性」並不是壞事情。「封閉性」也是需要的,因為我們不能等到完全掌握解決問題的信息後再把程序做成別人能用的模塊。
模塊的「封閉——開放性」實際上對應於軟體質量因素中的可復用性和可擴充性。採用面向過程的方法進行程序設計,很難開發出既具有封閉性又具有開放性的模塊。採用面向對象設計方法可以較好地解決這個問題。
⑹ 如何理解"高內聚,低耦合"的軟體結構設計原則
高內聚,低耦合在軟體工程里有,主要是說模快之間和模塊內部之間的關系緊密程度
高內聚就是提高模快內部的關聯程度,低耦合當然就是降低模快之間的關聯程度
耦合性比較高的話,模塊代碼不易分離,是不好的編程模式
內聚是越高越好,內聚個人認為是只是實現一個功能,不是很多的功能
⑺ 軟體工程的題
BCBBA
DBBAC
⑻ 什麼是高內聚低耦合
高內聚低耦合,是軟體工程中的概念,是判斷設計好壞的標准,主要是面向對象的設計,主要看類的內聚性是否高,耦合度是否低。目的是使得模塊的可重用性、移植性大大增強。
通常程序結構中各模塊的內聚程度越高,模塊間的耦合程度就越低。內聚是從功能角度來度量模塊內的聯系,一個好的內聚模塊應當恰好做一件事。
它描述的是模塊內的功能聯系;耦合是軟體結構中各模塊之間相互連接的一種度量,耦合強弱取決於模塊間介面的復雜程度、進入或訪問一個模塊的點以及通過介面的數據。
(8)為什麼弱內聚不利於軟體修改擴展閱讀
實例說明:
比如訂單模塊,訂單是跟庫存息息相關的,沒有庫存就沒有訂單,訂單強依賴庫存。
把扣減庫存的邏輯直接寫在在訂單模塊中,那麼訂單模塊和庫存模塊就耦合了另一方面,訂單模塊中有扣減庫存的邏輯會造成訂單模塊的功能比較分散,功能就不夠集中,便構成了低內聚。
把訂單中的庫存邏輯給拆分出來一個獨立的庫存模塊,庫存模塊對外暴露扣減庫存的介面,訂單模塊調用介面實現減少庫存的操作,將訂單邏輯與庫存邏輯的依賴降低到最小,減小了訂單與庫存的耦合。
同時訂單模塊只包含訂單處理的邏輯,庫存系統只包含庫存的處理邏輯,兩個系統的業務上更加內聚
⑼ 如何改進邏輯內聚
邏輯內聚指模塊內執行個邏輯上相似的功能,通過參數確定該模塊完成哪一個功能。指機能相關的程序組合成一模塊的程度,或是各機能凝聚的狀態或程度。是結構化分析的重要概念之一。量測內聚性的方式很多,有些方法是由分析源代碼,得到非量化的結果,有些方法則是檢查源代碼的文本特徵,以得到內聚性的量化分數。內聚性是屬於順序式的量測量,一般會以「高內聚性」或「低內聚性」來表示。一般會希望程序的模塊有高內聚性,因為高內聚性一般和許多理想的軟體特性有關,包括魯棒性、可靠度、可復用性及易懂性(understandability)等特性,而低內聚性一般也代表不易維護、不易測試、不易復用以及難以理解。View和Presenter之間使用介面調用進行解耦,介面上的方法應該是它們具體行為的抽象:作為調用者去調用對方的方法,它會有一個意圖,是 i want to do;而被調用者的暴露方法,就是what i can do的集合。至於對方內部是到底怎麼實現的,調用者絲毫不需要關心。 而Model是否應該使用介面進行抽象呢?我覺得大部分應用都沒這個必要,Model介面的維護成本比較高,帶來的價值也不大,除非你的數據源真的有多個實現,例如在不同情況下使用不同的伺服器資料庫,可以考慮用介面解耦。MVP模式大致分為兩種寫法,被動視圖(Passive View)和監督控制器(Supervising Controller)。被動視圖中View把邏輯和與Model的交互全權交給Presenter,甚至自己的表現也由presenter控制,什麼都不需要管;監督控制器中Presenter只是一個邏輯輔助的職能,View會部分接觸修改到Model的數據,但是我認為這是被動視圖也無法避免的,例如列表顯示總要依賴實體類,所以我也更傾向於監督控制器寫法。