www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式大雜燴
[導(dǎo)讀]關(guān)注「嵌入式大雜燴」,選擇「星標(biāo)公眾號」一起進(jìn)步!來源:CSDN一、原理篇而低耦合,是指模塊之間盡可能的使其獨(dú)立存在,模塊之間不產(chǎn)生聯(lián)系不可能,但模塊與模塊之間的接口應(yīng)該盡量少而簡單。這樣,高內(nèi)聚從整個程序中每一個模塊的內(nèi)部特征角度,低耦合從程序中各個模塊之間的關(guān)聯(lián)關(guān)系角度,對我...

關(guān)注「嵌入式大雜燴」,選擇「星標(biāo)公眾號」一起進(jìn)步!

來源:CSDN

一、原理篇

而低耦合,是指模塊之間盡可能的使其獨(dú)立存在,模塊之間不產(chǎn)生聯(lián)系不可能,但模塊與模塊之間的接口應(yīng)該盡量少而簡單。這樣,高內(nèi)聚從整個程序中每一個模塊的內(nèi)部特征角度,低耦合從程序中各個模塊之間的關(guān)聯(lián)關(guān)系角度,對我們的設(shè)計提出了要求。

程序設(shè)計和軟件工程發(fā)展過程中產(chǎn)生的很多技術(shù)、設(shè)計原則,都可以從內(nèi)聚和耦合的角度進(jìn)行解讀。作為C語言程序設(shè)計的初學(xué)者,結(jié)合當(dāng)前對于函數(shù)的理解可達(dá)到的程度,我們探討一下如何做到高內(nèi)聚低耦合。

針對低耦合。耦合程度最低的是非直接耦合,指兩個函數(shù)之間的聯(lián)系完全是通過共同的調(diào)用函數(shù)的控制和調(diào)用來實(shí)現(xiàn)的,耦合度最弱,函數(shù)的獨(dú)立性最強(qiáng)。但一組函數(shù)之間沒有數(shù)據(jù)傳遞顯然不現(xiàn)實(shí),次之追求數(shù)據(jù)耦合,調(diào)用函數(shù)和被調(diào)用函數(shù)之間只傳遞簡單的數(shù)據(jù)參數(shù),例如采用值傳遞方式的函數(shù)。

有些函數(shù)數(shù)在調(diào)用時,利用形式參數(shù)傳地址的方式,在函數(shù)體內(nèi)通過指針可以修改其指向的作用域以外的存儲單元,這構(gòu)成了更強(qiáng)的耦合,稱為特征耦合,在這里,使函數(shù)之間產(chǎn)生聯(lián)系的是地址這樣的特征標(biāo)識。另外,有兩個函數(shù)可能會打開同一個文件進(jìn)行操作,這也構(gòu)成了特征耦合的一種形式。

更強(qiáng)的耦合是外部耦合,這里,一組模塊都訪問同一全局變量,而且不通過參數(shù)表傳遞該全局變量的信息,當(dāng)發(fā)現(xiàn)程序執(zhí)行結(jié)果異常時,很難定位到是在哪個函數(shù)中出了差錯。不少初學(xué)者覺得參數(shù)傳遞麻煩,將要處理的數(shù)據(jù)盡可能地定義為全局變量,這樣,函數(shù)之間的接口簡單了,但形成的是耦合性很強(qiáng)的結(jié)構(gòu)。

在C語言中,還可以通過靜態(tài)局部變量,在同一個程序的兩次調(diào)用之間共享數(shù)據(jù),這也可以視為是一種外部耦合,只不過靜態(tài)局部變量的作用域限于函數(shù)內(nèi)部,其影響也只在函數(shù)內(nèi)部,耦合程度比使全局變量也還是弱很多。由此,我們可以理解前述在使用全局變量、靜態(tài)局部變量時提出的“用在合適的時候,不濫用”的原則。

針對高內(nèi)聚。內(nèi)聚程度最高的是功能內(nèi)聚,模塊內(nèi)所有元素的各個組成部分全部都為完成同一個功能而存在,共同完成一個單一的功能,模塊已不可再分。這樣的函數(shù)功能非常清晰、明確,一般出現(xiàn)在程序結(jié)構(gòu)圖的較低被調(diào)用的層次上。

次之的是順序內(nèi)聚,一個函數(shù)中各個處理元素和同一個功能密切相關(guān),通常前一個處理元素的輸出是后一個處理元素的輸入。對于這樣的函數(shù),如果不致于產(chǎn)生高耦合的話,可以分開兩個函數(shù)實(shí)現(xiàn)。

有的函數(shù),其中的不同處理功能僅僅是由于都訪問某一個公用數(shù)據(jù)而發(fā)生關(guān)聯(lián),這稱為通信內(nèi)聚和信息內(nèi)聚,內(nèi)聚程度進(jìn)一步下降。內(nèi)聚程度再低的情況就不再一一列舉,最差的偶然內(nèi)聚中,一個函數(shù)內(nèi)的各處理元素之間沒有任何聯(lián)系,只是偶然地被湊到一起。

可以想像這樣的模塊東一榔頭西一錘子,類似一個毫無凝聚力的團(tuán)伙,對應(yīng)的是低質(zhì)量??傊?,在解決問題劃分函數(shù)時,要遵循“一個函數(shù),一個功能”的原則,盡可能使模塊達(dá)到功能內(nèi)聚。

要做到高內(nèi)聚低耦合,重點(diǎn)是要在寫代碼之前花些時間做好設(shè)計。在下面的例子中,將討論結(jié)合具體的問題,如何將以上的因素考慮進(jìn)去。

二、示例篇

本例受裘宗燕老師《從問題到程序——程序設(shè)計與C語言引論啟發(fā)》。

