Java代码规范

规范

  • 第一次项目结束总结.一定会有错误的地方.希望以后得到补充。
  • 好的规范是一个顺利维护的基础
  • 未来开发最好采用Scrum(敏捷开发)+瀑布模型的方式
    • 先拟定文档
    • 快速迭代
    • 拥抱变化
    • 加强沟通(前后端)

命名规范

  1. 忘记中文、忘记拼音
  2. 见名知意
  3. 类名大驼峰,其它小驼峰
    • 大驼峰:每个单词首字母大写 eg: UserController
    • 小驼峰:除了首单词全小写,其它单词首字母大写。 eg: selectUserInfo
  4. 缩写只能用大家约定熟成的。eg: UserDao(Dao 数据持久层)
  5. 接口命名尽量简短、且全小写
  6. 忘记中文、忘记拼音

注释规范

类注释、方法功能注释
  1. 用文档注释/** */ 方便自动导出注解文档
  2. 类和方法定义好时就加上注释,后面细节写到就补充。避免最后再写忘记细节或者甚至忘记注释
方法内部注释
  1. 用文本注释// 或者 /* */
Pom注释
  1. 每个特殊依赖都要特殊注解其功能

    		<!--pagehelper-->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>1.2.5</version>
            </dependency>
    
  2. 插件也要注解其功能

     			<!-- mybatis generator 自动生成代码插件 -->
                <plugin>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-maven-plugin</artifactId>
                    <version>1.3.2</version>
                    <configuration>
                        	<configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
                        <overwrite>true</overwrite>
                        <verbose>true</verbose>
                    </configuration>
                </plugin>
    
  3. 可以的话导出文件名、打包类型都加点注解

配置文件注解
# 驱动配置信息

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url = jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8 
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driverClassName = com.mysql.jdbc.Driver

#连接池的配置信息

## 初始化大小,最小,最大

spring.druid.initialSize=5

spring.druid.minIdle=5

spring.druid.maxActive=20

错误代码、功能修改时,不要全删除,用//注释掉就好

文件层次规范

