以前买了一本书,叫《架构探险—从零开始写Java Web框架 》(__不推荐购买~__),一本标题党书籍!可是我很推崇做者写代码的方式,就是基于TODO的方式进行开发!html
我的认为以基于TODO的方式进行开发,至少有以下几点优点:前端
__同时还能避免以下两种状况__:java
下面我以Blog的建立流程为例,来演示基于TODO的开发方式,并说明为什么基于TODO的开发方式有如上优点!后端
后端的开发框架请见Web开发框架推导!架构
基于上面的开发框架,总体流程就是Controller->Service->Mapper->Database!
就Blog建立流程来讲,咱们会有BlogController->BlogService->BlogMapper->Database的流程!
那咱们的开发流程以下:app
__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__:spa
@RestController public class BlogController{ //建立blog流程 @PostMapping("/blog") public Long create(BlogDto blog){ //todo 接收参数 //todo 验证字段 //todo 构建Model //todo 委托BlogService //todo 返回blog主键 //todo 处理可能异常 return null; } }
__Step3__:code
@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__:htm
@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的开发方法就是以此为基础:
__关于心流体验__:
本文只是演示了一种我的比较推崇的写代码的方式,并解释了为何推崇这种方式!固然,__仅供参考__!毕竟__适合本身的才是最好的__!
公众号:ivaneye