免费大黄网站,久久午夜夜伦鲁鲁片免费无码影视 ,国产又色又爽又黄的,久久国产成人午夜av影院

當(dāng)前位置:首頁 > 問答 > 正文內(nèi)容

程序結(jié)構(gòu)的7個證明原理

鈄玲琳4年前 (2021-05-02)問答239
印刷廠直印●彩頁1000張只需要69元●名片5元每盒-更多報價?聯(lián)系電話:138-1621-1622(微信同號)

  程序結(jié)構(gòu)應(yīng)遵循7個證明原理,以確保程序的正確性、健壯性、靈活性、可重用和可讀性等。

    1. 單純原理

    所謂單純性原理是指變量或指針等的使用遵循單一化的原則,即為不同的用途使用不同的變量或指針。采用了單純原理,程序就可以明確的反映實際的問題。

    如下面的程序,從一個文件中讀入數(shù)據(jù)放到另一個文件中:

    FILE* fp = NULL;

    fp = fopen(m_strSrcFilePath, “r“);

    /* 讀數(shù)據(jù) */

    fclose(fp);

    /* 對數(shù)據(jù)進行處理 */

    fp = fopen(m_strDesFilePath, “w“);

    /* 寫數(shù)據(jù) */

    同一個指針變量fp在一個子程序中被用來作為兩個不同文件的指針,雖然沒有錯誤,但容易造成對fp理解困難,所以最好這樣:

    FILE* fpSrc = NULL; /* 源文件 */

    FILE* fpDes = NULL; /* 目標(biāo)文件 */

    fpSrc = fopen(m_strSrcFilePath, “r“);

    /* 讀數(shù)據(jù) */

    fclose(fp);

    /* 對數(shù)據(jù)進行處理 */

    fpDes = fopen(m_strDesFilePath, “w“);

    /* 寫數(shù)據(jù) */

    2. 同型原理

    同型原理是指相同邏輯的地方應(yīng)該有相同的結(jié)構(gòu);能復(fù)用的代碼就不要重寫,用宏或者子程序?qū)崿F(xiàn)。

    例如下面這兩個循環(huán):

    for(i = 0; i m_aLinkMan.GetSize(); i++);

    for(i = 0; i = m_aLinkMan.GetSize()-1; i++);

    仔細一看,會發(fā)現(xiàn)這兩個循環(huán)其實是一樣的,但對它們?yōu)槭裁葱问讲煌瑫械劫M解,引起閱讀的障礙。

    3. 對稱原理

    對稱原理是指成對的操作應(yīng)該成對地出現(xiàn),并且出現(xiàn)在對稱的位置上。比如:內(nèi)存的申請與釋放、文件的打開與關(guān)閉、if語句是否需要相應(yīng)的else語句等。各系統(tǒng)、組成成分或模塊都應(yīng)遵循對稱原理。

    在Linux下,對稱原理主要表現(xiàn)為以下幾點:

    malloc等分配內(nèi)存的函數(shù)和free函數(shù)必須成對出現(xiàn),而且必須保證釋放掉指針不再被使用。

    open/fopen等打開文件的函數(shù)和close/fclose函數(shù)必須成對出現(xiàn),而且必須保證關(guān)閉的文件描述符或者流指針不再被使用。

    使用signal或者sigaction設(shè)置信號處理程序時,應(yīng)該先保存舊的信號處理程序,等處理完畢進行恢復(fù)。

    還有其他一些函數(shù)也必須成對使用,如mmap/munmap,pthread_mutex_init/ pthread_mutex_destroy,sem_init/sem_destroy等等。

    對于程序中的模塊、函數(shù),如有必要,也應(yīng)該保持對稱。

    4. 層次原理

    層次原理是形狀的層次美原理。例如,意識到事物的主從關(guān)系,前后關(guān)系,本末關(guān)系等層次關(guān)系,追求事物應(yīng)有的形態(tài)。必須使各個層次詳細化、數(shù)據(jù)抽象化。層次的規(guī)定要徹底。

    例如有如下代碼:

    struct p1 {};

    struct p2 {

    struct p1 *pp1;

    struct p2 *pp2;

    可以看出結(jié)構(gòu)體p1和p2之間又很明顯的層次關(guān)系,分配內(nèi)存時,應(yīng)先為pp2分配內(nèi)存,然后為pp2-pp1分配內(nèi)存;釋放時,應(yīng)該先釋放pp2-pp1的內(nèi)存,然后再釋放pp2的內(nèi)存。

    再例如,進行多線程編程時,經(jīng)常會需要進行互斥或者是信號量操作。那么應(yīng)該先調(diào)用pthread_mutex_lock設(shè)置mutex進行互斥,然后再調(diào)用sem_wait進行信號量操作。若是順序弄反了,則會引入一個race condition,從而可能產(chǎn)生死鎖。

    以上的例子只是比較簡單的情況,在程序中可能存在非常復(fù)雜的情況,要注意判別。

    5. 線性原理

    線性原理是指事物的形狀是由直線描繪出來的。例如,某個功能,是由幾個功能的重疊組合加以實現(xiàn)的。因此,在程序中應(yīng)該盡量不使用GOTO,SCHEDULE,POST/WAIT等功能。

    6. 明證原理

    邏輯的明證性原理,即應(yīng)該努力的說明一些不太清除的邏輯,并且使其具有說服力。

    實例:檢查接收到的數(shù)據(jù)中帶有的數(shù)據(jù)序號的連續(xù)性。數(shù)據(jù)序號是用2個byte表示的,從0開始,之后每個遞增1,達到 0xffff后,再重頭開始。還有,在0xffff上加上1就會變成0。

    * nowseq : 接受通知后的數(shù)據(jù)編號

    * oldseq : 接受通知前的數(shù)據(jù)編號

    * 已接受通知的數(shù)據(jù)編號,不等于接受通知前的數(shù)據(jù)編號加一,或者

    * 被通知前的數(shù)據(jù)的編號為0xffff,現(xiàn)在已接受通知的編號不為0

    if ((nowseq != oldseq + 1) || (oldseq == 0xffff  nowseq != 0 )) {

      錯誤處理;

    這個程序好像是正確的,可是,它有很多否定形的邏輯式,所以比較難以理解。首先,用肯定形式(也就是正常的條件)表示,再加上”!”,作為錯誤的條件,這樣做可以使人放心。按照這樣的做法操作,程序會形成下述情況,比原本的程序易懂。

    if (!((nowseq == oldseq + 1) || (nowseq == 0 oldseq == 0xffff))) {

      錯誤處理;

    原程序中有邏輯錯誤。也就是, nowseq是0,oldseq是0xffff的時候,滿足了if的第一個條件項的nowseq!=oldseq+1,所以雖然是正確的情況卻被當(dāng)成了錯誤。

    7. 安全原理

    安全原理是指意識到必然性的原理。例如,忽略沒有必然性或者含糊不清的地方,用安全的方法、思想來設(shè)計。

    舉例,有調(diào)用程序(Caller)和被調(diào)用程序(Callee),兩者間調(diào)用接口用的參數(shù)list是P。Caller沒有把P內(nèi)的Pi域中的初值設(shè)定為’0’,所以Callee側(cè)是異常操作。

    這個故障是在修正程序的時候產(chǎn)生的,調(diào)查故障的原因,發(fā)現(xiàn)原程序中也有相同的調(diào)用部分,那里是正確的代碼。也就是說,把P全部清為0,(由此,Pi域的初值就設(shè)定為’0’ ),然后調(diào)用Callee。

    修正程序,通過追加一個調(diào)用,修正的負責(zé)人模仿先前的調(diào)用部分,進行了編碼,認(rèn)為把P全體清為0是沒有必要的,(可能是想把程序的步驟減少),于是,P全體清0的步驟被省略了。可是,不幸的是, Pi中也混入了錯誤。

    這個例子中的問題是沒有照搬正確操作的代碼。雖然曾經(jīng)把它清為0,可是不能保證之后它一直為0。使用前,把參數(shù)list清為0,是coding的基本原則。這樣做是安全的,所以符合安全原理。

原文作者所屬博客:樂走天涯

收藏0

發(fā)表評論

訪客

看不清,換一張

◎歡迎參與討論,請在這里發(fā)表您的看法和觀點。