目录
观察asp.net webapi2+angularjs1.8+bootstrap的项目代码,
因为赶进度的原因,项目中出现大量的重复代码和各不相同的命名规范,不复杂的业务js/C#的controller文件动辄上千行代码,难以维护。
这里试图提出前后端接口相关的代码规范,
并根据代码规范编写自动生成代码工具(简单业务全部生成,复杂业务生成与业务无关的接口代码),对今后的模块或者下一个项目起到辅助开发的作用。
同时简化前后端代码,让程序员能更加关注业务相关的代码。
以下规范不会影响原有代码(除非按照规范进行代码重构)!可以只在新功能中应用。
前端接口代码规范(约定)
- 所有枚举类提取出来,每个模块在前端Scripts文件夹下,根据模块检查建立Constant文件来存储:使用angularjs的Constant
- Scripts中的文件命名不要以a开头!注意!以下都一样!
-
命名方式:模块简称+Constant 文件使用Pascal命名,常量使用Camel命名
-
举例:DentalManagement模块的枚举类,使用DmConstant.js来管理,定义dmConstant(该文件存在,请参考)
- 将js业务代码和接口地址解耦,目前后端已经出现重复接口的情况,如果前端再出现,一个需求更改将需要更改太多代码
- 每个模块在Scripts文件夹下,建立接口管理的Service
- 命名方式:模块简称+ApiService 文件使用Pascal命名,服务使用Camel命名
- 举例:DentalManagement模块的接口,使用DmApiService.js来管理,定义dmApiService(该文件存在,请参考)
- 注意:Post和Get接口稍微有些代码区别
- 列名控制组件目前已经提取了一部分出来,已减少js非业务代码量(还未完全提取)
- Component文件夹存放公共组件的html代码,Scripts下存放公共组件的js代码
- 命名方式:统一采用Camel命名 js文件以Component结尾
- 定义命名举例:tableColumn.html tableColumnComponent.js(该文件存在,请参考)
- 使用方式举例:<table-column table-list="tempTableList"></table-column>(请参考ComplaintManagement.js)
- 以上Constant和Service的实现和引用,都可以参考ComplaintManagement.js+ComplaintManagement.cshtml
- Service文件都要以Service结尾
- 因为C#中的属性都是Pascal命名,所以js这边只好也Pascal方式给属性命名。。。
- 经重构一个Controller的JS文件测试,根据以上约定规则简化后,原代码700+行且无注释,新代码300+行且有注释
后端接口代码规范
- 所有接口格式为 /api/模块名称/操作+参数类名 (举例:/api/System/SaveUsers /api/DentalManagement/PageEmployees)
- 备注1:List和Page也放在类名前
- 备注2:类名和数据库表名一致(今后考虑数据库表名不再使用复数?),如果并非数据库类自行定义英文类名
- 备注3:模块和操作+类名都使用Pascal命名方式
- 所有输出参数,一定要继承CommonResponse类,这样约定使接口更加规范,方便今后将接口开放给其他平台or合作伙伴,同时方便代码生成。
- 能用注解进行参数验证的属性,都使用注解进行参数验证,尽量减少接口代码量,争取将单个接口方法的代码控制在3页以内。
- 有自定义注解需求请提出,由指定人员进行封装,因为注解可复用性很高,并且可以应用多个web项目
- 较为复杂的接口代码页数较多也没办法,但是还是尽量控制代码数量
- if判断+一行执行代码的,通通不用换行大括号,直接一行完成。嵌套的反复判断考虑使用if反判断+return,长判断条件反复用到考虑提取共有方法。很长的判断条件考虑提出公用!(请参考重构代码相关书籍)
- 一定要写注释!复杂业务请先写注释(例如:1、获取XXX信息;2、获取XXX信息;3、进行XXX对比;4、修改XXX数据)。接口上的简单注释自动生成代码工具会帮助生成。
- Get类型接口一律使用FromUri地址传参,Post类型接口一律使用FromBody对象传参
- 所有接口全部用Task async await 异步编程(接口中用的方法也是)
- 换行:
- 多个判断条件&&或者||之前换行 多个判断条件多换行方便代码阅读
- 方法换行,在 . 之前换行(即点号和方法一起换行) 长LINQ方法语句在每个方法前换行方便代码阅读
- 一行超过150个字符请换行,
- 不用拼音,用英文单词组合命名,除非名称实在太长,不然尽量不用简称(除非是先约定好的模块的简称)
- 命名空间、类名、属性、方法、枚举类、常量都是用Pascal命名,参数使用Camel命名
- 不在代码中直接对比or复制字符串,(反例 if (state == "上班") ),字符串要么使用枚举类要么使用常量类来管理!(小系统单独常量类,否则每个区分系统常量类和模块常量类)
- 加TODO 在后面标记 姓名,代表这是谁的TODO任务
自动代码生成工具
根据以上的前后端规范+约定,目前制作了简单的MVC项目来自动生成代码(面向对象编程,抽象了较多类,容易修改和扩展)
公司的小伙伴可以通过我的 IP+端口号 来访问我的生成工具
生成前后端的Controller基本代码
代码自带中文注释+日期,方便维护
生成后的代码都在textarea里面,方便直接copy到ide中,ctrl+k,d格式化一下即可(类名,注入的服务、常量名等请自行修改)
生成带注释和注解的出入参数类
这里参数都会带上后缀名称,保证出入参数和数据库EF类名不一样!
classType对应的每种参数生成的格式都不一样,需要约定,具体什么情况使用哪一种参数可以开会具体讨论
生成前后端接口方法代码
每种方法需要约定,只有满足约定的开发最适合使用本程序。
还是左边是后端代码,右边是前端代码
最后,该生成程序肯定有不足的地方,需要在实际运用中不断完善~ 如果实际运用,需要各位同学们的支持,并开个小会做简单规范说明和使用讲解