女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

編程如何做到高內聚低耦合呢?

玩轉嵌入式 ? 來源:CSDN ? 2023-12-06 09:20 ? 次閱讀

1 - 原理篇

耦合,是指模塊之間盡可能的使其獨立存在,模塊之間不產生聯系不可能,但模塊與模塊之間的接口應該盡量少而簡單。這樣,高內聚從整個程序中每一個模塊的內部特征角度,低耦合從程序中各個模塊之間的關聯關系角度,對我們的設計提出了要求。

程序設計和軟件工程發展過程中產生的很多技術、設計原則,都可以從內聚和耦合的角度進行解讀。作為C語言程序設計的初學者,結合當前對于函數的理解可達到的程度,我們探討一下如何做到高內聚低耦合。

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

有些函數數在調用時,利用形式參數傳地址的方式,在函數體內通過指針可以修改其指向的作用域以外的存儲單元,這構成了更強的耦合,稱為特征耦合,在這里,使函數之間產生聯系的是地址這樣的特征標識。另外,有兩個函數可能會打開同一個文件進行操作,這也構成了特征耦合的一種形式。

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

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

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

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

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

可以想像這樣的模塊東一榔頭西一錘子,類似一個毫無凝聚力的團伙,對應的是低質量。總之,在解決問題劃分函數時,要遵循“一個函數,一個功能”的原則,盡可能使模塊達到功能內聚。

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

2-示例篇

任務:輸出200以內的完全平方數(一個數如果是另一個整數的完全平方,那么我們就稱這個數為完全平方數,也叫做平方數),要求每隔5個數據要輸出一個換行。 解決方案及點評對于這個簡單任務,我們在一個main函數中完成了任務。程序如方案1:


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

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

在實現的應用中,幾乎所有的處理都可以分解為“輸入-計算-輸出”的模式,優秀的解決方案往往至少要將這三個模塊都獨立出來,對于“計算”模塊而言,其內部不再包括輸入輸出,專門接受輸入的數據,計算完成后返回結果即可。

當然,對于復雜的問題,在各個環節上可能還需要再做分解。

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

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

這兩個模塊之間,需要有一個“現在是第幾次調用”的信息需要傳遞,不可能用耦合程度最松散的非直接耦合.我們考慮數據耦合,用簡單形式參數傳值,得到方案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("
");
else
printf(" ");
return;
}
在這個程序結構中,format與main函數的耦合程度為數據耦合。在main中定義了局部變量num,在一次都未輸出時,置初值為0是合理的。在調用format時,將num傳遞來的表示第幾次輸出(第幾個完全平方數)的形式參數n,n自增1,然后再控制輸出空格或換行。 然而分析和運行程序發現,“每隔5個數據輸出一個換行”的功能并未實現。

