軟體設計複雜性



複雜性是指事件或事物狀態,具有多個相互關聯的連結和高度複雜的結構。在軟體程式設計中,隨著軟體設計的實現,元素數量及其相互連線的數量逐漸變得巨大,以至於難以一次理解。

如果不使用複雜性度量和衡量方法,軟體設計複雜性很難評估。讓我們看看三個重要的軟體複雜性度量。

霍爾斯特德複雜性度量

1977年,Maurice Howard Halstead先生引入了度量軟體複雜性的指標。霍爾斯特德度量取決於程式的實際實現及其度量,這些度量是靜態地直接從原始碼中的運算子和運算元計算出來的。它允許評估C/C++/Java原始碼的測試時間、詞彙量、大小、難度、錯誤和工作量。

根據霍爾斯特德,“計算機程式是演算法的實現,被認為是可分類為運算子或運算元的標記的集合”。霍爾斯特德度量將程式視為運算子及其相關運算元的序列。

他定義了各種指標來檢查模組的複雜性。

引數 含義
n1 唯一運算子的數量
n2 唯一運算元的數量
N1 運算子的總出現次數
N2 運算元的總出現次數

當我們選擇原始檔以檢視其在度量檢視器中的複雜性詳細資訊時,在度量報告中可以看到以下結果

度量 含義 數學表示
n 詞彙量 n1 + n2
N 大小 N1 + N2
V 體積 長度 * Log2(詞彙量)
D 難度 (n1/2) * (N2/n2)
E 工作量 難度 * 體積
B 錯誤 體積 / 3000
T 測試時間 時間 = 工作量 / S,其中 S = 18 秒。

圈複雜度度量

每個程式都包含按順序執行以執行某些任務的語句以及決定需要執行哪些語句的決策語句。這些決策結構改變了程式的流程。

如果我們比較兩個相同大小的程式,則具有更多決策語句的程式將更加複雜,因為程式的控制會頻繁跳轉。

McCabe於1976年提出了圈複雜度度量來量化給定軟體的複雜性。這是一個基於程式決策結構(例如if-else、do-while、repeat-until、switch-case和goto語句)的圖形驅動模型。

製作流程控制圖的過程

  • 將程式分解成更小的塊,由決策結構分隔。
  • 建立表示這些節點的節點。
  • 按如下方式連線節點
    • 如果控制可以從塊i分支到塊j

      繪製一條弧

    • 從出口節點到入口節點

      繪製一條弧。

為了計算程式模組的圈複雜度,我們使用以下公式:

V(G) = e – n + 2

Where
e is total number of edges
n is total number of nodes
Cyclomatic Complexity Measures

上述模組的圈複雜度為

e = 10
n = 8
Cyclomatic Complexity = 10 - 8 + 2
                      = 4

根據P. Jorgensen的說法,模組的圈複雜度不應超過10。

功能點

它被廣泛用於衡量軟體的大小。功能點關注系統提供的功能。系統的特性和功能用於衡量軟體的複雜性。

功能點計數基於五個引數,分別命名為外部輸入、外部輸出、邏輯內部檔案、外部介面檔案和外部查詢。為了考慮軟體的複雜性,每個引數進一步分為簡單、平均或複雜。

Function Point

讓我們看看功能點的引數

外部輸入

來自外部的每個唯一輸入都被視為外部輸入。輸入的唯一性是衡量的,因為沒有兩個輸入應該具有相同的格式。這些輸入可以是資料或控制引數。

  • **簡單** - 如果輸入計數低且影響的內部檔案較少

  • **複雜** - 如果輸入計數高且影響的內部檔案較多

  • **平均** - 簡單和複雜之間。

外部輸出

系統提供的所有輸出型別都計入此類別。如果輸出格式和/或處理是唯一的,則輸出被認為是唯一的。

  • **簡單** - 如果輸出計數低

  • **複雜** - 如果輸出計數高

  • **平均** - 簡單和複雜之間。

邏輯內部檔案

每個軟體系統都維護內部檔案以維護其功能資訊並正常執行。這些檔案儲存系統的邏輯資料。這些邏輯資料可能包含功能資料和控制資料。

  • **簡單** - 如果記錄型別數量較少

  • **複雜** - 如果記錄型別數量較多

  • **平均** - 簡單和複雜之間。

外部介面檔案

軟體系統可能需要與其一些外部軟體共享其檔案,或者可能需要將檔案傳遞進行處理或作為引數傳遞給某些函式。所有這些檔案都被計為外部介面檔案。

  • **簡單** - 如果共享檔案中記錄型別的數量較少

  • **複雜** - 如果共享檔案中記錄型別的數量較多

  • **平均** - 簡單和複雜之間。

外部查詢

查詢是輸入和輸出的組合,使用者傳送一些資料作為輸入進行查詢,系統使用處理的查詢輸出響應使用者。查詢的複雜性高於外部輸入和外部輸出。如果查詢的輸入和輸出在格式和資料方面是唯一的,則該查詢被認為是唯一的。

  • **簡單** - 如果查詢需要較低的處理量併產生少量輸出資料

  • **複雜** - 如果查詢需要高處理量併產生大量輸出資料

  • **平均** - 簡單和複雜之間。

系統中的每個引數都根據其類別和複雜性賦予權重。下表提到了賦予每個引數的權重

引數 簡單 平均 複雜
輸入 3 4 6
輸出 4 5 7
查詢 3 4 6
檔案 7 10 15
介面 5 7 10

上表產生原始功能點。這些功能點根據環境複雜性進行調整。系統使用十四種不同的特徵進行描述

  • 資料通訊
  • 分散式處理
  • 效能目標
  • 操作配置負載
  • 事務速率
  • 線上資料輸入
  • 終端使用者效率
  • 線上更新
  • 複雜的處理邏輯
  • 可重用性
  • 安裝簡易性
  • 操作簡易性
  • 多個站點
  • 促進更改的願望

然後,這些特徵因素的等級從 0 到 5,如下所示

  • 無影響
  • 偶然的
  • 適中的
  • 平均
  • 重要的
  • 必要的

所有等級然後相加為N。N的值範圍為0到70(14種特徵型別x 5種等級型別)。它用於使用以下公式計算複雜性調整因子(CAF)

CAF = 0.65 + 0.01N

然後,

Delivered Function Points (FP)= CAF x Raw FP

此FP然後可用於各種指標,例如

    **成本** = $/FP

    **質量** = 錯誤/FP

    **生產力** = FP/人月

廣告