OO學習體會與階段總結(測試與論證)

#前言
  隨着期末的到來,對於面向對象程序設計課程的學習也迎來了尾聲。在最後一個月的從課程中,筆者對於面向對象程序規格實現層面的單元測試、正確性論證以及使用UML圖描述程序的設計進行了深刻的學習。經過對類和方法進行規格實現進行單元測試以及論證,檢查並確認實現的正確性,使得相應代碼擁有更高的可靠性。經過使用UML類圖、時序圖、狀態圖對系統的功能、結構、行爲等層面進行描述,使面向對象程序具備更清晰的結構設計,提升程序的質量。本文經過對相關知識進行調研,就電梯調度系統這一案例繪製UML圖並做分析。在本文的最後筆者還會對本學期所學的面向對象程序設計知識進行總結。git

##正確性論證與測試編程

  • 單元測試:
      在做業中,筆者就已經以電梯調度系統爲案例進行了全覆蓋的單元測試。運用JUnit4爲每一個類中的每一個方法設計單元測試樣例。經過覆蓋方法中每行代碼與每一個分支,設置測試點,從而檢測方法運行的正確性。這一環節可以對方法進行比較全面的檢測,檢查代碼運行結果是否符合預期。筆者也在單元測試的過程當中,發現了方法中選擇分支設置上的問題。安全

  • 正確性論證:
      在最近的一次做業,筆者對於電梯調度系統每一個類和方法進行了實現層面的正確性論證。從抽象對象實現的有效性、對象有效性、方法實現有效性三個方面對系統實現層面有效性進行了邏輯證實。在抽象對象層面,論證類的抽象對象對於數據管理的有效性;在對象有效性層面,論證全部由類生成的對象都恆符合類的不變式;在方法實現層面,根據方法的規格對輸入與輸出進行劃分,並根據具體代碼實現匹配輸入-輸出對,論證方法實現符合規格。固然,須要以規格設計的正確性做爲前提。多線程

  • 正確性論證 vs 測試函數

    • 正確性論證可以從類規格以及方法過程規格出發,對於代碼實現進行邏輯上的證實。理論上,擁有正確而全面的論證過程的程序的正確性與可靠性是有保障的。
    • 單元測試是經過運行大量的測試樣例來覆蓋運行代碼的每一個分支,從而對程序的每一個部分進行運行正確性的檢測。從效果上來看,測試所達到的效果與正確性論證的效果相近,都能達到規格中的全部匹配狀況。但從數學的角度來看,測試相似於試根,即經過輸入某些特值來獲得某些結論。這在證僞時,至關有說服力,但在證實時就顯得缺少嚴謹性。相似的,單元測試在尋找程序問題時,至關有效,但沒法向像正確性證實同樣全面的論證程序的正確性。
    • 正確性論證可以覆蓋類實現、對象有效性以及方法實現多個方面,而測試僅能覆蓋方法正確性一個方面。

##OCL語言調研工具

  • OCL語言,又名對象約束語言(Object Constraint Language),做爲圖形符號(UML)的補充,對建模元素的有關細節進行說明。如前置條件、後置條件,約束等。
  • UML圖通常不夠精細,缺少與規範相關的描述,致使使用天然語言產生歧義。OCL即是爲填補這一空白研製出來的,是一種保留了易讀易寫的形式語言。
  • OCL語言是在UML基礎之上造成的用於描述規格的語言,保留了大量的天然語言的詞彙,使用必定的標識符,達到對規格的描述效果。其結構較爲複雜,描述能力較強。
  • JSF語言(課程內介紹)是在命題邏輯的基礎上造成的。經過將條件和約束的描述轉化爲邏輯表達式,運用蘊含關係,描述方法的規格。運用於具體狀況時,將條件轉化爲邏輯表達式的難度加大,描述能力不足。

##UML圖案例分析單元測試

#總結

  • 在本學期中,筆者對於面向對象程序設計進行了基礎性學習以及大量的實踐。根據知識點的聚合狀況,大體分爲如下幾個方面:
    • 對象化編程;
    • 多線程程序設計;
    • 抽象設計與程序規格;
    • 程序測試與正確性論證。

————————分割線————————

  1. 對象化編程:
      在學習編寫面向對象程序以前,筆者主要編寫的是面向過程程序(C程序)。在這一部分,筆者初次嘗試進行面向對象編程:與面向過程程序相對比的同時,學習對象的基礎知識、屬性與方法,並進行了多項式、電梯調度系統和Als電梯調度系統(可稍帶)三次練習。這一部份內容比較簡單,但對與後期的學習起到基礎性做用。對象化編程須要設計者對程序須要描述的數據進行對象化,根據其特性進行劃分,併爲之設計相關的方法。這一思想也是程序抽象設計的重要一部分。
  2. 多線程程序設計:
      在這一部分,筆者對於多線程程序的理論基礎、線程間協調、線程安全類等要點進行了學習。相較於上一單元,這一單元的難度有了較大的提升。主要是體如今多線程程序運行的不肯定上。共享資源的保護、線程間協調以及調試難度較高等因素都增長了這一部分的難度。   多線程程序是將上一單元所學的單線程程序並行化。經過對程序中各部分功能進行分解,將可以並行的功能塊並行以增長程序的效率~~(雖然增長不了多少)~~。因爲多線程並行,就會存在線程之間的數據交互,即產生了數據共享。對於共享數據,不一樣的線程運行次序每每會致使不一樣的結果。因而便引入了鎖機制以及線程安全類,經過限制共享對象的入口,來達到互斥的效果。
  3. 設計與規格:
      面向對象設計思想是對象化設計思想的昇華與提煉。其中的核心即是SOLID[^1]五項設計原則。在設計環節對於系統的交互關係、內部結構、數據組織等方面進行逐層抽象,在實現環節聽從面向對象設計原則才能編寫出複用性、魯棒性高的代碼。
      規格是對程序實現後功能的設計。在設計環節對程序內部進行數據抽象、過程抽象,分別概括出類規格與方法規格。類規格經過不變式和抽象函數規定了對於數據的管理以及操做。方法規格從前置條件、後置條件、對象修改三個方面描述了方法實現後所能達到的功能。在設計環節使用規格,可以提升程序的質量,同時也爲後期的測試以及正確性論證提供了依據。
  4. 程序測試與正確性論證:
      在程序設計與實現後就須要進行檢查。測試與正確性論證則是從兩個角度對程序實現後的正確性進行檢測。程序測試經過輸入大量測試樣例,試圖觀察程序在不一樣的環境下的運行狀況,並將其與預期效果(規格)進行對比,從而達到檢查的效果。正確性論證則是從設計規格出發,從類實現有效性、對象有效性、方法實現有效性三方面開展論證,從而獲得程序實現正確的結論。對於實現的程序,這兩個環節是程序在投入使用前必要的環節。

————————分割線————————

  • 經過連續的11次編程實踐,筆者設計與編寫面向對象程序的能力獲得了明顯的提升。其中主要體如今如下幾個方面:
    • 面向對象程序設計能力提升:在面向對象程序設計的過程當中,最重要的部分常是前期的設計環節。通過這幾回的編程練習,筆者基本掌握了面向對象程序設計的要點與原則。經過需求分析、數據抽象、過程抽象、規格設計等設計流程,對於將要編寫的程序進行全面的設計。這對於程序結構化以及魯棒性有着巨大的做用。
    • 初嘗工程化程序設計:本學期的11次編程練習都有這嚴格時間期限。週末發佈做業指導書,deadline設置在週三下午。不管做業的難度高低,都必須在限定的時間內完成。這在實際的工程程序設計中是司空見慣的。在這有限的時間內須要完成程序的設計、實現及測試整個流程,最後在時間期限前完成提交。此外,在本學期的練習中有兩次系列練習(繼承前一次做業),這就要求設計時注重工程設計原則,使用各類方法讓程序有更好的可延展性,爲以後可能遇到的新需求作準備。
    • 學習相關的工具使用:在完成編程練習的過程當中,筆者對於如git、jUnit、starUML、jprofiler等工具進行了必定學習。結合這些輔助工具,對程序設計、測試等都有着不錯的效果。

————————分割線————————

  通過了這學期的學習,筆者對於面向對象程序設計以及工程化程序設計有了比較深刻的認識;經過大量的實踐,編程能力也獲得了很多的提高。一學期雖短,知識量卻很大,筆者也將在之後用更多的時間與精力對面向對象程序設計以及工程化程序設計進行更加深刻的學習與實踐。   在本文的最後由衷地感謝本學期老師與助教們在課程中的辛勤付出。

相關文章
相關標籤/搜索