shipfi

Rules

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 +
......