2015.07.31 @AV
- 整洁
- 能表现领域的意图
好代码与整洁代码的关系
什么是整洁的代码
- 可测试性
- 可维护性
方法论
- 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)
安装:
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%)
...
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:
安装:
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 ./
安装:
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
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'.
与代码复杂性或长度相关的规则集。
- CyclomaticComplexity:测量方法的复杂度
- ExcessiveMethodLength:当方法的行数超过阈值时会发生警告。
- ExcessiveParameterList:方法的参数比阈值多时会发生警告。
检查有争议代码的规则集,超全局变量的使用、类名、变量名等是否采用驼峰式命名等
- NumberOfChildren:子类的数量
- DepthOfInheritance:类的继承层次的深度
- CouplingBetweenObjects:依赖对象的数量
命名规则
未使用代码检测
根据Clean Code的原则,可以检测出代码坏味道的规则集。
- BooleanArgumentFlag:当方法使用布尔值作为参数时发生警告
- ElseExpression:对if-else结构进行警告
- StaticAccess:对方法内依赖对象存在静态调用的地方发生警告。
- scrutinizer-ci https://scrutinizer-ci.com
- coveralls.io https://coveralls.io/
- Travis CI https://travis-ci.org