From 458e09e3ca7db0765fe8b732995029979a624548 Mon Sep 17 00:00:00 2001 From: Xargin Date: Tue, 27 Mar 2018 19:36:21 +0800 Subject: [PATCH] add controller logic dao --- ch6-web/ch6-08-layout-of-web-project.md | 6 ++--- images/ch6-08-controller-logic-dao.png | Bin 0 -> 39323 bytes .../ch6-controller-logic-dao-storage.plantuml | 25 ++++++++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 images/ch6-08-controller-logic-dao.png create mode 100644 images/ch6-controller-logic-dao-storage.plantuml diff --git a/ch6-web/ch6-08-layout-of-web-project.md b/ch6-web/ch6-08-layout-of-web-project.md index 23df029..8c34a8f 100644 --- a/ch6-web/ch6-08-layout-of-web-project.md +++ b/ch6-web/ch6-08-layout-of-web-project.md @@ -6,11 +6,11 @@ 2. 视图(View) - 界面设计人员进行图形界面设计。 3. 模型(Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。 -随着时代的发展,前端也变成了越来越复杂的工程,为了更好地工程化,现在更为流行的一般是前后分离的架构。可以认为前后分离是把 V 层从 MVC 中抽离单独成为项目。这样一个后端项目一般就只剩下 M 和 C 层了。前后端之间通过 ajax 来交互,有时候要解决跨域的问题,但也已经有了较为成熟的方案: +随着时代的发展,前端也变成了越来越复杂的工程,为了更好地工程化,现在更为流行的一般是前后分离的架构。可以认为前后分离是把 V 层从 MVC 中抽离单独成为项目。这样一个后端项目一般就只剩下 M 和 C 层了。前后端之间通过 ajax 来交互,有时候要解决跨域的问题,但也已经有了较为成熟的方案。下面是一个前后分离的系统的简易交互图。 ![前后分离](../images/ch6-08-frontend-backend.png) -事实上,即使是简单的项目,业界也并没有完全遵守 MVC 功能提出者对于 M 和 C 所定义的分工。有很多公司的项目会在 controller 层塞入大量的逻辑,在 model 层就只管理数据的存储。这往往来源于对于 model 层字面含义的某种擅自引申理解。认为字面意思,这一层就是处理某种建模,而模型是什么?就是数据呗! +图里的 vue 和 react 是现在前端界比较流行的两个框架,因为我们的重点不在这里,所以前端项目内的组织我们就不强调了。事实上,即使是简单的项目,业界也并没有完全遵守 MVC 功能提出者对于 M 和 C 所定义的分工。有很多公司的项目会在 controller 层塞入大量的逻辑,在 model 层就只管理数据的存储。这往往来源于对于 model 层字面含义的某种擅自引申理解。认为字面意思,这一层就是处理某种建模,而模型是什么?就是数据呗! 这种理解显然是有问题的,业务流程也算是一种“模型”,是对真实世界用户行为或者既有流程的一种建模,并非只有按格式组织的数据才能叫模型。不过按照 MVC 的创始人的想法,我们如果把和数据打交道的代码还有业务流程全部塞进 MVC 里的 M 层的话,这个 M 层又会显得有些过于臃肿。对于复杂的项目,一个 C 和一个 M 层显然是不够用的,现在比较流行的纯后端 api 模块一般采用下述划分方法: @@ -20,7 +20,7 @@ 每一层都会做好自己的工作,然后用请求当前的上下文构造下一层工作所需要的结构体或其它类型参数,然后调用下一次的函数。在工作完成之后,再把处理结果一层层地传出到入口。 -TODOTODO,这里是一个请求,从 c->l->d 的流程,和返回的示意图。 +![controller-logic-dao](../images/ch6-08-controller-logic-dao.png) 划分为 CLD 三层之后,在 C 层我们可能还需要同时支持多种协议。本章前面讲到的 thrift、gRPC 和 http 并不是一定只选择其中一种,有时我们需要支持其中的两种,比如同一个接口,我们既需要效率较高的 thrift,也需要方便 debug 的 http 入口。这样请求的流程会变成下面这样: diff --git a/images/ch6-08-controller-logic-dao.png b/images/ch6-08-controller-logic-dao.png new file mode 100644 index 0000000000000000000000000000000000000000..d61998910fcd4664e263d8d013696d4b5e8af5d3 GIT binary patch literal 39323 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 W?t1)G#ZQs9$w=Rl%8=Cc`hNgU>zd>M literal 0 HcmV?d00001 diff --git a/images/ch6-controller-logic-dao-storage.plantuml b/images/ch6-controller-logic-dao-storage.plantuml new file mode 100644 index 0000000..97d1185 --- /dev/null +++ b/images/ch6-controller-logic-dao-storage.plantuml @@ -0,0 +1,25 @@ +' Copyright 2018 . All rights reserved. +' Use of this source code is governed by a Apache +' license that can be found in the LICENSE file. + +@startuml controller-logic-dao +scale 1366*768 + + +activate Controller +Controller -> Controller: validate input + +Controller -> Logic : build struct needed by logic, call function in logic +activate Logic +Logic -> Logic: logic check, use design patterns to work +Logic -> Dao: call save order func +activate Dao +Dao -> Storage: save order +Storage -> Dao: save order result +Dao -> Logic: return save result +deactivate Dao +Logic -> Controller: return result +deactivate Logic + +deactivate Controller +@enduml \ No newline at end of file