SpringBoot 包层次规范(暂时只会这个,可能有些不对)
  • cn.cafuc.flyeat.xxx.src.main(xxx项目名,源码文件)

    • aop

      • 说明
    • bean

      • 自定义bean
        • ResultBean web层返回统一对象
        • Page 分页对象,封装常用的具体参数
        • PageResultBean web层返回统一的分页查询对象
    • controller

      • 控制层

        • 我理解的Controller就是一个数据交换层,拿前端的数据然后给Srevice处理。拿到Service处理后的数据再给前端。

        • 所有Controller层应该只出现数据的传输,不设计数据的处理。

        • 失败案例(BM)

          /**
               * 新建楼栋
               * 留给内部第一次导入数据时用
               * 后期加权限的时候注意区分
               * @param buildNum
               * @param floorNum
               * @param region
               * @param roomNum
               * @param bunkNum
               * @return
               */
              @GetMapping("/create")
              public ResponseBean creatBuild(String buildNum,int floorNum,String region,int roomNum,int bunkNum){
                  //学校的楼栋信息应该不存在加高的可能,所以未进行相应的逻辑判断
                  buildNum=buildNum.toUpperCase();
                  if(buildService.getBuilding(buildNum)!=null)return new ResponseBean(400,"building is repeat",null);
                  Building building=new Building();
                  /*Room room=new Room();
                  Bunk bunk=new Bunk();*/  ///这两句不能写在外面,不然会报duplicate entry 1 for key primary 错,错误原因不详。
                  building.setBuildingNumber(buildNum);
                  building.setNumberOfFloor(floorNum);
          //        building.setRegion(region==("西"||"西区")?false:true);//西区为0东区为1
                  if(region.equals("西")||region.equals("西区")){
                      building.setRegion(false);
                  }else building.setRegion(true);
                  buildService.insert(building);
                  building=buildService.getBuilding(buildNum);
          //        System.out.println(building);
                  for (int i=1;i<=floorNum;i++){
                      for(int j=1;j<=roomNum;j++){
                          Room room=new Room();
                          room.setBuildingId(building.getBuildingId());
                          room.setRoomNumber(String.valueOf(i*100+j));
                          room.setFloorNumber(i);
                          room.setNumberOfBunk(bunkNum);
                          roomService.insert(room);
                          room=roomService.getRoomIdByNum(building.getBuildingId(),String.valueOf(i*100+j));
                          for(int k=1;k<=bunkNum;k++){
                              Bunk bunk=new Bunk();
                              bunk.setBunkNumber(String.valueOf(k));
                              bunk.setRoomId(room.getRoomId());
                              bunk.setIsEmptyBunk(true);
                              bunkService.insert(bunk);
                          }
                      }
                  }
                  return new ResponseBean(200,"success",null);
              }
          
        • 基本正确示范(问题就是确实对返回数据类型的封装,Controller应该不需要知道业务返回逻辑)

          /**
               * 新增器材信息
               * 暂定留给管理员使用
               * @param implement
               * @return
               */
              @PostMapping("/add")
              public ResponseBean addImplement(@RequestBody Implement implement){
                  return new ResponseBean(200,"success",implementServices.insert(implement));
              }
          
    • dao/mapper

      • 数据持久层

      • 错误示范

        @Mapper
        public interface BunkMapper {
            int insert(Bunk record);
            List<Bunk> getByRoom(int roomId);
            int insertSelective(Bunk record);
            int getByRoomId(int roomId,String bunkNum);
            int empty(int roomId);
            //SQL多参传值的时候注意事项,原生Mybatis是要求这样
            Bunk getBunk(@Param("roomId") int roomId,@Param("bunkNum") String bunkNum);
            int add(int id);
            Bunk getById(int id);
            int emptyByBunk(int id);
            int deleInfo(int id);
        }
        
      • 应该算正确示范(最明显的问题暂缺事务处理。因为我还不会!)

        @Mapper
        public interface ImplementMapper {
           
            /**
             * 新器材信息的插入
             * @param record
             * @return
             */
            int insert(Implement record);
        
            /**
             * 通过器材id精确查询
             * @param id
             * @return
             */
            Implement selectByPrimaryKey(int id);
        
            /**
             * 获取所有器材信息
             * @return
             */
            List<Implement> selectAll();
        
            /**
             * 按照器材名字或者器材类别(是否是耗材)查询
             * @param name
             * @param type
             * @return
             */
            List<Implement>  selectByNameOrType(@Param("name") String name, @Param("type") Boolean type);
        }
        
    • entity/model

      • 实体类(对应数据库表)
      • 自定义数据类型
    • exception(技术不足没写过)

      • 自定义异常
    • service

      • 业务层

      • 错误不示范了。Services长得和Mapper一样 (我第一个项目遇到得这个问题。)

      • 基本正确示范(伪代码形式,源代码太长了)

        /**
         * 租借信息EXCEL导入功能
         * @BelongsPackage:cn.cafuc.lis.Services.ServicesImpl
         * @Author:zzy
         */
        @Service
        public class RentImport implements ImportService {
            @Resource
            ConsumableMapper consumableMapper;
            @Resource
            RentMapper rentMapper;
            /**
             * 租借信息导入
             * @param fileName
             * @throws IOException
             * @throws InvalidFormatException
             */
            @Override
            public List<XSSFRow> importRent(String fileName) throws IOException, InvalidFormatException {
               	//大量EXCEL文件处理逻辑
                if(row.isNotNull()&&info.isRight()){
                    setInfo(rent,row)
                }else{
                    addErrorInfo("错误详细信息",row,errorInfo);
                }
                return errorInfo;
            }
        
            private boolean setInfo(Rent rent, XSSFRow row) {
                for (int i = 1; i <= 7; i++) {
                    boolean f = helpSet(rent, row, i);
                    if (f == false) return false;
                }
                return true;
            }
        	
            private boolean helpSet(Rent rent, XSSFRow row, int index) {
                if(row.infoIsRight()){
                    setIntoRentTable;
                    return true;
                }else return false;
            }
            private XSSFRow addHead() {
                //错误信息导出表第一行逻辑处理
                errorInfoFirstRowHandler;
                return row;
            }
            private void addErrorInfo(String errorInfo, XSSFRow row, List<XSSFRow> errorRow) {
                row.createCell(9).setCellValue(errorInfo);
                errorRow.add(row);
            }
        }
        
        
    • utils

      • 自定义工具包
    • Application.java Springboot启动类

  • cn.cafuc.flyeat.xxx.main.resources 存放配置文件

    • static
      • 静态文件
    • mapping/mapper
      • Mybatis xml映射文件
    • templaltes
      • JSP页面
      • Html页面

处理规范

统一返回消息格式规范

1.设计返回对象

/**
 * http请求返回的最外层对象
 */
@Data
public class Result {
    //错误码
    private int code;
    //提示信息
    private String msg;
    //具体内容
    private Object data;
}
/**
 *下面这种写法也行
 */
@Data
public class Result<T> {
    private int code;
    private String msg;
    private T data;
}

2.封装返回消息的格式(今天刚学到的,所以项目中未出现,但是感觉很对)

public class ResponseUtil{
    public static Result success(Object object){
        Result result=new Result();
        result.setCode(0);
        result.setMsg("成功");
        result.setData(object);
        return result;
    }
    public static Result success(){
        return success(null);
    }
    public static Result error(Integer code,String msg){
    	Result result=new Result();
        result.setCode(code);
        result.setMsg(msg);
        //这一步可以不写的
        result.setData(null);
        return result;    
    }
}

3.调用情况

/**
 *伪代码,只描述情况
 *这里用的第二种Result格式,方便他人知道返回对象的类型。
 */
public Result<Student> addStudent(Sudent student){
    if(student.hasError()){
        //错误返回其错误码和错误详细信息
        return ResponseUtil.error(code,student.errorInfoHint);
    }else{
        return ResponseUtil.success(Student.info);
    }
}

其他

  1. 在数据访问层处理异常(Dao/Mapper)和控制器中处理异常(Controller)。service中只抛出异常。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值