以前買了一本書,叫《架構探險—從零開始寫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