Skip to content

Instantly share code, notes, and snippets.

@AlloVince
Last active May 7, 2019 07:34
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save AlloVince/a656e2842c7b6a43c81d to your computer and use it in GitHub Desktop.
Save AlloVince/a656e2842c7b6a43c81d to your computer and use it in GitHub Desktop.
npm install -g reveal-md && wget -q -O php_code_review.md https://gist.githubusercontent.com/AlloVince/a656e2842c7b6a43c81d/raw/php_code_review.md && reveal-md php_code_review.md

PHP Code Review

2015.07.31 @AV


什么是好代码


http://i.stack.imgur.com/eTZvW.jpg


  1. 整洁
  2. 能表现领域的意图

好代码与整洁代码的关系


什么是整洁的代码

  • 可测试性
  • 可维护性

方法论

  • SOLID原则
    • 单一功能 (Single Responsibility Principle)
    • 开闭原则 (Open-Closed principle, OCP)
    • 里氏替换 (Liskov Substitution Principle)
    • 接口隔离 (Interface Segregation Principle)
    • 依赖反转 (Dependence Inversion Principle)
  • Code Smell (《Clean Code》)

代码审核方法

  • 静态分析
  • 结对编程
  • 人工审查
  • CI

有什么用

  • 发现问题
  • 评估质量
  • 量化重构

静态分析

不运行程序的条件下,对源代码进行各种分析和评估


依据:软件度量(Software metric)

常见软件度量指标


  • 代码行数(LOC)
  • 类与接口数(Number of classes and interfaces)
  • 代码规范
  • 覆盖率(Code coverage)
  • 注释密度(Comment density)

  • 复杂度(Complexity)
    • 循环复杂度(Cyclomatic complexity)
    • 霍尔斯特德复杂度(Halstead complexity)
  • 耦合度(Coupling)
  • 内聚性(Cohesion)
  • 指令路径长度(Instruction path length)

  • Bugs per line of code
  • 性能
    • 程序加载时间(Program load time)
    • 程序执行时间(Program execution time)

PHP静态分析工具


PHPLOC

安装:

composer global require 'phploc/phploc=*'

运行:

phploc /opt/htdocs/EvaOAuth/src

结果:

Directories                                         13
Files                                               47

Size
  Lines of Code (LOC)                             3684
  Comment Lines of Code (CLOC)                    1412 (38.33%)
  Non-Comment Lines of Code (NCLOC)               2272 (61.67%)
...

PHPCPD

PHP Copy/Paste Detector

安装:

composer global require 'sebastian/phpcpd'

运行:

phpcpd /opt/htdocs/EvaOAuth/src

结果:

phpcpd 2.0.2-4-g51cf0bf by Sebastian Bergmann.

Found 28 exact clones with 2115 duplicated lines in 40 files:

PHPCS

安装:

composer global require 'sebastian/phpcpd'

运行:

phpcs --standard=PSR2 ./src

结果:

FILE: /Users/allovince/opt/htdocs/EvaOAuth/src/EvaOAuth/Utils/Text.php
---------------------------------------------------------------------------------------------
FOUND 12 ERRORS AND 2 WARNINGS AFFECTING 11 LINES
---------------------------------------------------------------------------------------------
  2 | ERROR   | [ ] Missing short description in doc comment
  3 | ERROR   | [ ] Content of the @author tag must be in the form
    |         |     "Display Name <username@example.com>"

phpcbf  --standard=PSR2 --extensions=php ./

PDEPEND

安装:

composer global require 'pdepend/pdepend'

运行:

pdepend --overview-pyramid=output.svg ./src/

结果:

image/svg+xml ANDC AHH NOP NOC NOM LOC CYCLO NOM CALLS FANOUT 153 254 253 1771 166 14 33 0.184 0.545 2.357 5.03 10.669 0.143 0.602 1.53 Generated by PDepend Low Average High
指标 说明
Cyclomatic Complexity Number (CYCLO) 循环复杂度。这是用于表示代码中路径复杂程度的指标,当程序的分支、循环、嵌套结构增多时,复杂程度随之增高,这个值也会变大
Lines Of Code(LOC) 源代码的行数
Number Of Methods (NOM) 方法的数量
Number Of Classes (NOC) 类的数量

指标 说明
Number Of Packages (NOP) 包的数量。在PHP中为命名空间的数量
Average Number of Derived Clas(sANDC) 子类数量的平均值
Average Hierarchy Height (AHH) 类的继承层次(继承树)的深度的平均值
CYCLO/LOC 每行的平均循环复杂度。此值用于评估由条件分支及循环引起的代码增长。

指标 说明
LOC/NOM 方法的平均行数。此值用于评估代码中方法是否过大
NOM/NOC 类的平均方法数。此值用于评估代码中职能过剩的类
NOC/NOP 每包的平均类数。此值用于评估包划分的标准

Details: http://pdepend.org/documentation/software-metrics/index.html


PHPMD

PHP Mess Detector

安装:

composer global require 'phpmd/phpmd'

运行:

phpmd ./src text codesize,unusedcode,naming

结果:

/Users/allovince/opt/htdocs/EvaOAuth/src/EvaOAuth/Events/Formatter.php:69 The method format() has a Cyclomatic Complexity of 28. The configured cyclomatic complexity threshold is 10.
/Users/allovince/opt/htdocs/EvaOAuth/src/EvaOAuth/Events/Formatter.php:69 The method format() has 102 lines of code. Current threshold is set to 100. Avoid really long methods.
/Users/allovince/opt/htdocs/EvaOAuth/src/EvaOAuth/Events/LogSubscriber.php:85 Avoid unused parameters such as '$beforeGetRequestTokenEvent'.

Code Size Rules

与代码复杂性或长度相关的规则集。

  • CyclomaticComplexity:测量方法的复杂度
  • ExcessiveMethodLength:当方法的行数超过阈值时会发生警告。
  • ExcessiveParameterList:方法的参数比阈值多时会发生警告。

Controversial Rules

检查有争议代码的规则集,超全局变量的使用、类名、变量名等是否采用驼峰式命名等


Design Rules

  • NumberOfChildren:子类的数量
  • DepthOfInheritance:类的继承层次的深度
  • CouplingBetweenObjects:依赖对象的数量

Naming Rules

命名规则


Unused Code Rules

未使用代码检测


Clean Code Rules

根据Clean Code的原则,可以检测出代码坏味道的规则集。

  • BooleanArgumentFlag:当方法使用布尔值作为参数时发生警告
  • ElseExpression:对if-else结构进行警告
  • StaticAccess:对方法内依赖对象存在静态调用的地方发生警告。

支持自定义规则集


服务


References

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment