1. 程式人生 > >第一次個人項目【詞頻統計】——需求分析,代碼規範,設計思路

第一次個人項目【詞頻統計】——需求分析,代碼規範,設計思路

get 數據 處的 哈希表 ring 關註 區分 www 代碼規範

需求分析

  • 由於程序需要在Windows平臺和Linux平臺都能運行,因此對代碼的可移植性有一定的要求
  • 由於需要對文件夾進行遍歷,因此數據量相對較大,需要選擇合適的數據結構,在此項目中,樹和哈希表都是可供選擇的數據結構
  • 由於對字符串的處理很多,因此需要選擇一種合適的字符串表達方式,char* or string?

代碼規範

  核心要求:用代碼做到“卒章顯誌”的作用,代碼能說清楚的事情就不要用註釋,註釋僅提示思路或者註意事項。因此變量名和函數名的設置尤為關鍵,比如函數名isSamePhrase(),又比如變量名bool isStringStart.

  以下根據常用的C/C++編碼規範列舉了如下要求:

  【通用】

  • 系統頭文件應用:#include <xxx.h>
  • 自定義同文件應用:#include "xxx.h"
  • 函數體類體之間原則上用2個空行,特殊情況下可用一個或者不需要空行。

  【註釋】

  • 調試的代碼,加上註釋 // only for DEBUG
  • 需要引起關註的代碼,加上註釋 // NOTE ...
  • 對於較大的代碼塊結尾,如for,while,do等,可加上 // end for|while|do

  【命名規範】

  • 同一性:在編寫一個子模塊或派生類的時候,要遵循其基類或整體模塊的命名風格,保持命名風格在整個模塊中的同一性。
  • 標識符組成:標識符采用英文單詞或其組合,應當直觀且可以拼讀,可望文知意
    ,用詞應當準確,避免用拼音命名。
  • 最小化長度 && 最大化信息量原則:在保持一個標識符意思明確的同時,應當盡量縮短其長度。
  • 避免過於相似:不要出現僅靠大小寫區分的相似的標識符,例如"i""I""function""Function"等等。
  • 避免在不同級別的作用域中重名:程序中不要出現名字完全相同的局部變量和全局變量,盡管兩者的作用域不同而不會發生語法錯誤,但容易使人誤解。
  • 正確命名具有互斥意義的標識符:用正確的反義詞組命名具有互斥意義的標識符,如:"nMinValue""nMaxValue""GetName()""SetName()" ….
  • 避免名字中出現數字編號:盡量避免名字中出現數字編號,如Value1,Value2
    等,除非邏輯上的確需要編號。這是為了防止程序員偷懶,不肯為命名動腦筋而導致產生無意義的名字(因為用數字編號最省事)。

  【代碼風格】

  • 每一行開始處的縮進只能用Tab
  • 在代碼行的結尾部分不能出現多余的空格
  • 除了特別情況,函數體內不能出現兩個空行
  • "if"、"for"、"while"、"do"、"try"、"catch" 等語句自占一行,執行語句不得緊跟其後。不論執行語句有多少都要加 "{ }" 。這樣可以防止書寫和修改代碼時出現失誤
  • if語句如果有else語句,用 } else { 編寫為一行,不推薦用 3 行代碼的方式。
  • 多行變量定義,為了追求代碼排版美觀,可將變量豎向對齊。
  • 對於switch語句,若某個case不需要break一定要加註釋聲明。

設計思路(概述)

  • 遍歷給定的文件夾,並將文件的絕對路徑存在vector中
  • 遍歷vector,逐文件統計信息
  • 為了提高效率,采用邊讀文件變統計信息的方式
  • 由於單詞量很大,因此采用平衡二叉樹作為數據組織結構
  • 由於對單詞進行重定義,所以不能直接使用fgets或者fscanf讀字符串,而應該逐字符掃描判斷是否為單詞。
  • 由於需要統計詞組,因此可以用一個char *存儲上次讀過的字符串

第一次個人項目【詞頻統計】——需求分析,代碼規範,設計思路