因為形式參數n在函數format內的改變對應的實在參數num占不同的內存空間,n++修改的結果,對num無任何的影響,導致了在下一次調用時,丟失了“輸出的是第幾個”的重要信息。 一個補救的方法,是由format將變化后的n值作為返回值,再傳回給main函數,得到如下方案3的程序:
//方案3:利用了返回值使耦合度增大,但功能得以實現的方案
#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("
");
else
printf(" ");
return n;
}
維持原函數返回值為void,而將參數改為傳地址,得到下面的方案4。這個方案的耦合度更高一些,但功能還是能夠實現的。
//方案4:傳地址實現功能的方案,耦合度更大
#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 *p)
{
    (*p)++;
if ((*p)%5==0)
printf("
");
else
printf(" ");
return;
}
一定有人想到了用全局變量的解決方案。這樣,可以將num定義為全局變量,num的生存周期不再依賴于函數調用,其值也能在函數的調用之間保持不變(只要其間沒有另外給它賦值),從而可以完成傳遞信息的任務。這時,format因為無需參數傳遞,可以設計為無參函數,得到如下方案5的程序:
//方案5:耦合度最高的全局變量方案
#include 
void format();
int num=0;
int main()
{
int m ;
for (m = 1; m * m <= 200; m++)
    {
printf("%d", m * m);
        format();
    }
return 0;
}
void format()
{
    num++;
if (num%5==0)
printf("
");
else
printf(" ");
return;
}
這是解決這個問題的耦合程度最高的一個方案。將num定義為外部變量,意味著如果還有其他函數,num是可以被任何函數修改的,當發 format 計數錯誤時,尋找錯誤困難,而修改后又可能會帶來其他地方的錯誤。在這么一個短小的程序中,這種方案可能尚可接受,當程度的規模稍變大,可能帶來的問題必須高度重視。

因此,在實際應用中,強調全局變量要慎用(不是不用)。 考慮到num是在format中應用的私用數據——只有format才關心這到底是第幾個數據,main本來都不用關心的。這樣,可以考慮將num定義為format中的局部靜態變量,得到方案6的程序:
//方案6:用靜態局部變量,耦合度偏高但封裝性最好的方案
#include 
void format();
int main()
{
int m ;
for (m = 1; m * m <= 200; m++)
    {
printf("%d", m * m);
        format();
    }
return 0;
}
void format()
{
static int num=0;
    num++;
if (num%5==0)
printf("
");
else
printf(" ");
return;
}
在這里,靜態局部變量num的作用域是局部的,定義在函數體里,封裝性在所有方案里是最好的,從而能保證信息的隱蔽性,避免其他函數無意的越權訪問;

不過,num的生存期是全局的,可以跨越函數的不同次調用,在兩次調用間傳遞信息,耦合程度(自己和自己的耦合)要高一些, 但使main函數和format函數的耦合達到了最理想的程度,既保證了功能的正確,又保證了局部數據的安全性,表現出靜態局部變量的優勢。

綜上所述,在解決一個問題時,存在著諸多的方案。方案1可以接受,但希望提高內聚性而做出改進;方案2用簡單的參數傳值方式實現耦合程度低,但很可惜不能完成功能;在其他方案中,對于這個問題,選擇的優先順序是:

方案6、方案3 > 方案4 > 方案5

建議讀者回顧前面的內容,想一想這樣排序的理由。 在上述探討各個方案的過程中,我們應該體會到在程序設計能力提高的過程中,不斷地學習新的技術,懂得新的評判標準,這也就是一個不斷拓寬眼蜀的過程。

在稍后的練習中,不妨多想一些方案,也能夠從專業的角度評判方案的優劣,最終做到的,就是出手就是最佳方案的專業水平。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140400
  • 數據耦合器
    +關注

    關注

    0

    文章

    2

    瀏覽量

    5336

原文標題:編程的真諦就是高內聚、低耦合,如何實現呢?

文章出處:【微信號:玩轉嵌入式,微信公眾號:玩轉嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    cpost的使用及原理解析

    嵌入式編程的需求千變萬化,要做到系統穩定,又要代碼可復用,就要做到
    發表于 08-08 11:01 ?1402次閱讀

    使用C語言實現耦合

    編程時,我們講究的是耦合,在協同開發、代碼移植、維護等環節都起到很重要的作用。
    發表于 09-21 11:33 ?1249次閱讀

    如何實現代碼的耦合

    大家在談到面向對象編程的時候基本都是討論軟件的“耦合”的特點,這6個字也是算是成為了大
    發表于 10-13 08:57 ?1310次閱讀

    淺析模塊化編程思路

    好久沒更新播客了,最新想寫些自己的編程方面想法。也就是些自己的想法,不一定準確,在這希望能和大家分享下。相信大家在大學的時候都學過程序遵循的標準是“
    發表于 12-20 06:52

    防雷插座的抗電涌裝置是如何做到防雷效果的

    需要防雷插座的原因是什么?防雷插座的抗電涌裝置是如何做到防雷效果的
    發表于 01-14 07:47

    如何去實現模塊設計中的耦合

    耦合分別是什么意思?有何作用?如何去實現模塊設計中的
    發表于 02-25 07:05

    怎么把硬件操作和APP軟件耦合起來?

    你們寫嵌入式都是怎么把硬件操作和APP軟件耦合起來的,怎樣達到耦合的效果
    發表于 11-06 07:57

    小間距LED如何做到

    小間距LED在我們日常生活中已經隨處可見。本文主要介紹了小間距LED的特點、小間距LED顯示屏優勢以及小間距LED是如何做到灰方法,最后則介紹了LED小間距技術的難點。
    發表于 12-28 10:07 ?4665次閱讀

    最美布線, 別人是如何做到

    最美布線,別人是如何做到
    的頭像 發表于 02-28 16:47 ?2457次閱讀

    C語言中的耦合講解

    編程時,我們講究的是耦合,在協同開發、代碼移植、維護等環節都起到很重要的作用。 一、原理
    的頭像 發表于 08-16 14:06 ?2494次閱讀

    C語言--“耦合編程思想

    1、定義耦合,是軟件工程中的概念,是判斷設計好壞的標準,主要是面向對象的設計,主要是看類的內聚性是否
    發表于 01-13 13:43 ?3次下載
    C語言--“<b class='flag-5'>高</b><b class='flag-5'>內</b><b class='flag-5'>聚</b>,<b class='flag-5'>低</b><b class='flag-5'>耦合</b>”<b class='flag-5'>編程</b>思想

    很強大!耦合的MCU實用軟件框架

    一個模塊內部各個元素之間的聯系的緊密程度,如果各個元素(語句、程序段)之間的聯系程度越高,則內聚性越高,也就是
    發表于 02-08 15:56 ?3次下載
    很強大!<b class='flag-5'>低</b><b class='flag-5'>耦合</b><b class='flag-5'>高</b><b class='flag-5'>內</b><b class='flag-5'>聚</b>的MCU實用軟件框架

    工程行業中如何做到碳甚至零碳

    碳的生活方式越來越多地融入我們的日常習慣當中。但是在工程行業中如何做到碳甚至零碳
    的頭像 發表于 10-14 10:31 ?748次閱讀

    Java 枚舉與策略模式、函數式接口的結合:實現耦合的設計

    中,通常會使用枚舉來定義業務上的一組常量,那除了簡單地定義常量之外,我們如何利用枚舉來實現耦合的設計
    的頭像 發表于 11-21 14:06 ?551次閱讀

    藍牙AOA定位系統如何做到精準度?

    藍牙AOA定位系統是一種高精度的室內定位技術,其精準度是通過一系列高科技的技術和方法實現的。以下是給大家分析的幾點關于如何做到精準度的幾個關鍵點:
    的頭像 發表于 12-13 11:42 ?529次閱讀