軟件工程與項目管理(第2版) 課件 第7章 軟件編碼_第1頁
軟件工程與項目管理(第2版) 課件 第7章 軟件編碼_第2頁
軟件工程與項目管理(第2版) 課件 第7章 軟件編碼_第3頁
軟件工程與項目管理(第2版) 課件 第7章 軟件編碼_第4頁
軟件工程與項目管理(第2版) 課件 第7章 軟件編碼_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

7.1軟件編碼的目的

7.2程序設計語言

7.3結構化程序設計

7.4編碼風格

7.5程序編碼優(yōu)化技術

7.6代碼評審和版本控制7.1軟件編碼的目的作為軟件工程的一個步驟,軟件編碼是軟件設計的自然結果。編碼階段的主要任務是根據軟件詳細設計階段產生的每個模塊的詳細設計說明書,編寫成某種程序設計語言的源程序。為了提高系統(tǒng)的可維護性,除要求源程序的語法正確外,還要求源程序有較好的可讀性、可靠性和可測試性。同時,編程語言的特性以及編寫程序的風格也將深刻地影響到軟件的質量及可維護性。7.2程序設計語言7.2.1程序設計語言的分類目前,用于軟件開發(fā)的程序設計語言已經有數百種之多,對這些程序設計語言的分類有不少爭議。同一種語言可以歸到不同的類中。從軟件工程的角度,根據程序設計語言發(fā)展的歷程,可以把它們大致分為以下5類:(1)機器語言(第一代語言)。機器語言是由機器指令代碼組成的語言。對于不同的機器就有相應的一套機器語言。用這種語言編寫的程序,都是二進制代碼的形式,且所有的地址分配都是以絕對地址的形式處理。存儲空間的安排,寄存器、變址的使用都由程序員自己計劃。因此使用機器語言編寫的程序很不直觀,在計算機內的運行效率很高,但出錯率也高。(2)匯編語言(第二代語言)。匯編語言比機器語言直觀,它的每一條符號指令與相應的機器指令有對應關系,同時又增加了一些諸如宏、符號地址等功能。存儲空間的安排可由機器解決。不同指令集的處理器系統(tǒng)就有自己相應的匯編語言。從軟件工程的角度來看,匯編語言只是在高級語言無法滿足設計要求時,或者不具備支持某種特定功能的技術性能時,才被使用。(3)高級程序設計語言(第三代語言)。高級程序設計語言是算法語言。為了解決編程人員的困難,20世紀50年代中期出現(xiàn)了第一個算法語言——FORTRAN語言。后來又相繼出現(xiàn)了COBOL、ALGOL60、BASIC、PL/1、PASCAL、MODULA-2、C、Ada等語言,這些算法語言的特點是用一種接近于自然語言和數學的專用語言來表示算法,算法語言不依賴于計算機硬件,是面向過程的語言。(4)第四代語言(4GL)。4GL用不同的文法表示程序結構和數據結構,但是它是在更高一級抽象的層次上表示這些結構,它不再需要規(guī)定算法的細節(jié)。4GL兼有過程性和非過程性的兩重特性。程序員規(guī)定“條件和相應的動作”是過程性的部分,而“指出想要的結果”是非過程性的部分。然后由4GL語言系統(tǒng)運用它的專門領域的知識來填充過程細節(jié)。(4)第四代語言(4GL)。4GL用不同的文法表示程序結構和數據結構,但是它是在更高一級抽象的層次上表示這些結構,它不再需要規(guī)定算法的細節(jié)。4GL兼有過程性和非過程性的兩重特性。程序員規(guī)定“條件和相應的動作”是過程性的部分,而“指出想要的結果”是非過程性的部分。然后由4GL語言系統(tǒng)運用它的專門領域的知識來填充過程細節(jié)。第四代語言可以分為以下幾種類型:①查詢語言:用戶可利用查詢語言對預先定義在數據庫中的信息進行較復雜的操作。②程序生成器:只需很少的語句就能生成完整的第三代語言程序,它不必依賴預先定義的數據庫作為它的著手點。③其他4GL:如判定支持語言、原型語言、形式化規(guī)格說明語言等。(5)第五代程序設計語言(第五代語言)。第五代語言是一種新型程序設計語言。進入20世紀60年代后,擺脫馮·諾依曼概念的束縛已成為眾多語言學家為之奮斗的目標,為此目標而研制的語言被稱為新型程序設計語言,也稱為知識型程序設計語言。新型程序設計語言力求擺脫傳統(tǒng)語言那種狀態(tài)轉換語義的模式,以適應現(xiàn)代計算機系統(tǒng)知識化、智能化的發(fā)展趨勢。新型程序設計語言基本上可以分為邏輯型語言和面向對象型語言。7.2.2程序設計語言特性的比較我們從以下3種角度來比較程序設計語言的特性:(1)心理學的觀點。從設計到編碼的轉換基本上是人的活動,因此語言的性能對程序員的心理影響將對轉換產生重大作用。程序員總是希望選擇簡單易學、使用方便的語言,以減少程序出錯率,提高軟件可靠性。從心理學的觀點,影響程序員心理的語言特性有一致性、二義性、簡潔性(緊湊性)、局部性、線性、傳統(tǒng)六種。(2)軟件工程觀點。從軟件工程觀點,程序設計語言的特性應著重考慮軟件開發(fā)項目的需要。為此,對于程序編碼,有如下一些工程上的性能要求:①詳細設計應能直接地、容易地翻譯成代碼程序。②源程序應具有可移植性。③編譯程序應具有較高的效率。④盡可能應用代碼生成的自動工具。⑤可維護性。(3)程序設計語言的技術性能。在計劃階段,極少考慮程序語言的技術特性。但在選定資源時,要規(guī)劃將要使用的支撐工具,就要確定一個具體的編譯器或者確定一個程序設計環(huán)境。如果軟件開發(fā)組的成員對所要使用的語言不熟悉,那么在成本及進度估算時必須把學習的工作量估算在內。一旦確定了軟件需求,待選用的程序語言的技術特性就顯得非常重要了。如果需要復雜的數據結構,就要仔細衡量有哪些語言能提供這些復雜的數據結構。如果首要的是高性能及實時處理的能力,就可選用適合于實時應用的語言或效率高的語言。如果該應用有許多輸出報告或繁雜的文件處理,則最好是根據軟件的要求,選定一種適合于該項工作的語言。軟件的設計質量與程序設計語言的技術性能無關(面向對象設計例外)。但在實現(xiàn)軟件設計轉化為程序代碼時,轉化的質量往往受語言性能的影響。因而也會影響到設計方法。語言的技術性能對測試和維護的影響是多種多樣的。但是,語言的某些技術特性卻會妨礙測試。此外,只要語言程序的可讀性強,而且可以減少程序的復雜性,這樣的程序設計語言對于軟件的維護就是有利的??傊ㄟ^仔細地分析和比較,選擇一種功能強而又適用的語言,對成功地實現(xiàn)從軟件設計到編碼的轉換,提高軟件的質量,改善軟件的可測試性和可維護性是至關重要的。7.2.3程序設計語言的選擇為某個特定開發(fā)項目選擇程序設計語言時,既要從技術角度、工程角度、心理學角度評價和比較各種語言的適用程度,又必須考慮現(xiàn)實可能性所需做出的某種合理折中。有實際經驗的軟件開發(fā)人員往往有這樣的體會,在他們進行決策時經常面臨的是矛盾的選擇。在選擇和評價語言時,首先要從問題入手,確定它的要求是什么?這些要求的相對重要性如何?再根據這些要求和相對重要性來衡量能采用的語言。通??紤]的原因有:(1)項目的應用范圍(最關鍵);(2)算法和計算復雜性;(3)軟件執(zhí)行的環(huán)境;(4)性能上的考慮和實現(xiàn)的條件;(5)數據結構的復雜性;(6)軟件開發(fā)人員的知識水平、心理原因等。新的更強有力的語言,雖然對于應用有很強的吸引力,但是因為已有的語言已經積累了大量的久經使用的程序,具有完整的資料、支撐軟件和軟件開發(fā)工具,程序設計人員比較熟悉,而且有過類似項目的開發(fā)經驗和成功的先例,所以出于心理原因,人們往往寧愿選用原有的語種。所以應當徹底地分析、評價、介紹新的語言,以便從原有語言過渡到新的語言。7.3結構化程序設計7.3.1結構化程序設計的原則結構化程序設計應遵循以下原則:(1)使用語言中的順序、選擇、重復等有限的基本控制結構表示程序邏輯。(2)選用的控制結構只準許有一個入口和一個出口。(3)程序語句組成容易識別的塊,每塊只有一個入口和一個出口。(4)復雜結構應該用基本控制結構進行組合嵌套來實現(xiàn)。(5)語言中沒有的控制結構,可用一段等價的程序段模擬,但要求該程序段在整個系統(tǒng)中應前后一致。(6)嚴格控制GOTO語句,僅在用一個非結構化的程序設計語言去實現(xiàn)一個結構化的構造,或者在某種可以改善而不是損害程序可讀性的情況下才可以使用GOTO語句。大量采用GOTO語句實現(xiàn)控制路徑,會使程序路徑變得復雜而且混亂,因此要控制GOTO語句的使用。但有時完全不用GOTO語句進行程序編碼,比用GOTO語句編出的程序可讀性差。對于常用的高級程序設計語言,一般都具備前述的幾種基本控制結構。即使不具備等同的結構,也可以采用等價的程序段來模擬。下面以C語言為例進行說明,參看圖7.1。7.3.2程序設計——自頂向下、逐步求精在詳細設計和編碼階段,應當采取自頂向下、逐步求精的方法,把一個模塊的功能逐步分解,細化為一系列具體的步驟,進而翻譯成一系列用某種程序設計語言寫成的程序。自頂向下、逐步求精方法的優(yōu)點:(1)自頂向下、逐步求精方法符合人們解決復雜問題的普遍規(guī)律,可提高軟件開發(fā)的成功率和生產率。(2)用先全局后局部,先整體后細節(jié),先抽象后具體的逐步求精的過程開發(fā)出來的程序具有清晰的層次結構,因此程序容易閱讀和理解。(3)程序自頂向下、逐步細化,分解成一個樹形結構(如圖7.2所示)。在同一層的結點上做的細化工作相互獨立。在任何一步發(fā)生錯誤,一般只影響它下層的結點,同一層其他結點不受影響。在以后的測試過程中,也可以先獨立地一個結點、一個結點地測試,最后再集成。(4)程序清晰和模塊化,使得在修改和重新設計一個軟件時,可復用的代碼量最大。(5)每一步工作僅在上層結點的基礎上做不多的設計擴展,便于檢查。(6)有利于設計的分工和組織工作。7.3.3數據結構的合理化結構化程序設計主要是想從程序的控制結構入手,消除不適應的、容易引起混亂的GOTO語句。然而這只是問題的一個方面,在問題的另一方面,過去沒有注意到的是數據結構的合理化問題,即數據結構訪問的規(guī)范化、標準化問題。假如數據結構中常使用數組、指針等數據類型,則對它們必須采取隨機訪問,這樣勢必產生訪問上的混亂。解決這一問題的辦法是用棧和隊列去代替數組和指針。棧與隊列分別是按后進先出(LIFO)和先進先出(FIFO)的原則進行存取的。在程序中用棧和隊列代替數組和指針,用合理的規(guī)范的順序存取代替隨機存取,將克服隨機存取帶來的麻煩。而且經實踐證明,所有使用數組和指針的程序,都可以等價替換為使用棧和隊列的程序。7.4編碼風格7.4.1程序的內部文檔為實現(xiàn)源程序的文檔化,使得源程序更具有可讀性,應采用清晰明了、風格統(tǒng)一的標識符命名規(guī)范,同時在程序中添加必要的注釋,并利用空格、空行提高程序的可視化程度。1.標識符的命名標識符包括模塊名、變量名、常量名、子程序名、數據區(qū)名、緩沖區(qū)名等。對于標識符的命名一般有以下要求:(1)標識符的命名要清晰、明了,有一定實際意義,可使用完整的單詞或大家基本可以理解的縮寫,避免使人產生誤解。較短的單詞可通過去掉“元音”形成縮寫;較長的單詞可取單詞的頭幾個字母形成縮寫;一些單詞有大家公認的縮寫。(2)命名中若使用特殊約定或縮寫,則要有注釋說明。應該在源文件的開始,對文件中所使用的縮寫或約定,特別是特殊的縮寫進行必要的注釋說明。(3)自己特有的命名風格,要自始至終保持一致,不可來回變化。個人的命名風格,在符合所在項目組或產品組的命名規(guī)則的前提下,才可使用(即命名規(guī)則中沒有規(guī)定到的地方才可有個人命名風格)。(4)對于變量命名,盡量不要取單個字符(如i、j、k…),建議除了要有具體含義外,還能表明其變量類型、數據類型等,但i、j、k作局部循環(huán)變量是允許的。變量,尤其是局部變量,如果用單個字符表示,則很容易敲錯(如i寫成j),而編譯時又檢查不出來,有可能為了這個小小的錯誤而花費大量的查錯時間。(5)命名規(guī)范必須與所使用的系統(tǒng)風格保持一致,并在同一項目中統(tǒng)一。比如采用UNIX的全小寫加下畫線的風格或大小寫混排的方式,不要使用大小寫與下畫線混排的方式。用作特殊標識如標識成員變量或全局變量的m_和g_,其后加上大小寫混排的方式是允許的。(6)名字不是越長越好,過長的名字會使程序的邏輯流程變得模糊,給修改帶來困難。所以應當選擇精煉的、意義明確的名字,以改善對程序功能的理解。(7)在一個程序中,一個變量只應用于一種用途。就是說,在同一個程序中一個變量不能身兼幾種工作。(8)除非必要,不要用數字或較奇怪的字符來定義標識符。(9)在同一軟件產品內,應規(guī)劃好接口部分標識符(變量、結構、函數及常量)的命名,防止編譯、鏈接時產生沖突。對接口部分的標識符應該有更嚴格的限制,以防止沖突。如可規(guī)定接口部分的變量與常量之前加上“模塊”標識等。(10)用正確的反義詞組命名具有互斥意義的變量或相反動作的函數等。2.程序的注釋夾在程序中的注釋是程序員與日后的程序讀者之間通信的重要手段。正確的注釋能夠幫助讀者理解程序,可為后續(xù)階段進行測試和維護提供明確的指導。因此,注釋絕不是可有可無的,大多數程序設計語言允許使用自然語言來寫注釋,這就給閱讀程序帶來很大的方便。程序的注釋有以下要求:(1)一般情況下,源程序有效注釋量必須在20%以上。注釋的原則是有助于對程序的閱讀理解,注釋不宜太多也不能太少,注釋語言必須準確、易懂、簡潔。(2)說明性文件(如頭文件.h文件、.inc文件、.def文件、編譯說明文件.cfg等)頭部應進行注釋,注釋應列出:版權說明、版本號、生成日期、作者、內容、功能、與其他文件的關系、修改日志等,頭文件的注釋中還應有函數功能簡要說明。(3)源文件頭部應進行注釋,列出:版權說明、版本號、生成日期、作者、模塊目的/功能、主要函數及其功能、修改日志等。(4)函數頭部應進行注釋,列出:函數的目的/功能、輸入參數、輸出參數、返回值、調用關系(函數、表)等。(5)邊寫代碼邊注釋,修改代碼同時修改相應的注釋,以保證注釋與代碼的一致性。不再有用的注釋要刪除。(6)注釋的內容要清楚、明了,含義準確,防止注釋二義性。(7)避免在注釋中使用縮寫,特別是非常用的縮寫。在使用縮寫時或之前,應對縮寫進行必要的說明。(8)注釋應與其描述的代碼相近,對代碼的注釋應放在其上方或右方(對單條語句的注釋)相鄰位置,不可放在下面,如放于上方則需要與其上面的代碼用空行隔開。(9)對于所有有物理含義的變量、常量,如果其命名不是充分自注釋的,則在聲明時都必須加以注釋,說明其物理含義。變量、常量、宏的注釋應放在其上方相鄰位置或右方。(10)數據結構聲明(包括數組、結構、類、枚舉等),如果其命名不是充分自注釋的,則必須加以注釋。對數據結構的注釋應放在其上方相鄰位置,不可放在下面;對結構中的每個域的注釋放在此域的右方。(11)全局變量要有較詳細的注釋,包括對其功能、取值范圍、哪些函數或過程存取它以及存取時注意事項等的說明。(12)注釋與所描述內容進行同樣的縮排。(13)將注釋與其上面的代碼用空行隔開。(14)對變量的定義和分支語句(條件分支、循環(huán)語句等)必須編寫注釋。(15)避免在一行代碼或表達式的中間插入注釋。(16)通過對函數或過程、變量、結構等正確的命名以及合理地組織代碼的結構,使代碼成為自注釋的。(17)在代碼的功能、意圖層次上進行注釋,提供有用、額外的信息。(18)在程序塊的結束行右方加注釋標記,以表明某程序塊的結束。(19)注釋應考慮程序易讀及外觀排版的因素,使用的語言若是中、英兼有的,則建議多使用中文,除非能用非常流利準確的英文表達。注釋語言不統(tǒng)一,影響程序易讀性和外觀排版,出于對維護人員的考慮,建議使用中文。3.視覺組織利用空格、空行和移行,提高程序的可視化程度。(1)恰當地利用空格,可以突出運算的優(yōu)先性,避免發(fā)生運算的錯誤。(2)自然的程序段之間可用空行隔開。(3)對于選擇語句和循環(huán)語句,把其中的程序段語句向右做階梯式移行。這樣可使程序的邏輯結構更加清晰,層次更加分明。7.4.2數據說明在編寫程序時,需要注意數據說明的風格。為了使程序中數據說明更易于理解和維護,必須注意以下幾點:(1)數據說明的次序應當規(guī)范化,使數據屬性容易查找。(2)當多個變量名用一個語句說明時,應當對這些變量按字母的順序排列。(3)如果設計了一個復雜的數據結構,則應當使用注釋來說明在程序實現(xiàn)時這個數據結構的固有特點。7.4.3語句結構在設計階段確定了軟件的邏輯結構,但構造單個語句則是編碼階段的任務。語句構造應力求簡單、直接,不能為了片面追求效率而使語句復雜化。因此,編碼中對語句的編寫應遵循以下的原則:(1)在一行內只寫一條語句,并且采取適當的移行格式,使程序的邏輯和功能變得更加明確。(2)盡量用公共過程或子程序去代替重復的功能代碼段。(3)使用括號來清晰地表達算術表達式和邏輯表達式的運算順序。(4)避免不必要的轉移。同時如果能保持程序的可讀性,則不必用GOTO語句。(5)盡量只采用3種基本的控制結構來編寫程序。(6)避免采用過于復雜的判定條件。(7)盡量減少使用“否定”條件的條件語句。(8)避免過多的循環(huán)嵌套和條件嵌套。(9)不要使GOTO語句相互交叉。(10)避免循環(huán)的多個出口。(11)使用數組,以避免重復的控制序列。(12)對遞歸定義的數據結構盡量使用遞歸過程。(13)注意計算機浮點數運算的特點,例如,浮點數運算10.0*0.1,通常不等于1.0。(14)不要單獨進行浮點數的比較。用它們做比較,其結果常常發(fā)生異常情況。(15)在程序中應有出錯處理功能,一旦出現(xiàn)故障時不要讓操作系統(tǒng)進行干預,這樣會導致停工。7.4.4輸入和輸出輸入和輸出(I/O)信息是與用戶的使用直接相關的。輸入和輸出的方式和格式應當盡可能方便用戶的使用。因此,在軟件需求分析階段和設計階段,就應基本確定輸入和輸出的風格。系統(tǒng)能否被用戶接受,有時就取決于輸入和輸出的風格。不論是批處理的輸入/輸出方式,還是交互式的輸入/輸出方式,在設計和程序編碼時都應考慮下列原則:(1)對所有的輸入數據都進行檢驗,從而識別錯誤的輸入,以保證每個數據的有效性。(2)檢查輸入項的各種重要組合的合理性,必要時報告輸入狀態(tài)信息。(3)輸入的步驟和操作盡可能簡單,并保持簡單的輸入格式。(4)輸入數據時,應允許使用自由格式輸入。(5)應允許缺省值。(6)輸入一批數據時,最好使用輸入結束標志,而不要由用戶指定輸入數據數目。(7)在以交互式輸入/輸出方式進行輸入時,要在屏幕上明確提示交互輸入的請求,指明可使用選擇項的種類和取值范圍。同時,在數據輸入的過程中和輸入結束時,也要在屏幕上給出狀態(tài)信息。(8)當程序設計語言對輸入/輸出格式有嚴格要求時,應保持輸入格式與輸入語句的要求的一致性。(9)給所有的輸出加注解,并設計輸出報表格式。輸入/輸出風格還受到許多其他因素的影響。如輸入/輸出設備、用戶的熟練程度以及通信環(huán)境等。Wasserman為“用戶軟件工程及交互系統(tǒng)的設計”提供了以下一組指導性原則,可供軟件設計和編程參考。(1)把計算機系統(tǒng)的內部特性隱蔽起來不讓用戶看到。(2)有完備的輸入出錯檢查和出錯恢復措施,在程序執(zhí)行過程中盡量排除由于用戶的原因而造成程序出錯的可能性。(3)如果用戶的請求有了結果,則應隨時通知用戶。(4)充分利用聯(lián)機幫助手段,對于不熟練的用戶,提供對話式服務,對于熟練的用戶,提供較高級的系統(tǒng)服務,改善輸入/輸出的能力。(5)使輸入格式和操作要求與用戶的技術水平相適應。對于不熟練的用戶,充分利用菜單系統(tǒng)逐步引導用戶操作;對于熟練的用戶,允許繞過菜單,直接使用命令方式進行操作。(6)按照輸出設備的速度設計信息輸出過程。(7)區(qū)別不同類型的用戶,分別進行設計和編碼。(8)保持始終如一的響應時間。(9)在出現(xiàn)錯誤時應盡量減少用戶的額外工作。在交互式系統(tǒng)中,這些要求應成為軟件需求的一部分,并通過設計和編碼,在用戶和系統(tǒng)之間建立良好的通信接口。7.5程序編碼優(yōu)化技術7.5.1程序優(yōu)化更快的執(zhí)行效率會給用戶帶來更好的使用體驗。要想讓程序運行得更快,可以選擇效率更高的算法、計算能力更強的運行平臺。此外,好的編程習慣也可以進一步提高程序的性能。1.討論效率的準則程序的效率是指程序的執(zhí)行速度及程序所需占用的內存的存儲空間。討論程序效率的幾條準則如下:(1)效率是一個性能要求,應當在需求分析階段給出。軟件效率以需求為準,不應以人力所及為準。(2)好的設計可以提高效率。(3)程序的效率與程序的簡單性相關。一般說來,任何對效率無重要改善,且對程序的簡單性、可讀性和正確性不利的程序設計方法都是不可取的。2.算法對效率的影響源程序的效率與詳細設計階段確定的算法的效率直接相關。在詳細設計轉換成源程序代碼后,算法效率反映為程序的執(zhí)行速度和存儲容量的要求。由詳細設計到源程序的轉換過程中的指導原則如下:(1)在編程序前,盡可能簡化有關的算術表達式和邏輯表達式。(2)仔細檢查算法中嵌套的循環(huán),盡可能將某些語句或表達式移到循環(huán)外面。(3)盡量避免使用多維數組。(4)盡量避免使用復雜的鏈表。(5)采用“快速”的算術運算。(6)不要混淆數據類型,避免在表達式中出現(xiàn)類型混雜。(7)盡量采用整數算術表達式和布爾表達式。(8)選用等效的高效率算法。許多編譯程序具有“優(yōu)化”功能,可以自動生成高效率的目標代碼。它可剔除重復的表達式計算,采用循環(huán)求值法、快速的算術運算,以及采用一些能夠提高目標代碼運行效率的算法來提高效率。對于效率至上的應用來說,這樣的編譯程序是很有效的。3.影響存儲效率的因素在大中型計算機系統(tǒng)中,存儲限制不再是主要問題。在這種環(huán)境下,對內存采取基于操作系統(tǒng)的分頁功能的虛擬存儲管理,給軟件提供了巨大的邏輯地址空間。這時,存儲效率與操作系統(tǒng)的分頁功能直接相關,并不是要使所占用的存儲空間達到最少。采用結構化程序設計,將程序功能合理分塊,使每個模塊或一組密切相關模塊的程序體積大小與每頁的容量相匹配,可減少頁面調度,減少內外存交換,提高存儲效率。在微型計算機系統(tǒng)中,存儲容量對軟件設計和編碼的制約很大。因此要選擇可生成較短目標代碼且存儲壓縮性能優(yōu)良的編譯程序,有時需采用匯編程序。通過程序員富有創(chuàng)造性的努力,提高軟件時間與空間效率。提高存儲效率的關鍵是程序的簡單性。4.影響輸入/輸出的因素輸入/輸出可分為兩種類型:一種是面向人(操作員)的輸入/輸出;一種是面向設備的輸入/輸出。如果操作員能夠十分方便、簡單地錄入輸入數據,或者能夠十分直觀、一目了然地了解輸出信息,則可以說面向人的輸入/輸出是高效的。至于面向設備的輸入/輸出,分析起來比較復雜。從詳細設計和程序編碼的角度來說,可以提出一些提高輸入/輸出效率的指導原則:(1)輸入/輸出的請求應當最小化。(2)對于所有的輸入/輸出操作,安排適當的緩沖區(qū),以減少頻繁的信息交換。(3)對輔助存儲(例如磁盤),選擇盡可能簡單的、可接受的存取方法。(4)對輔助存儲的輸入/輸出,應當成塊傳送。(5)對終端或打印機的輸入/輸出,應考慮設備特性,盡可能改善輸入/輸出的質量和速度。(6)任何不易理解的,對改善輸入/輸出效果關系不大的措施都是不可取的。(7)任何不易理解的,所謂“超高效”的輸入/輸出是毫無價值的。(8)好的輸入/輸出程序設計風格對提高輸入/輸出效率會有明顯的效果。7.5.2程序優(yōu)化方法程序優(yōu)化方法有以下幾種。1.選擇合適的數據結構選擇一種合適的數據結構很重要。數組與指針語句具有十分密切的關系,一般來說,指針比較靈活簡潔,而數組則比較直觀,容易理解。對于大部分的編譯器,使用指針比使用數組生成的代碼更短,執(zhí)行效率更高。在許多情況下,可以用指針運算代替數組索引,這樣做常常能產生又快又短的代碼。與數組索引相比,指針一般能使代碼速度更快,占用空間更少。使用多維數組時差異更明顯。下面的代碼作用是相同的,但是效率不一樣。指針方法的優(yōu)點是,array的地址每次裝入地址p后,在每次循環(huán)中只需對p增量操作。在數組索引方法中,每次循環(huán)中都必須先計算t的值,再進行求數組下標的運算。2.對變量的優(yōu)化1)按數據類型的長度排序本地變量當編譯器分配給本地變量空間時,它們的順序和它們在源代碼中聲明的順序一樣,應該把長的變量放在短的變量前面。編譯器要求把長型數據類型存放在偶數地址邊界。在申明一個復雜的數據類型(既有多字節(jié)數據,又有單字節(jié)數據)時,應該首先存放多字節(jié)數據,然后再存放單字節(jié)數據,這樣可以避免內存的空洞。如果第一個變量對齊了,則其他變量就會連續(xù)地存放,而且不用填充字節(jié)自然就會對齊。有些編譯器在分配變量時不會自動改變變量順序,有些編譯器不能產生4字節(jié)對齊的棧,所以4字節(jié)可能不對齊。下面這個例子演示了本地變量聲明的重新排序:2)把頻繁使用的指針型參數拷貝到本地變量避免在函數中頻繁使用指針型參數指向的值。因為編譯器不知道指針之間是否存在沖突,所以指針型參數往往不能被編譯器優(yōu)化。這樣數據不能被存放在寄存器中,而且明顯地占用了內存帶寬。請在函數一開始把指針指向的數據保存到本地變量。如果需要,則在函數結束前拷貝回去。3.結構體成員的布局結構體變量在存儲時需要使其成員雙字或四字對齊。很多編譯器有“使結構體字,雙字或四字對齊”的選項,但是,還是需要改善結構體成員的對齊,有些編譯器可能分配給結構體成員空間的順序與它們聲明的不同。但是,有些編譯器并不提供這些功能,或者效果不好。所以,要在付出最少代價的情況下實現(xiàn)最好的結構體和結構體成員對齊,建議采取下列方法。1)按數據類型的長度排序把結構體的成員按照它們的類型長度排序,聲明成員時把長的類型放在短的前面。編譯器要求把長型數據類型存放在偶數地址邊界。在申明一個復雜的數據類型(既有多字節(jié)數據,又有單字節(jié)數據)時,應該首先存放多字節(jié)數據,然后再存放單字節(jié)數據,這樣可以避免內存的空洞。2)把結構體填充成最長類型長度的整倍數這樣,如果結構體的第一個成員對齊了,則所有整個結構體自然也就對齊了。下面的例子演示了如何對結構體成員進行重新排序。4.分支結構的優(yōu)化在if結構中,如果要判斷的并列條件較多,則最好將它們拆分成多個if結構,然后嵌套在一起,這樣可以避免無謂的判斷。5.減少運算的強度計算量越小,程序的效率越高。減少程序的計算量可以從選擇效率更高的運算、優(yōu)化計算順序入手,同時還可以采用將可能結果提前保存起來的“空間”換“時間”的策略來減少運算次數。1)查表對于在程序中頻繁計算的數據,可以使用查表的方法來得到,即先計算出可能使用到的數據,將其保存在一個數據表中,待以后使用時再查找。2)求余運算位操作只需一個指令周期即可完成,而大部分編譯器的“%”運算均是調用子程序來完成,代碼長、執(zhí)行速度慢。通常,只要是求2n的余數,均可使用位操作的方法來代替。3)平方運算在有內置硬件乘法器的處理器中,乘法運算比求平方運算快得多,因為浮點數的求平方是通過調用子程序來實現(xiàn)的,在具有硬件乘法器的處理器中,乘法運算只需2個時鐘周期就可以完成。即使沒有內置硬件乘法器,乘法運算的子程序也比平方運算的子程序代碼短,執(zhí)行速度更快。4)用移位實現(xiàn)乘除法運算通常如果需要乘以或除以2n,都可以用移位的方法代替。用移位的方法得到的代碼比使用乘除法生成的代碼效率高。實際上,只要是乘以或除以一個整數,均可以用移位的方法得到結果。5)避免不必要的整數除法整數除法是整數運算中最慢的,所以應該盡可能避免。一種可能減少整數除法的地方是連除,這里除法可以由乘法代替。這個替換的副作用是有可能在算乘積時會溢出,所以只能在一定范圍的除法中使用。6)使用增量和減量操作符在使用到加一和減一操作時盡量使用增量和減量操作符,因為增量操作符語句比賦值語句更快,原因在于對大多數CPU來說,對內存字的增、減量操作不必明顯地使用取內存和寫內存的指令。7)使用復合賦值表達式復合賦值表達式(如a-=1及a+=1等)都能夠生成高質量的程序代碼。8)提取公共的子表達式在某些情況下,編譯器不能從浮點表達式中提出公共的子表達式,因為這意味著相當于對表達式重新排序。需要特別指出的是,編譯器在提取公共子表達式前不能按照代數的等價關系重新安排表達式。這時,程序員要手動地提出公共的子表達式。6.循環(huán)優(yōu)化由于循環(huán)需要多次重復執(zhí)行,往往是程序中運行時間最長的部分,因此提高循環(huán)執(zhí)行的效率就可以直接提升程序的效率。要提高循環(huán)執(zhí)行的效率,往往可以從減少循環(huán)次數和合并類似循環(huán)入手。1)充分分解小的循環(huán)想要充分利用CPU的指令緩存,就要充分分解小的循環(huán)。特別是當循環(huán)體本身很小的時候,分解循環(huán)可以提高性能。2)循環(huán)嵌套把相關循環(huán)放到一個循環(huán)里,也會加快速度。7.函數優(yōu)化函數是程序中使用最多的基本單元,因此優(yōu)化函數的調用效率也可以提高程序性能。優(yōu)化函數的調用效率可以從優(yōu)化函數的返回值以及函數的參數入手。1)不定義不使用的返回值函數定義并不知道函數返回值是否被使用,假如返回值從來不會被用到,則應該使用void來明確聲明函數不返回任何值。2)減少函數調用參數使用全局變量比函數傳遞參數更加有效率。這樣做去除了函數調用參數入棧和函數完成后參數出棧所需要的時間。然而使用全局變量會影響程序的模塊化和重入,故要慎重使用。3)所有函數都應該有原型定義一般來說,所有函數都應該有原型定義。原型定義可以傳達給編譯器更多的可能用于優(yōu)化的信息。綜上,通過代碼優(yōu)化,可以提高代碼的執(zhí)行效率,從而提升程序的品質。因而優(yōu)化代碼是程序員提高自身水平,提高技能的一個很重要的途徑。不同的代碼有不同的分析方法,有不同的優(yōu)化方法,而這全憑程序員的經驗積累和自身水平。同時,優(yōu)化是一門平衡的藝術,它往往要以犧牲程序的可讀性或者增加代碼長度為代價。7.5.3網絡優(yōu)化在現(xiàn)有的網絡狀態(tài)下,使用者經常會遇到帶寬擁塞、應用性能低下、蠕蟲病毒、DDoS肆虐、惡意入侵等對網絡使用及資源有負面影響的問題及困擾,網絡優(yōu)化功能是針對現(xiàn)有的防火墻、安防及入侵檢測、負載均衡、頻寬管理、網絡防毒等設備及網絡問題的補充,能夠通過接入硬件及軟件操作的方式進行參數采集、數據分析,找出影響網絡質量的原因,通過技術手段或增加相應的硬件設備使網絡達到最佳運行狀態(tài)的方法,使網絡資源獲得最佳效益,同時了解網絡的增長趨勢并提供更好的解決方案。實現(xiàn)網絡應用性能加速,安全內容管理,安全事件管理,用戶管理,網絡資源管理與優(yōu)化,桌面系統(tǒng)管理,流量模式監(jiān)控、測量、追蹤、分析和管理,提高在廣域網上應用傳輸的性能的功能性產品,主要包括網絡資源管理器、應用性能加速器、網頁性能加速器3大類。應針對不同的需求及功能要求進行網絡的優(yōu)化。7.6代碼評審和版本控制7.6.1代碼評審代碼評審是項目開發(fā)過程中的重要環(huán)節(jié),有效的代碼評審,可以在測試前靜態(tài)地發(fā)現(xiàn)缺陷。實踐證明,缺陷發(fā)現(xiàn)的時機越早,越利于缺陷的解決和降低解決成本。代碼評審能夠有效地督促編碼規(guī)范的實施,提高代碼的可讀性和可維護性。在代碼的評審過程中,項目組成員互相交流,取長補短,促進項目組整體技能的提升??傊椖块_發(fā)過程中的代碼評審和其他各項評審工作對提高項目產品質量有重要貢獻。代碼評審一般在代碼已具雛形,并且已通過單元測試,未提交進行集成測試之前進行。評審的粒度要看代碼的規(guī)模,當然評審的代碼覆蓋面越大,代碼的質量越有保證。對于涉及業(yè)務流程較復雜的模塊一定要和熟悉業(yè)務的人一起完成代碼的評審,對這類模塊應給予重點關注,因為往往業(yè)務流程邏輯的錯誤多于語言使用的錯誤。還有一個時機建議作代碼評審,即在系統(tǒng)第一版發(fā)布后,如果有需求變動需要增加新功能,則記住這時代碼評審的效果可能好于簡單的測試,當然兩者都要有才能保證代碼質量更高。代碼評審應按照一定的流程作業(yè),這樣可以降低評審成本,提高評審效率。代碼評審流程介紹如下:(1)代碼評審發(fā)起。代碼評審發(fā)起要有專人負責,負責人要控制整個評審過程。負責人負責確定評審范圍、評審人、評審結果交付日期和組織召開評審會議。負責人還要編寫《代碼評審評審點列表》,《代碼評審評審點列表》列舉出代碼評審過程重點檢查的項目供評審人逐一檢查代碼。(2)負責人發(fā)起代碼評審。告知評審人代碼的評審范圍,確定被評審代碼的版本號,告知評審人評審結果的交付時間。負責人還應該為評審人提供相關的資料。(3)評審人評審代碼。評審人按照負責人告知的評審范圍,認真評審代碼,填寫評審報告,在規(guī)定的時間內完成評審。填寫評審報告要明確描述問題發(fā)現(xiàn)點的位置,要寫清代碼文件的版本號及問題點的行號。(4)負責人將評審結果轉交給代碼編寫人,編寫人認真核對評審報告,修正代碼。編寫人要認真填寫評審報告,要寫清修正后代碼文件的版本號,修正點的行號。(5)召開評審會議。會上逐一對評審報告認真分析,評審人和代碼編寫人要對每一項評審結果達成共識。(6)負責人編寫評審總結,將評審中總結出的問題和經驗通知給項目組成員。7.6.2版本控制在軟件開發(fā)中經常出現(xiàn)以下一些與版本控制密切相關的典型問題。1.軟件代碼的一致性軟件的開發(fā)、維護和升級,往往是多個人共同協(xié)作的過程。不同人對同一個軟件的不同部分同時做著修改,這種行為有時會出現(xiàn)彼此交叉的情況。由于同一軟件在各自開發(fā)人員的機器上都有拷貝,因此軟件的全部代碼都暴露在每個開發(fā)人員面前,原則上他有權限可以不加限制地更改軟件的任何部分。而當他們修改的內容屬于公共部分,或者需要被其他人員所負責的部分調用時,這種修改就屬于交叉情況。此時,就有可能出現(xiàn)代碼的不一致現(xiàn)象。比如,修改者在改動了某個公共函數的同時也修改了其調用接口,若其他人員沒有得知此事,而在各自機器上仍調用原來版本的函數,則當整合時,就會出現(xiàn)錯誤。另一種更為嚴重的情況是,修改者決定廢棄原有函數而另外編寫一個新的函數,但他并未刪除原有函數,這種情況在最后的整合中也可能不會被察覺,如果將這種一致性錯誤的糾正延遲到測試階段,則會增加調試的難度,從而降低開發(fā)效率。為了始終保證代碼的一致性,一種解決辦法是,要求修改者每次修改后都通過某種方式告知同組其他人員,或者隨時對軟件做整合。但是這樣,一方面會增加開發(fā)人員的負擔,另一方面也降低了軟件的開發(fā)效率。2.軟件內容的冗余問題軟件在各自開發(fā)人員的機器上都有拷貝,并且同一個開發(fā)人員在不同時期也會在本機保留當時的軟件版本,也就是說,一臺機器上還可能不止一個版本。這類似于一種信息的冗余。對于不同版本而言,其差別有時可能并不是很大。隨著時間的推移,開發(fā)人員可能對自己機器上的不同版本之間具體差異的了解變得模糊不清,甚至忘記了當時為什么區(qū)分這些版本,這就會給整合帶來麻煩。而且,如果需要同時維護多個版本,則對某個版本的改動可能需要反映到其余版本的對應處,很難保證這一過程不會出差錯。還有一點,作為開發(fā)人員,有時即使知道自己機器上軟件的某個版本可能不會再使用了,他也不會去刪除,但是通常也不會再去維護或查看它,因此久而久之,這種“僵死之物”會在多臺機器上“蔓延”。3.軟件過程的“事務性”對于軟件的某個版本,如果開發(fā)人員想要為其增添新的功能,或改善原有功能,而又擔心會攪亂原來運行良好的軟件,那么一種常用的辦法就是保留現(xiàn)有版本,另復制一個新的拷貝,并在新的副本上進行修改。這類似于一種事務處理,當將一系列操作作為一個事務時,如果中間某個操作出現(xiàn)偏差,則希望恢復到執(zhí)行事務之前的狀況。而當完成修改之后,開發(fā)人員該如何處理這兩個副本呢?是在新的副本上繼續(xù)新的開發(fā),將之作為最新版本;還是將新的改動加入原有版本,刪除新的副本?無論怎樣,都可能會出現(xiàn)如下情況:如果軟件運行正常,則出現(xiàn)冗余情況;當刪除修改前的版本后,又發(fā)現(xiàn)改動中有問題,但已無法恢復了;若改動無誤,將改動加入原有版本時,也可能出現(xiàn)人為錯誤,導致軟件運行出錯;即使沒有人為錯誤,這種做法也會給開發(fā)人員增加額外負擔,一定程度地降低開發(fā)效率。重復上述過程則會出現(xiàn)多個類似的副本,此時,如何對待這些不同版本,將是開發(fā)人員需要面對的問題。而如果調試的過程中,發(fā)現(xiàn)確實有必要恢復到上一個版本,甚至上上個版本……,此時就不得不保留所有版本了。4.軟件開發(fā)的“并發(fā)性”由于是多人共同開發(fā)一個軟件,其間出現(xiàn)多人修改軟件的同一部分,尤其是同時修改,有時是不可避免的。對于前者,具有良好編程習慣的人員的一種通常做法是,對他人的源程序進行修改時添加必要的注釋,寫明修改人、修改原因、修改日期等。但實際情況是,當修改內容很零散或修改過程很復雜時,注釋很難寫,或者代碼被注

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論