container-crane.320
可行的靜態分析:當標準已經定義,靜態分析工具就會開始掃描

靜態分析指在不執行金沙上线的情況下審查金沙上线。這樣的金沙上线審查可以是一個項目的一個階段,或者當金沙上线被轉移給一個新的程序員(他也可能是6個月後的你自己)的時候自然發生。在兩種情況下,目的都是通過閱讀金沙上线找到缺陷,理解它和找到不可能的情況。

不像測試,金沙上线審計發生於當金沙上线被寫出來以後,因爲,當然,在沒寫金沙上线之前沒有任何東西可以去審計。然而,被寫出的金沙上线擁有比僅僅肉眼能看到的更多的東西。在沒有考慮兩個不同方面的情況下,是不可能進行金沙上线審計的;這兩個方面是:它(金沙上线)的架構和它的獨特性。

金沙上线架構

金沙上线架構是一個組織金沙上线的規則框架。比如,設計模式或 MVC 範式幫助分隔不同部分的金沙上线,並且給事情的實踐帶來一些清晰(的概念):控制器,模型和視圖都擁有不同特定的任務。一般來說框架提供了很多這種架構。

金沙上线架構在金沙上线本身來說是很難閱讀的。它需要(很多)前提知識:確實,在使用任何框架之前,一個人需要閱讀它的文檔,學習教程,然後開始寫金沙上线。範式的轉換包括通過像從調用“echo”命令到寫一個.phtml的文件。靜態分析工具不可能通過金沙上线學習知道一些類是不是控制器:這個必須事先就被知道。

項目的獨特性

還有一些架構方面的規則只對應於一個項目。文件系統的結構通常在不同項目中有不同結構,Wordress 文件結構, Magento 文件結構, Code Igniter。還有用來存放緩存,臨時文件,模塊,第一版或第二版,測試等等的目錄。這些必須學習瞭解而且不能在一個項目到另外一個項目之間重用(或者,基於經驗,非常少)。

其他的項目的特性來源於業務邏輯,比如數據格式或算法。而且一些架構也從這些而來,比如幫助(helpers)或相關的REST服務。

通常的缺陷

最後,還有通常的缺陷。那些導致Bugs的金沙上线問題,不和任何業務邏輯或項目的規則相關。這有可能是對一門(編程)語言的經典的誤解, 或者一個快速黑客的情況。

之前的這些問題的主要不同是這些規則都關於PHP,對這些一個人可能找到各種不同的建議。學習這些應該已經做過,不應該屬於和某個項目特例或架構選擇問題。

作爲一個總結,下面的表格顯示了靜態分析將會發現的各種金沙上线和缺陷:

金沙上线中可見 架構中可見
通常缺陷 靜態分析能夠找到的問題:孤立指引錯誤(Dangling reference error) 靜態分析找到蹤跡(traces),但是不能下結論:只有模型對數據庫做查詢;只有模板文件含有HTML(如果適用)
項目特性 當特別的規則定義好後,它有可能被靜態分析找到:一個電話號碼的格式必須是(\d\d)-(\d\d)-(\d\d)-(\d\d)-(\d\d) 需要特別的規則和對架構瞭解:電話號碼存於CHAR(10)字段,沒有分隔符(i18n在模板文件裏做)

可行的靜態分析

靜態分析的一個主要的限制是列出可以強制執行的規則。對PHP有一組規則,比如PSR, ClearPHP或者 object Calisthenics提供了一個很好的通用的參考。

下一步是對一個項目提供一組獨特的規則。這個包括:

  • 從其他各種參考中選擇一些規則
  • 幫助Helpers方法
  • 數據格式(日期,電話號碼,ISBN的解析,驗證,顯示和操作)
  • 配置(變量名字,定義,訪問)
  • 存儲結構(類和存儲直接的連接,必須被存儲的對象)
  • 算法(CC信用卡驗證,VAT數字的驗證)
  • 業務邏輯
  • 對象代理(永遠不調用數據API,永遠使用這個對象…)
  • 項目的可做和可不做的東東(添加一些人性的味道)

很常見的情況是,這些規則都是一步一步在進行中完善的。儘快地收集它們使得每個人可以撰寫合法的金沙上线。它也允許加入一個靜態分析的工具,那樣可以監控應用程序的金沙上线並基於規則提供系統的反饋。只要是金沙上线標準(conding standards)不可知,它們是不可能查詢和應用上。

面向對象實踐Object Calisthenics( Cal • is • then • ics– /ˌkaləsˈTHeniks/)

作爲一個例子,這個是 面向對象實踐(Object Calisthenics) 編程練習在上面的表裏幾個規則。由於這是不僅僅侷限於PHP的哲學(規範),這裏沒有“通常缺陷”。在你的自己的項目中適用它們。

金沙上线中可 架構中可見
通常缺陷
  • 不要使用 ELSE 關鍵字
  • 每個方法只有一層縮進
  • 保證所有的實體很小
  • 沒有類擁有多於2個以上的實例變量
  • 沒有Getters/Setters/Properties
項目特性
  • 擴展所有的原始數據類型和字符串
  • 一行只有一個 ->
  • 第一地位的集合類

Don’t Abbreviate:屬於金沙上线約定,不在這裏討論。

English: http://178.62.231.40/applicable-static-analysis/