适合受众:2年以下的初级程序员和0基础的门外汉

内容大纲:

1.为什么需要一个好的代码结构

2.什么样才是一个好的结构

3.每一个分类代表什么含义

4.是否适用于WEB,Android和IOS?

5.进一步的学习的话,是要学习系统架构么?

一 为什么需要一个好的代码结构

  1. 好的代码结构并不仅仅是为了看上去清晰,它更像是我们对一个系统的拆解和组装。

  2. 好的代码结构可以让你在遇到代码交接这种天理不容的情况时,减少提刀砍人的可能性。

  3. 好的代码结构可以让多人协作开发更容易,而不会缠缠绵绵到天涯,再相爱相杀。

我们经常形容一个坏的代码结构,像屎一样。

我们称它为一坨,说真的,接手过烂代码之后,真的找不到比屎更能描述自己感受的词了。

“屎”代表着混乱,一坨,各种杂质。接手一堆烂代码的难度就像是用一坨屎来做沙画。

有时候我们还会用一团毛线来形容代码,大概是这样的。

对的,这种感受是绝对不会错的。而我们要做的就是把这团毛线,变成像瑞士军刀一样的清晰。

你们觉得哪个更有成就感?

二 什么样才是一个好的结构

  1. 好的结构应该保持单一职责。

  2. 好的结构应该是通用的。

  3. 好的结构应该是有明确定义的。

这其实就是所谓的脚手架提供的最大的价值,一般而言,Java,Android,IOS都有一套明确的框架体系,JS本来没有,后来有了,然后。。他们就打起来了。

就像。。。他们一样。

该喷火的喷火,该喷水的喷水,每个人分工都很明确。

三 每一个分类代表什么含义

1.Model

Model是模型,一般而言,会有人分的更细,VO,DTO等等。我并不推荐分的更细,这个Model常常和持久化的数据一一对应,如Mysql和MongoDB。

Model承载的作用就是数据的抽象,描述了一个数据的定义,Model的实例就是一组组的数据。整个系统都可以看成是数据的 流动,既然要流动,就一定是有流动的载体。

这个红圈标的就是Model。它就应该是一个纯数据的集合,就是被各种东西传来传去,被各种加工处理的数据团。

通常会有很多Model,一条业务流就是对应一条或者多条数据流,拿知乎为例子。

文章是一个Model,一般叫Article,包括Title,Summary,Author,Content等等。

评论也是一个Model,一般叫Comment,包括Content,userID等等。

对于初学者而言,第一个要学会,就是建模,把业务逻辑映射成数据模型。

2.Util

Util是工具的意思,一般来说,常常用来描述和业务逻辑没有关系的数据处理。

Util一般要和私有方法对比:私有方法一般来说是只是在特地场景下使用的,私有方法越多,代码结构越乱。常见的重构策略就是首先从一个越长行数的代码里抽象出若干个私有方法,然后再抽出公用的Util。

如果有可能,尽可能的少用私有方法,而是把他换成一个公用的Util,代表他和业务逻辑是不相关的。通常命名也是ArticleUtil,CommentUtil之类的。

像这种打包,不管是充气娃娃还是别的什么东西,都打包。你可以理解为图中的黑衣人就是一个Util。

某中程度上也会跟Service有点接近。但是Service一般而言,都是包含有业务逻辑的,很少能做单元测试。

Util一般来说,就是一个明确的输入和一个明确的输出结果。单元测试中,多数也是来测试Util。

积累好自己的Util是一件很重要的事儿。

3 Service

Service比Util的概念大很多,它的重点是在于提供一个服务。这个服务可能包括一系列的数据处理,也有可能会调用多个Util,或者是调用别的服务。总归一句话,就是,有什么事情,你来找我。

就像这个图上的妹妹一样,她就是一个Service,她能提供什么样的服务?这个是必须定义好的。如果是洗脚,她要帮你脱鞋,要端盆子烫你的脚。这里面,你的脚就是一个Model,盆子里的水相当于Util,不管里面放进去啥都能烫一烫。

帮你脱鞋可以是一个Service,也可以是一个私有函数,也可以是一个Util。看你的是让这个小妹妹帮你脱,还是别的小妹妹脱,还是自动脱鞋机。