任務(wù) 輸出200以內(nèi)的完全平方數(shù)(一個數(shù)如果是另一個整數(shù)的完全平方,那么我們就稱這個數(shù)為完全平方數(shù),也叫做平方數(shù)),要求每隔5個數(shù)據(jù)要輸出一個換行。

解決方案及點(diǎn)評 對于這個簡單任務(wù),我們在一個main函數(shù)中完成了任務(wù)。程序如方案1:

//方案1:內(nèi)聚性較高的單模塊實(shí)現(xiàn)方案
#include?
int?main()
{
????int?m,?num=0;
????for?(m?=?1;?m?*?m?<=?200;?m )
????{
????????printf("%d?",?m?*?m);
????????num ;
????????if?(num%5==0)
????????????printf("\n");
????}
????return?0;
}
由于任務(wù)本身簡單,將之在一個main函數(shù)中實(shí)現(xiàn)后,這個函數(shù)的內(nèi)聚程度接近功能內(nèi)聚,已經(jīng)相當(dāng)高了,就任務(wù)本身,不需再進(jìn)行分解。為使讀者能深入理解模塊質(zhì)量方面的技術(shù),我們將試圖將內(nèi)聚程序再提高一些,然后考察耦合程度不同的各種解決方案。

要提高上面解決方案中函數(shù)(僅main一個函數(shù))的內(nèi)聚程度,我們考察程度的功能“找出完全平方數(shù)并輸出”——“找出完全平方數(shù)”和“輸出”這本身就是兩個功能,再細(xì)分輸出時還有“要求5個數(shù)據(jù)在一行”的要求,這些功能的實(shí)現(xiàn)細(xì)節(jié)都在一個函數(shù)當(dāng)中,可見是有余地再提高內(nèi)聚程度的。

在實(shí)現(xiàn)的應(yīng)用中,幾乎所有的處理都可以分解為“輸入-計算-輸出”的模式,優(yōu)秀的解決方案往往至少要將這三個模塊都獨(dú)立出來,對于“計算”模塊而言,其內(nèi)部不再包括輸入輸出,專門接受輸入的數(shù)據(jù),計算完成后返回結(jié)果即可。當(dāng)然,對于復(fù)雜的問題,在各個環(huán)節(jié)上可能還需要再做分解。

下面,我們探討將“找出完全平方數(shù)輸出”和“每5個數(shù)據(jù)后換行”分開實(shí)現(xiàn)的方案。這樣的分解有助于提高內(nèi)聚性,與此同時,分解后的兩個模塊間的耦合程度,成為我們要關(guān)注的焦點(diǎn)。

現(xiàn)在將“找出完全平方數(shù)并輸出”的功能仍放在main函數(shù)中(獨(dú)立成為單獨(dú)的函數(shù)也可以,但不必要了),而“每5個數(shù)據(jù)后換行”的功能,設(shè)計一個名稱為format的函數(shù),它每調(diào)用一次就輸出一個空格作為兩個完全平方數(shù)間的分隔,而每調(diào)用到第5次時,輸出的是一個換行。

這兩個模塊之間,需要有一個“現(xiàn)在是第幾次調(diào)用”的信息需要傳遞,不可能用耦合程度最松散的非直接耦合.我們考慮數(shù)據(jù)耦合,用簡單形式參數(shù)傳值,得到方案2。

//方案2:一個耦合度低,但不能完成功能要求的解決方案
#include?
void?format(int);
int?main()
{
????int?m,?num=0;
????for?(m?=?1;?m?*?m?<=?200;?m )
????{
????????printf("%d",?m?*?m);
????????format(num);
????}
????return?0;
}
void?format(int?n)
{
????n ;
????if?(n%5==0)
????????printf("\n");
????else
????????printf("?");
????return;
}
在這個程序結(jié)構(gòu)中,format與main函數(shù)的耦合程度為數(shù)據(jù)耦合。在main中定義了局部變量num,在一次都未輸出時,置初值為0是合理的。在調(diào)用format時,將num傳遞來的表示第幾次輸出(第幾個完全平方數(shù))的形式參數(shù)n,n自增1,然后再控制輸出空格或換行。

然而分析和運(yùn)行程序發(fā)現(xiàn),“每隔5個數(shù)據(jù)輸出一個換行”的功能并未實(shí)現(xiàn)。因?yàn)樾问絽?shù)n在函數(shù)format內(nèi)的改變對應(yīng)的實(shí)在參數(shù)num占不同的內(nèi)存空間,n 修改的結(jié)果,對num無任何的影響,導(dǎo)致了在下一次調(diào)用時,丟失了“輸出的是第幾個”的重要信息。

一個補(bǔ)救的方法,是由format將變化后的n值作為返回值,再傳回給main函數(shù),得到如下方案3的程序:

//方案3:利用了返回值使耦合度增大,但功能得以實(shí)現(xiàn)的方案
#include?
int?format(int);
int?main()
{
????int?m,?num=0;
????for?(m?=?1;?m?*?m?<=?200;?m )
????{
????????printf("%d",?m?*?m);
????????num?=?format(num);
????}
????return?0;
}
int?format(int?n)
{
????n ;
????if?(n%5==0)
????????printf("\n");
????else
????????printf("?");
????return?n;
}
維持原函數(shù)返回值為void,而將參數(shù)改為傳地址,得到下面的方案4。這個方案的耦合度更高一些,但功能還是能夠?qū)崿F(xiàn)的。

//方案4:傳地址實(shí)現(xiàn)功能的方案,耦合度更大
#include?
void?format(int*);
int?main()
{
????int?m,?num=0;
????for?(m?=?1;?m?*?m?<=?200;?m )
????{
????????printf("%d",?m?*?m);
????????format(
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