之前买了一本书, 叫架构探险从零开始写 Java web 框架 (不推荐购买~), 一本标题党书籍! 但是我很推崇作者写代码的方式, 就是基于 TODO 的方式进行开发!
个人认为以基于 TODO 的方式进行开发, 至少有如下几点优势:
有助于理解需求
有助于梳理业务流程
有助于任务拆解和代码封装
TODO 即注释
更易于进入心流体验
同时还能避免如下两种情况:
下面我以 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", 我第一次见到这个词是在人件这本书上! 这是两年前写的读书笔记我的管理实践 --- 人件读后感!
心流的解释有很多, 有兴趣的可以去搜索一下
相信很多人都经历过, 比如你做某件事时很专注 (写代码玩游戏等等), 当做完后, 你以为没多长时间, 但是回过神来一看, 好几个小时已经过去了!
来源: https://www.cnblogs.com/ivaneye/p/8645564.html