如果是你自动脱。。。说明你在Model里面加上了功能,你的脚就不是一个纯粹的数据模型了,而是一个包含业务功能在里面的充血模型。

这样不好。老老实实让小妹妹帮你拖鞋不好么。

4.Dao

Dao一般而言,都是用来和底层数据库通信,负责对数据库的增删改查。

是的。他就是一个Dao。他从来不关心这些货物要去哪里,他只关心。入库,出库,查询和更换。

所谓的CRUD就是创建,读取,更新,删除。

Dao最好都是要独立出来。

到现在为止,最佳实践就是一个Service只对应一个Dao。Service会做一些额外的检查,如货物是否损坏,入库单是否完整,等等等等。

我并不推荐在Service里调用多个Dao,也推荐在Service里调用多个Service,大多数情况下我都不推荐这么干。

具体原因以后再说,这也是一个开放性的话题。

现在我们分清楚了Model,Util,Service和Dao,可是谁来做总的调度呢?

5.Controller

控制中心,所有的指令,调度都从这里发出去。

哪一个Service做什么事儿,谁的数据提供给谁,一般而言,都是在Controller里实现的。

Controller也是最常见的容易产生脏代码地方,通常他们会把一些不该放到Controller里东西也放进来。

大概的感觉就是这样的。

干嘛的都有。想想如果打小针,抽血,查尿也混杂到门诊大厅的感觉?

可是大部分人写代码就是这样的。

四.是否适用于WEB,Android和IOS?

Java后台是有很清楚的结构的,毕竟在JSP里写Sql语句的蛮荒时代已经过去了。

Android本身就是一个良好的框架体系,基本上问题也不大,最多就是MVP和MVC的差别之类。

IOS虽然没有官方提供这种框架体系,特别是很多人喜欢直接在Dict里用key取数据,这本身就破坏了代码的层次性。

但是毕竟是有李明杰提供的Json解析Util,只是各家要求的力度而已。

最难以理解的是WEB,也就是JS。

我不是在黑JS,我是在黑JS程序员。分层结构一直都不是JS社区里最注重的,在JQuery时代更是如此,不管是Html还是JS还是CSS混在一起是正常的。

那个时候叫插件,现在改名了,叫组件。

你很难在JQuery里找到一套清晰的分层结构,就跟十几年前所有的人都在Jsp里写逻辑语句的道理差不多。

直到google的大神偶尔遛达过来一看,咦?你们怎么还在刀耕火种?我来给你们加点现代感的东西吧。

于是Angular横穿出世,一次性的构建了一个清晰的框架结构。每次看到Angular的时候都忍不住 惊叹,原来前端代码也可以这样!

而原来的感觉就是这样。。。

现在基本上可以分成两大阵营,一个是React和Vue,一个是Angular。

React和Vue本身更偏得于插件化,哦,不,组件化。所以他们需要便宜桶,来拼接整个前端的架构体系。

Angular却是有典型的Java架构风格,妥妥的硬汉子。

所以,实际上说,这套体系也是可以应用在WEB上的,就像Android和IOS一样的,但是你喜欢,或者不喜欢,自己选啦。

五 进一步的学习的话,是要学习系统架构么?

是的。进一步要学习,并不仅仅是学习系统架构。

这里还没有讲到Service的设计,互相之间的调用,解耦,服务之间的通信和管理。

消息队列这个神器还没有登场,MongoDB这种战略要塞也没出场。

所以以上内容,仅适用于2年以内的各种工程师。

来源:zhihu.com/question/58410621/answer/156868800

推荐好文强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!分享一套基于SpringBoot和Vue的企业级中后台开源项目,代码很规范!能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮

