基于TODO的开发方法

简介: 之前买了一本书,叫《架构探险—从零开始写Java Web框架 》(不推荐购买~),一本标题党书籍!但是我很推崇作者写代码的方式,就是基于TODO的方式进行开发!个人认为以基于TODO的方式进行开发,至少有如下几点优势:有助于理解需求有助于梳理业务流程有助于任务拆解和代码封装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

目录
相关文章
|
22天前
|
Java 程序员 数据库连接
90%开发者都分不清!final、finally、finalize的终极区别揭秘
小米,29岁程序员,分享Java面试中常见的final、finally、finalize区别。final确保不可变性,finally保证代码总会执行,finalize在对象被垃圾回收前做清理工作。通过故事讲解,帮助理解三者在Java资源管理中的不同角色。
28 3
|
2月前
|
设计模式 JavaScript 开发工具
Vue开发中使用好钩子方法(hook method)可以使你的代码更加模块化和可维护
Vue开发中使用好钩子方法(hook method)可以使你的代码更加模块化和可维护
23 0
|
4月前
|
XML Java Maven
"Maven项目模块化大揭秘!掌握Model间最佳继承设计,让你的代码优雅如诗,项目维护不再愁!"
【8月更文挑战第11天】Maven是Java项目中常用的构建工具,其模块化特性对大型项目的管理至关重要。本文介绍Maven中的继承与聚合机制,指导如何通过继承消除重复配置,以及如何通过聚合统一构建多个模块。遵循单一职责原则,文章建议按功能划分模块,并提供了父POM与子POM的配置示例。此外,还讨论了适度模块化、依赖管理的原则,帮助提升项目的可维护性和扩展性。
63 4
|
4月前
软件设计与架构复杂度问题之try-catch 语句的使用如何解决
软件设计与架构复杂度问题之try-catch 语句的使用如何解决
|
7月前
|
搜索推荐 Java
TODO有什么妙用
`TODO` 是Java开发中用于标记未完成功能或待修复问题的注解,能帮助追踪和管理开发任务。在代码中添加 `// TODO` 标记,如 `// TODO do something`,之后可通过搜索快速定位。IDEA还支持自定义`TODO`类型和颜色,以及全局查看和过滤器功能。阿里巴巴开发手册建议使用 `TODO` 表示待实现功能,`FIXME` 标记错误代码。推荐创建个性化代码模板以提高效率。
|
7月前
|
前端开发 开发者
【专栏】BEM(Block-Element-Modifier)是一种前端命名规范和架构方法,旨在创建清晰、可维护的代码结构。
【4月更文挑战第29天】BEM(Block-Element-Modifier)是一种前端命名规范和架构方法,旨在创建清晰、可维护的代码结构。它包括Block(独立功能单元)、Element(Block的子元素)和Modifier(表示状态或变体)。BEM的特点包括命名一致性、模块化设计、清晰结构和可复用性,适用于代码组织、样式管理、组件化开发和团队协作。虽然命名较长和学习成本是其局限性,但BEM在提升代码质量和效率方面具有显著优势,是前端开发的重要工具。
134 0
|
Java 数据库连接 数据库
高效掌握JDBC技术(三)| 三层架构理念 | 书写符合事务特性的工具类 | JUnit测试框架 | JDBC项目开发步骤(上)
高效掌握JDBC技术(三)| 三层架构理念 | 书写符合事务特性的工具类 | JUnit测试框架 | JDBC项目开发步骤
146 1
|
Java 数据库连接 数据库
高效掌握JDBC技术(三)| 三层架构理念 | 书写符合事务特性的工具类 | JUnit测试框架 | JDBC项目开发步骤(下)
高效掌握JDBC技术(三)| 三层架构理念 | 书写符合事务特性的工具类 | JUnit测试框架 | JDBC项目开发步骤
112 1
|
设计模式 存储 Java
【Java设计模式 规范与重构】 五 重构实战:基于ID生成器case(下)
【Java设计模式 规范与重构】 五 重构实战:基于ID生成器case(下)
205 0
|
设计模式 存储 SQL
【Java设计模式 规范与重构】 五 重构实战:基于ID生成器case(上)
【Java设计模式 规范与重构】 五 重构实战:基于ID生成器case(上)
144 0