Showing
4 changed files
with
72 additions
and
20 deletions
Docs/Rules/doc_rules.md
0 → 100644
1 | +## 开发文档规范 | ||
2 | + | ||
3 | +### 1. 概要 | ||
4 | + | ||
5 | +* 公司中,开发文档全部使用md文件,上传到项目对应的Gitlab中。 | ||
6 | +* 文档写作辅助工具包括: | ||
7 | + * Typora / MarkdownPro : MD文档撰写工具 | ||
8 | + * XMind : 思维导图工具 | ||
9 | + * Visio : 流程图工具 | ||
10 | +* 任何一个项目,以下文档不可缺,且随着开发的不断进行,也需要不断的更新 | ||
11 | + * API接口文档 及 API接口特别说明文档 | ||
12 | + * 数据库文档 | ||
13 | + * 与其它系统交互的系统交互文档 | ||
14 | + * 功能复杂的流程图 | ||
15 | + * 代码文件的phpDoc文档 | ||
16 | + | ||
17 | + | ||
18 | + | ||
19 | +--- | ||
20 | + | ||
21 | + | ||
22 | + | ||
23 | +### 2.API文档 | ||
24 | + | ||
25 | +#### 2.1 API文档做成约定 | ||
26 | + | ||
27 | +API文档默认放在各项目 S2_Project | P1_API 目录下。此目录定义了暴露给外部应用的每个接口的参数和返回值。 | ||
28 | + | ||
29 | +在写API文档时,规约包含以下几个方面: | ||
30 | + | ||
31 | +* 各个API必须以独一的形式进行编号。 | ||
32 | + | ||
33 | +* 每个API文档必须定义版本,在应用层上的版本和API文档的版本必须一致。 | ||
34 | + | ||
35 | +* API文档必须给出地址的PATH路径值。 | ||
36 | + | ||
37 | +* API文档必须给出调用的HTTP方法: GET | POST | DELETE | PUT | ||
38 | + | ||
39 | +* API文档必须给出应答的格式,默认为JSON | ||
40 | + | ||
41 | +* API的请求参数必须要详细说明,说明包括: | ||
42 | + | ||
43 | + > 类型 / 是否必须 / 备注 | ||
44 | + > | ||
45 | + > 如果参数不同,带来的返回值有很大的差异,在需要说明的情况下,也必须落实成文档。 | ||
46 | + | ||
47 | +* API的返回值的参数也必须要详细说明。说明包括: | ||
48 | + | ||
49 | + > 返回示例,返回各数据的类型, 返回各数据的详细说明。 | ||
50 | + | ||
51 | +* 如果有些返回值是可选的,也需要给出说明。 | ||
52 | + | ||
53 | +* 每个API文档下方必须要存在更新备注信息。当每一次更新API,除了修改文档,也在下方写明备注原因。 | ||
54 | + | ||
55 | +* 因升级,过时的API必须标注为depreciated. | ||
56 | + | ||
57 | +* 如果此API依赖于其它的系统交互,需要给出其它系统流程的文档跳转地址。 | ||
58 | + | ||
59 | +* 对于复杂的API(如用户验证、支付、订单流转等),需要额外定义文档, | ||
60 | + |
... | @@ -103,7 +103,7 @@ | ... | @@ -103,7 +103,7 @@ |
103 | } | 103 | } |
104 | ``` | 104 | ``` |
105 | 105 | ||
106 | -* Controller通过调用Model层,自定义Service层,Event, Queue来完成自身的业务逻辑。但是在Controller层,尽量做到对于底层服务的底耦合,为了能够更好的测度,也尽量使用对象的依赖注入。 | 106 | +* Controller通过调用Model层,自定义Service层,Event, Queue来完成自身的业务逻辑。但是在Controller层,尽量做到对于底层服务的底耦合,为了能够更好的测试,也尽量使用对象的依赖注入。 |
107 | 107 | ||
108 | * Controller层与其它层的一般关系如下 | 108 | * Controller层与其它层的一般关系如下 |
109 | 109 | ... | ... |
... | @@ -7,7 +7,7 @@ | ... | @@ -7,7 +7,7 @@ |
7 | 7 | ||
8 | * 对于各个表的Model, 继承自定义的BaseModel类,而不是Model类 | 8 | * 对于各个表的Model, 继承自定义的BaseModel类,而不是Model类 |
9 | 9 | ||
10 | -* 如果表和表之间有一定的关系,1vs1, 1vsN,那在Model中使用hasOne,belongsTo进行映射,通过这样的映射,可以对Model对象实现很清晰的操作逻辑: | 10 | +* 如果表和表之间有一定的关系,1vs1, 1vsN,那在Model中使用hasOne,belongsTo,hasMany进行映射,通过这样的映射,可以对Model对象实现很清晰的操作逻辑: |
11 | 11 | ||
12 | ```php | 12 | ```php |
13 | class GroupModel extends BaseModel { | 13 | class GroupModel extends BaseModel { |
... | @@ -50,7 +50,6 @@ $groupInstance = (new GroupModel())->getInstanceByGroupCode('Foo'); | ... | @@ -50,7 +50,6 @@ $groupInstance = (new GroupModel())->getInstanceByGroupCode('Foo'); |
50 | $groupWeixinInfoInstance = $groupInstance->myWeixinGroupInfo(); | 50 | $groupWeixinInfoInstance = $groupInstance->myWeixinGroupInfo(); |
51 | $groupSites = $groupInstance->myGroupSites()->filter( function($site) {/**/ }); | 51 | $groupSites = $groupInstance->myGroupSites()->filter( function($site) {/**/ }); |
52 | 52 | ||
53 | - | ||
54 | ``` | 53 | ``` |
55 | 54 | ||
56 | * Model必须实现数据表的增删改操作,不能让这些操作暴露在Controller或者Service中 | 55 | * Model必须实现数据表的增删改操作,不能让这些操作暴露在Controller或者Service中 |
... | @@ -92,19 +91,19 @@ public function insertUser(array $userInfo) { | ... | @@ -92,19 +91,19 @@ public function insertUser(array $userInfo) { |
92 | 91 | ||
93 | * 不要使用scope类型的函数。 | 92 | * 不要使用scope类型的函数。 |
94 | 93 | ||
95 | -* 在函数上区分并辩明属于Model的方法和属于Instance的方法。 | 94 | +* 在函数上区分并辩明属于Model对象的方法和属于Instance对象的方法。 |
96 | 95 | ||
97 | - > 所谓Model方法,是指new一个Model实例即可调用的方法,对于操作库,可以使用Model方法 | 96 | + > 所谓Model对象的方法,是指new一个Model实例即可调用的方法,对于操作库,可以使用Model方法 |
98 | > | 97 | > |
99 | - > 所谓Instance方法,是指对应的数据表中的一个实例,例如,通过User::find(1)即可获得一个Instance方法。 | 98 | + > 所谓Instance对象可调用的方法,是指对应的数据表中的一个实例,例如,通过User::find(1)即可获得一个Instance对象。 |
100 | > | 99 | > |
101 | > Instance方法一般用来获得属性,实现实例的业务逻辑,操作与此实例关联的其它数据模型的实例。 | 100 | > Instance方法一般用来获得属性,实现实例的业务逻辑,操作与此实例关联的其它数据模型的实例。 |
102 | > | 101 | > |
103 | > 一般来说,在Instance方法上,加一个My修饰词进行表示。 | 102 | > 一般来说,在Instance方法上,加一个My修饰词进行表示。 |
104 | 103 | ||
105 | ```php | 104 | ```php |
106 | -public function insertUser(array $userInfo); // Model方法 | 105 | +public function insertUser(array $userInfo); // Model对象的方法 |
107 | -public function getMyUserName() { return $this->user_name; } // Instance方法 | 106 | +public function getMyUserName() { return $this->user_name; } // Instance对象的方法 |
108 | public function checkMyRoles() { /**/ } | 107 | public function checkMyRoles() { /**/ } |
109 | ``` | 108 | ``` |
110 | 109 | ... | ... |
... | @@ -105,7 +105,7 @@ | ... | @@ -105,7 +105,7 @@ |
105 | define('CURRENT_SCRIPT','index_php'); | 105 | define('CURRENT_SCRIPT','index_php'); |
106 | const TRANSCATION_TYPE = 'income'; | 106 | const TRANSCATION_TYPE = 'income'; |
107 | 107 | ||
108 | - // 私有变量(protected不在此列) | 108 | + // 私有变量 |
109 | private $orderCnt = 0; | 109 | private $orderCnt = 0; |
110 | protected $salaryAmount = 0; | 110 | protected $salaryAmount = 0; |
111 | 111 | ||
... | @@ -133,7 +133,6 @@ | ... | @@ -133,7 +133,6 @@ |
133 | * 自编写的类一般遵循名词或名词短语来进行命名。 | 133 | * 自编写的类一般遵循名词或名词短语来进行命名。 |
134 | * 类的动作方法 ,一般使用【动词+名词】方式进行命名,例如 sendMessage / getAttr / setAttr / postLogin等 | 134 | * 类的动作方法 ,一般使用【动词+名词】方式进行命名,例如 sendMessage / getAttr / setAttr / postLogin等 |
135 | * 类的属性和变量字段,使用小写字母或者小写驼峰方式命名 | 135 | * 类的属性和变量字段,使用小写字母或者小写驼峰方式命名 |
136 | -* 类的private字段和方法,**必须**使用带_前缀的方式命名 | ||
137 | * 常量值,统一使用大写。 | 136 | * 常量值,统一使用大写。 |
138 | * 如果方法为API由外部调用,不允许修改方法签名,避免对接口调用方产生影响。 | 137 | * 如果方法为API由外部调用,不允许修改方法签名,避免对接口调用方产生影响。 |
139 | * 所有继承的覆写方法,必须加@Override 注解 | 138 | * 所有继承的覆写方法,必须加@Override 注解 |
... | @@ -151,7 +150,7 @@ | ... | @@ -151,7 +150,7 @@ |
151 | 150 | ||
152 | * 所有的类、函数、方法定义都需要进行注释。 | 151 | * 所有的类、函数、方法定义都需要进行注释。 |
153 | 152 | ||
154 | -* 类、方法、函数统一使用/** 内容 */ 注释格式, 不得使用 //** 方式 | 153 | +* 类、方法、函数统一使用/** 内容 */ 注释格式, 不得使用 // 方式 |
155 | 154 | ||
156 | * 方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释使用/* */注释,注意与代码对齐。 | 155 | * 方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释使用/* */注释,注意与代码对齐。 |
157 | 156 | ||
... | @@ -294,8 +293,6 @@ | ... | @@ -294,8 +293,6 @@ |
294 | method('a', 'b', 'c'); | 293 | method('a', 'b', 'c'); |
295 | ``` | 294 | ``` |
296 | 295 | ||
297 | - ? | ||
298 | - | ||
299 | * 在类中(尤其是在Model),对于每个属性的访问, 统一使用get/set方法 | 296 | * 在类中(尤其是在Model),对于每个属性的访问, 统一使用get/set方法 |
300 | 297 | ||
301 | ```php | 298 | ```php |
... | @@ -363,7 +360,7 @@ | ... | @@ -363,7 +360,7 @@ |
363 | } | 360 | } |
364 | ``` | 361 | ``` |
365 | 362 | ||
366 | -* 代码做到复用,对于相同听代码逻辑,严禁出现在两个函数或者两个文件内,如果逻辑相同,使用重构提取共用性。必要时抽取共性方法,或者抽象公共类,甚至是共用模块。 | 363 | +* 代码做到复用,对于相同的代码逻辑,严禁出现在两个函数或者两个文件内,如果逻辑相同,使用重构提取共用性。必要时抽取共性方法,或者抽象公共类,甚至是共用模块。 |
367 | 364 | ||
368 | * 一个函数的逻辑实现**严禁**超过一屏(非常特殊或者逻辑简单可理解的除外)。如果业务复杂,使用多个函数实现。 | 365 | * 一个函数的逻辑实现**严禁**超过一屏(非常特殊或者逻辑简单可理解的除外)。如果业务复杂,使用多个函数实现。 |
369 | 366 | ||
... | @@ -377,8 +374,6 @@ | ... | @@ -377,8 +374,6 @@ |
377 | if ($existed) { /*...*/ } | 374 | if ($existed) { /*...*/ } |
378 | ``` | 375 | ``` |
379 | 376 | ||
380 | - ? | ||
381 | - | ||
382 | * 一个函数中**不能**出现以下复杂的if/else逻辑判断, 一个规则,每个函数只if/elseif/else嵌套不超过三层。 | 377 | * 一个函数中**不能**出现以下复杂的if/else逻辑判断, 一个规则,每个函数只if/elseif/else嵌套不超过三层。 |
383 | 378 | ||
384 | * 逻辑上超过 3 层的 if-else 代码可以使用卫语句或状态模式来实现,关于 [卫语句](http://blog.csdn.net/jw903/article/details/45506777)。 | 379 | * 逻辑上超过 3 层的 if-else 代码可以使用卫语句或状态模式来实现,关于 [卫语句](http://blog.csdn.net/jw903/article/details/45506777)。 |
... | @@ -445,7 +440,6 @@ | ... | @@ -445,7 +440,6 @@ |
445 | foreach($items as $key=>$item) { | 440 | foreach($items as $key=>$item) { |
446 | // do sth | 441 | // do sth |
447 | } | 442 | } |
448 | - | ||
449 | ``` | 443 | ``` |
450 | 444 | ||
451 | ? | 445 | ? |
... | @@ -469,7 +463,6 @@ | ... | @@ -469,7 +463,6 @@ |
469 | * 注意日志输出的级别,error 级别只记录系统逻辑出错、异常等重要的错误信息。 | 463 | * 注意日志输出的级别,error 级别只记录系统逻辑出错、异常等重要的错误信息。 |
470 | 464 | ||
471 | 465 | ||
472 | - | ||
473 | --- | 466 | --- |
474 | 467 | ||
475 | 468 | ||
... | @@ -482,7 +475,6 @@ | ... | @@ -482,7 +475,6 @@ |
482 | * 在应用代码中使用“抛异常”代替“返回错误码”,应用如果是API,则对异常作出处理,返回匹配的Result结果信息。 | 475 | * 在应用代码中使用“抛异常”代替“返回错误码”,应用如果是API,则对异常作出处理,返回匹配的Result结果信息。 |
483 | 476 | ||
484 | 477 | ||
485 | - | ||
486 | --- | 478 | --- |
487 | 479 | ||
488 | 480 | ||
... | @@ -496,4 +488,5 @@ | ... | @@ -496,4 +488,5 @@ |
496 | * 未完成的功能使用TODO标记,如果函数接口层已经定义好,则在函数体内抛出暂时无法实现的异常 | 488 | * 未完成的功能使用TODO标记,如果函数接口层已经定义好,则在函数体内抛出暂时无法实现的异常 |
497 | ![](http://of2xnjf2g.bkt.clouddn.com/20170329172942.png) | 489 | ![](http://of2xnjf2g.bkt.clouddn.com/20170329172942.png) |
498 | 490 | ||
499 | - ? | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
491 | + ? | ||
492 | + | ... | ... |
-
Please register or login to post a comment