项目中Dao,Service,Controller,Util,Model是什么意思,为什么划分?相关推荐

  1. 在 Java Web 项目中,Service 层和 Dao 层真的有必要每个类都加上接口吗

    作者 l 会点代码的大叔(CodeDaShu) 很多程序员在刚开始工作的时候,接触到的项目都是这样做的:项目的代码被分成 Controller.Service.Dao 层,一个接口对应一个实现类,然后 ...

  2. 使用Spring的@Autowired 实现DAO, Service, Controller三层的注入(转)

    简述: 结合Spring和Hibernate进行开发 使用@Autowired实现依赖注入, 实现一个学生注册的功能,做一个技术原型 从DAO(Repository) -> Service -& ...

  3. 实战SSM_O2O商铺_39【前端展示】首页轮播图和一级商铺Dao+Service+Controller层的实现

    文章目录 概述 HeadLine Dao层 接口 映射文件 单元测试 HeadLine Service层 接口 实现类 单元测试 ShopCategory Dao层完善 映射文件完善 单元测试 Con ...

  4. java中service设计_JDBC中DAO+service设计思想

    一.DAO设计思想 a) Data access Object(数据访问对象):前人总结出的一种固定模式的设计思想. 高可读性. 高复用性. 高扩展性. b) JDBC代码实现的增删改查操作是有复用需 ...

  5. 【Django】项目中调用深度学习模型model.predict()(Django两种启动方式runserver和uwsgi的区别)

    目录 问题 测试 解决方法 Django两种启动方式runserver和uwsgi的区别 问题 部署含有深度学习模型的Django项目的uWSGI.Nginx服务器的时候,所有模块都可以正常运行,也可 ...

  6. 实战SSM_O2O商铺_41【前端展示】店铺列表页面Dao+Service+Controller层的实现

    文章目录 概述 Dao层 接口 映射文件 单元测试 Service层 接口方法 单元测试 Controller层 增加 ShopListController 单元测试 Github地址 概述 在完成了 ...

  7. 实战SSM_O2O商铺_36【商品】商品列表之Dao+Service+Controller层的实现

    文章目录 概述 Dao层 ProductDao.java ProductDao.xml 单元测试 Service层 ProductService.java ProductServiceImpl.jav ...

  8. Dao,Service,Controller层作用

    1.Dao层:全称Data Access Object.Dao层比较底层,负责与数据库打交道具体到对某个表.某个实体的增删改查 2.Service层:又叫服务层或业务层,封装Dao层的操作,使一个方法 ...

  9. 在 VS 类库项目中 Add Service References 和 Add Web References 的区别

    问题的引出: 1.在vs2005时代,Add Web Reference(添加Web服务引用)的功能主要是添加Web Service引用.基于.NET Framework 2.0. 2.自VS2008 ...

最新文章

  1. 万级K8s集群背后etcd稳定性及性能优化实践
  2. python中使用什么注释语句和运算_Python基础知识
  3. C++编程思想:指针,引用,拷贝构造函数,赋值运算符
  4. 数据库表的字段中含空格怎么办?
  5. web前端从无到有html标签,.NET MVC 扩展 HtmlHelper 从无到有(一)
  6. Python深度学习入门学习路线(简单速成不掉头发)
  7. 计算机关闭445端口,如何关闭445端口 win7/win10关闭445端口的方法图解
  8. Android 模拟器横屏竖屏切换设置
  9. 颜水成 等 | 《深度长尾学习》综述
  10. 计算机网络举例说明,什么是计算机网络,举例说明计算机网络有哪些应用?
  11. 2020.10.15-simulink入门-无线信道特性
  12. 【Go】Go语言中的下划线
  13. Jmeter使用BeanShell取样器调用Python脚本
  14. iOS icon 尺寸
  15. 一步步读懂Pytorch Chatbot Tutorial代码(三) - 创建字典
  16. oracle 地图引擎,基于 Web 的地图服务引擎的设计与实现
  17. 华为防火墙-1-安全区域
  18. 酒店客房住宿预定管理系统(ssm,mysql)
  19. VUE使用高德JSAPI和AmapUI
  20. 【烙铁使用规范】—— 烙铁头使用及保养

热门文章

  1. 虚拟机hmc连接服务器,VMware虚拟机安装HMC图文教程
  2. 描述计算机主机,上海交大计算机第一次作业
  3. excel多表数据汇总
  4. 2022年湖南省自考考试学前教育史练习题及答案
  5. 对rman命令report obsolete的一点说明
  6. 【解决方案】阿里企业云邮箱 报错 526 Authentication failure[0]
  7. c语言罗,《程序设计基础(C语言)》罗云芳 黄富革_孔网
  8. 渲大师携手向日葵,远控赋能云渲染及GPU算力服务
  9. 第三方物流wms仓储管理的主要内容
  10. html汉子竖着显示,html文字怎么竖排显示