zoukankan      html  css  js  c++  java
  • 基于TODO的开发方法

    之前买了一本书,叫《架构探险—从零开始写Java Web框架 》(不推荐购买~),一本标题党书籍!但是我很推崇作者写代码的方式,就是基于TODO的方式进行开发!

    个人认为以基于TODO的方式进行开发,至少有如下几点优势:

    • 有助于理解需求
    • 有助于梳理业务流程
    • 有助于任务拆解和代码封装
    • TODO即注释
    • 更易于进入心流体验

    同时还能避免如下两种情况

    v2-5677a79638f49199a4af13e24e7fe7b1_b.jpg | center | 410x657

    image | center | 285x1073

    下面我以Blog的创建流程为例,来演示基于TODO的开发方式,并说明为何基于TODO的开发方式有如上优势!

    后端的开发框架请见Web开发框架推导

    流程演示

    后端开发流程

    基于上面的开发框架,整体流程就是Controller->Service->Mapper->Database!
    就Blog创建流程来说,我们会有BlogController->BlogService->BlogMapper->Database的流程!
    那我们的开发流程如下:

    Step1:

    @RestController
    public class BlogController{
        //todo 创建blog流程
        //todo 接收参数
        //todo 验证字段
        //todo 构建Model
        //todo 委托BlogService
        //todo 返回blog主键
        //todo 处理可能异常    
    }
    
    @Service
    public class BlogService{
        //todo 创建blog
        //todo 设置创建信息
        //todo 委托blogMapper执行
        //todo 返回主键
    }
    

    Step2:

    @RestController
    public class BlogController{
        //创建blog流程
        @PostMapping("/blog")
        public Long create(BlogDto blog){
            //todo 接收参数
            //todo 验证字段
            //todo 构建Model
            //todo 委托BlogService
            //todo 返回blog主键
            //todo 处理可能异常    
            return null;
        }
    }
    

    Step3:

    @RestController
    public class BlogController{
        //创建blog流程
        //接收参数
        @PostMapping("/blog")
        public Long create(@RequestBody @Validated BlogDto blog, BindingResult result){
            //验证字段
            if (bindResult.hasErrors()) {
                throw new BindingException(bindResult.getFieldError().getDefaultMessage());
            }
            //todo 构建Model
            //todo 委托BlogService
            //todo 返回blog主键
            //todo 处理可能异常    
            return null;
        }
    }
    

    Step4:

    @RestController
    public class BlogController{
        //创建blog流程
        //接收参数
        @PostMapping("/blog")
        public ResponseEntity create(@RequestBody @Validated BlogDto blogDto, BindingResult result){
            //验证字段
            if (bindResult.hasErrors()) {
                throw new BindingException(bindResult.getFieldError().getDefaultMessage());
            }
            //构建Model
            Blog blog = BeanUtils.copyProperties(blogDto,Blog.class);
            //todo 委托BlogService
            //todo 返回blog主键
            //todo 处理可能异常    
            return ResponseEntity.ok("");
        }
    }
    

    Step5:

    @RestController
    public class BlogController{
    
        @Autowired
        private BlogService blogService;
    
        //创建blog流程
        //接收参数
        @PostMapping("/blog")
        public ResponseEntity create(@RequestBody @Validated BlogDto blogDto, BindingResult result){
            //验证字段
            if (bindResult.hasErrors()) {
                throw new BindingException(bindResult.getFieldError().getDefaultMessage());
            }
            //构建Model
            Blog blog = BeanUtils.copyProperties(blogDto,Blog.class);
            //委托BlogService
            Long recId = blogService.create(blog);
            //todo 返回blog主键
            //todo 处理可能异常    
            return ResponseEntity.ok("");
        }
    }
    
    @Service
    public class BlogService{
        //创建blog
        public Long create(Blog blog){
            //todo 设置创建信息
            //todo 委托blogMapper执行
            //todo 返回主键
            return null;
        }
    }
    

    Step6:

    @RestController
    public class BlogController{
    
        @Autowired
        private BlogService blogService;
    
        //创建blog流程
        //接收参数
        @PostMapping("/blog")
        public ResponseEntity create(@RequestBody @Validated BlogDto blogDto, BindingResult result){
            //验证字段
            if (bindResult.hasErrors()) {
                throw new BindingException(bindResult.getFieldError().getDefaultMessage());
            }
            //构建Model
            Blog blog = BeanUtils.copyProperties(blogDto,Blog.class);
            //委托BlogService
            Long recId = blogService.create(blog);
            //返回blog主键
            return ResponseEntity.ok(recId);
            //todo 处理可能异常    
        }
    }
    

    Step7:

    @RestController
    public class BlogController{
    
        @Autowired
        private BlogService blogService;
    
        //创建blog流程
        //接收参数
        @PostMapping("/blog")
        public ResponseEntity create(@RequestBody @Validated BlogDto blogDto, BindingResult result){
            try{
                //验证字段
                if (bindResult.hasErrors()) {
                    throw new BindingException(bindResult.getFieldError().getDefaultMessage());
                }
                //构建Model
                Blog blog = BeanUtils.copyProperties(blogDto,Blog.class);
                //委托BlogService
                Long recId = blogService.create(blog);
                //返回blog主键
                return ResponseEntity.ok(recId);
            }catch (BusinessException e) {
                //处理可能异常  
                logger.error("Create Blog Error!", e);
                return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                        .body("Create Blog Error!" + e.getMessage());
            } catch (Exception e) {
                logger.error("Create Blog Error!", e);
                return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                        .body("Create Blog Error!" + e.getMessage());
            }
        }
    }
    

    Step8:

    @Service
    public class BlogService{
        //创建blog
        public Long create(Blog blog){
            //设置创建信息
            Long userId = UserContext.getUser().getUserId();
            blog.setCreateId(userId);
            blog.setUpdateId(userId);
            blog.setCreateTime(new Date());
            blog.setUpdateTime(new Date());
            //todo 委托blogMapper执行
            //todo 返回主键
            return null;
        }
    }
    

    Step9:

    @Service
    public class BlogService{
    
        @Autowired
        private BlogMapper blogMapper;
    
        //创建blog
        public Long create(Blog blog){
            //设置创建信息
            Long userId = UserContext.getUser().getUserId();
            blog.setCreateId(userId);
            blog.setUpdateId(userId);
            blog.setCreateTime(new Date());
            blog.setUpdateTime(new Date());
            //委托blogMapper执行
            blogMapper.insert(blog);
            //todo 返回主键
            return null;
        }
    }
    

    Step10:

    @Service
    public class BlogService{
    
        @Autowired
        private BlogMapper blogMapper;
    
        //创建blog
        public Long create(Blog blog){
            //设置创建信息
            Long userId = UserContext.getUser().getUserId();
            blog.setCreateId(userId);
            blog.setUpdateId(userId);
            blog.setCreateTime(new Date());
            blog.setUpdateTime(new Date());
            //委托blogMapper执行
            blogMapper.insert(blog)
            //返回主键
            return blog.getRecId();
        }
    }
    

    前端开发流程

    前端的开发除了需要处理代码逻辑,还需要处理页面流程!依然可以以TODO的方式来处理,借助于a标签和按钮,可以把页面流给串起来!
    接着上面的Blog的CRUD逻辑,这里仅列出示例,不再演示流程,开发流程和上面的流程一致!

    list.html:

    <!-- todo 新增Blog-->
    <a href="new.html">新增</a>
    
    <!--TODO 搜索-->
    <!--TODO 列表显示,操作-->
    <table>
        <tr>
            <td>
                <a href="view.html">查看</a>
                <a href="edit.html">编辑</a>
                <a href="delete.html">删除</a>
            </td>
        </tr>
    </table>
    <!--TODO 翻页-->
    

    new.html:

    <!--todo  表单字段-->
    <!--todo  验证规则-->
    <!--todo 保存逻辑-->
    <a href="list.html">保存按钮</a>
    <!--todo 取消逻辑-->
    <a href="list.html">取消按钮</a>
    

    view.html:

    <!--todo  展示字段-->
    <!--todo 返回逻辑,按场景返回?-->
    <a href="list.html">返回按钮</a>
    

    edit.html:

    <!--todo  表单字段-->
    <!--todo  字段赋值-->
    <!--todo  验证规则-->
    <!--todo 保存逻辑-->
    <a href="list.html">保存按钮</a>
    <!--todo 取消逻辑-->
    <a href="list.html">取消按钮</a>
    

    优势

    首先问一个问题,对于你接收到的信息,你是以什么样的标准来评判你理解了或学会了?就是__用你自己的话再说一遍__!
    基于TODO的开发方法就是以此为基础:

    • 首先基于需求,以TODO文字的形式将业务流程写下来。写下来以后,可以和需求去确认,修正偏差,既__有助于理解需求__也__有助于梳理业务流程__
    • 同时,可以看出,每个TODO的工作量都比较小,实际上也起到了__任务拆解和代码封装__的作用。既然任务拆解了,编写的代码也就相应的被拆解为一个个的功能代码了。当然对于逻辑较复杂的代码,还是需要使用重构手段,来进一步的对代码进行封装
    • 代码编写完后,不需要将TODO完全删除,只需要把TODO字样去除,__TODO就变成了注释__了!
    • 由于每个TODO的实现时间都较短(主要看拆解得如何),你开发的每个小功能,实际上都是在解决一个TODO,就像游戏里的打怪一样,能得到__准即时反馈__,心理得到满足!这是__进入心流体验__的一个必要条件!

    关于心流体验

    • 心流英文叫"flow",我第一次见到这个词是在《人件》这本书上!这是两年前写的读书笔记《我的管理实践---《人件》读后感》!
    • 心流的解释有很多,有兴趣的可以去搜索一下
    • 相信很多人都经历过,比如你做某件事时很专注(写代码、玩游戏等等),当做完后,你以为没多长时间,但是回过神来一看,好几个小时已经过去了!

    写在最后

    本文只是演示了一种个人比较推崇的写代码的方式,并解释了为什么推崇这种方式!当然,仅供参考!毕竟__适合自己的才是最好的__!


    公众号:ivaneye

  • 相关阅读:
    计算机图形学--贝塞尔曲线2
    计算机图形学--贝塞尔曲线1
    Windows编程1
    winform里面的Form1.Designer.cs
    mfc添加自定义事件
    怎么精确控制solidworks里面的表格的位置
    solidworks的工程图模板文件和图纸格式文件
    给datagridview的下拉框添加valueChange事件
    php开启短标签与<?xml version="1.0" encoding="UTF-8"?>冲突
    PHP分行打印数组-php输出数组方法大全
  • 原文地址:https://www.cnblogs.com/ivaneye/p/8645564.html
Copyright © 2011-2022 走看看