项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.先名词解释吧:

DAO = Data Access Object = 数据存取对象

Service = 服务

Controller = 控制器

Util = 工具

Model = 模型

首先,一个代码是不是有完善的结构,和是不是有上面这些东西没有什么关系,只是通常来说,我们做一个大项目会把项目分解成很多不不同的模块(Module),然后根据用途和角色,我们对这些模块有一个通用的命名规则,这也就是上面这些英文单词的来历。所以,请一定记住,项目中是否包含这些模块或者单词,和你的项目结构是否完善一毛钱关系没有。但是当你的项目结构相对完善的时候,你会发现有这样一些角色的存在。

接下来一个个的来详细讨论一下这个东西是如何出现的:

2.DAO

DAO,数据存取对象。通常我们会遇到很多要和数据库打交道的场景,如果为每一个场景都去写一些SQL语句,会让我们代码变得很奇怪,我们希望我们的代码比较干净整洁,那么一个很容易想到的方案就是把数据库封装一下,让我们和数据库的交道看起来比较像和一个对象打交道。这个对象通常就是DAO,当我们操作这个对象的时候,这个对象会自动的产生SQL语句来和数据库打交道,而我们只需要和DAO打交道就可以了。
当然,从本质上来说,DAO并不需要和数据库有什么必然的联系,DAO只是数据存取对象的缩写,所以只要是把数据持久化包装成一个对象的访问(读写),这种对象都可以被称之为DAO,譬如,用JSON格式存到硬盘上。

3.Service

Service,我们有时候会需要一些相对独立,与业务系统没啥关系的功能。但不是所有的功能都可以做成一个服务,服务是一个相对独立的功能模块,完成一些指定的工作,这些工作高度抽象和通用。一个典型的服务像是数据库服务、缓存服务、文件存储服务、身份验证服务、消息队列服务等。
关系型数据库服务可以视为是一个接收SQL语句并给出一个查询结果的服务,我们不必关心服务内部具体是如何处理问题的,我们只需要关注服务给出的接口。
并不是所有的模块都适合做成服务,一个服务首先最重要的是独立性,这个服务必须可以独立的完成指定的工作。复杂的服务可能依赖于一个或者多个更基础的服务,但是服务通常不应当依赖于任何具体的业务代码,服务必须具有高度的抽象性。关系型数据库服务就具有高度的抽象性,事实上只要我们撰写标准的SQL,不论后面是MySQL、SQL Server还是Oracle,他们都会呈现出几乎完全相同的行为。
一个更为简单的服务像是缓存服务,我们把一坨数据放进去,在一段时间内可以快速的获取这坨数据,在一段时间后数据就会消失。
当你的代码需要一个高度抽象高度标准化的功能,而这个功能又不能简单的实现,或者这个功能需要很多资源的配合,例如缓存服务需要内存资源,而数据库服务通常需要磁盘资源,身份验证服务通常需要数据库服务支持。这个时候就可以考虑将这个功能模块做成一个服务。
服务作为基础的部件,我们通常会要求它能够应付各种各样的情况,一个优质的服务通常会有非常高的可用性,因为我们的系统可能会依赖于各种各样的服务,而整个系统的可用性将不可能比其中任何一个服务的可用性更高。
所以服务的特征:抽象、独立、稳定。

评论中提到Java项目中的Service通常是指Business Service,这里也简单说说。
很多时候,我们发现服务的特征对于我们开发一个大型项目的时候很有帮助。就拿独立性来说,关系型数据库服务如SQL Server可以独立发售,独立安装和部署。它可以自行测试自己的接口,如果都达到了预期的效果,并且能够应付各种情况,这个服务就可以作为一个产品独立的出售给我们安装。这意味着关系型数据库服务并不需要配合我们的业务系统一起进行测试和调试,或者作出什么变更。
在完成一个大型的业务系统时,我们发现一些子模块或者子系统也可以像服务一样独立的部署和测试。例如会员系统、支付系统、订单系统等等,他们的业务逻辑可能非常复杂,但是逻辑相对独立,并且高度内聚。如果我们将这些系统分别独立的测试和部署,就可以大大的降低我们的测试、部署和运维的成本。
这些可以独自完成某一方面业务功能,高度内聚,可以独立部署测试的模块,我们可以称之为Business Service,业务服务。它同样具有服务的特征,抽象、独立和稳定。一个会员系统内部的逻辑可能非常复杂(积分规则,分级规则,风险控制,行为数据),但是在其外部,会员的概念可以非常简单。

4.Util

Util,Util通常来说是我们找不到合适的名字的时候的选择,Util就是工具,在做项目的时候我们总会遇到一些奇奇怪怪的小功能或者重复的代码需要提取。像是URL编码或者解码(当然这个类库通常会提供,不过就以 .NET Framework 为例,提供这个方法的类型名称叫做HttpUtility),或是自创的加密签名算法等等。

5.Model

Model,模型,通常来讲,我们会把模型和另一个东西放在一起来说:View,视图。

模型通常认为是视图的内核,何谓之视图?我们正在与之交互的知乎网站的界面就是视图,而模型是指他的内核:数据。

知乎的数据是问题和答案,问题分为标题和描述,答案有内容和作者以及各种状态。知乎有很多个UI,例如移动页面,普通PC页面,手机APP,以及改版前的旧界面,这些被称作不同的视图。而所有这些形态迥异的视图,其内核都是一样的,这个内核我们就称之为模型(Model)。

将Model和View的概念拆分开来,有助于我们关注不同的方面,也可以更有效的分工。有些工程师更关注于内核也就是模型,通常来说,他们被称之为后端工程师。有些工程师更关注于用户界面的交互和展示,通常来说,他们被称之为前端工程师。

原文链接:
https://www.zhihu.com/question/58410621/answer/157049250

代码结构中Dao,Service,Controller,Util,Model是什么意思相关推荐

  1. 代码结构中Dao,Service,Controller,Util,Model是什么意思,为什么划分?

    很多刚入行的小白都不太清楚代码结构中Dao,Service,Controller,Util,Model是什么意思,为什么划分?今天我们一起来详细了解一下!本文内容较为简单,只是通俗化的讲解一些简单的概 ...

  2. 代码结构中 Dao,Service,Controller,Util,Model 是什么意思,为什么划分?

    欢迎关注方志朋的博客,回复"666"获面试宝典 适合受众:2年以下的初级程序员和0基础的门外汉 内容大纲: 1.为什么需要一个好的代码结构 2.什么样才是一个好的结构 3.每一个分 ...

  3. (转)代码结构中Dao,Service,Controller,Util,Model是什么意思?

    作者:技能树IT修真院 链接:https://www.zhihu.com/question/58410621/answer/623496434 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权 ...

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

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

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

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

  6. 代码结构中Dao,Service,Controller,Util,Model意思和划分

    名词解释吧: DAO = Data Access Object = 数据存取对象 Service = 服务 Controller = 控制器 Util = 工具 Model = 模型 首先,一个代码是 ...

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

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

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

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

  9. Dao,Service,Controller层作用

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

最新文章

  1. gcc/g++链接时.o文件及库的顺序问题
  2. c语言变量值与数组元素值交换,编写一个交换变量值的函数,利用该函数交换数组a和数组b中的对应元素值。要求尽量用指针的方法实现。数组a...
  3. 如何查看python是多少位的-请问一下该怎么查看python是32位还是64位?
  4. Leet Code OJ 283. Move Zeroes [Difficulty: Easy]
  5. 创建java取消module_IntelliJ IDEA 2020使用之模块新建删除导入!
  6. Maven plugin - maven-dependency-plugin
  7. JDBC Druid式link
  8. 老大爷的手法一看就不一般!
  9. 3青春痘长在哪里不害怕
  10. 仅用10个月!中国高中生拿下Kaggle Master,怎么做到的?
  11. numpy 删除元素
  12. Next.js 服务端渲染框架实战
  13. 记录MySql错误消息
  14. python调用hive与java调用区别_使用Pyhive调用
  15. RTX查找本地明文密码
  16. Intel Altera cyclone V HPS GIC
  17. 【Android】蓝牙开发——经典蓝牙:配对与解除配对 实现配对或连接时不弹出配对框
  18. 用户情感可视化分析——天池竞赛
  19. 【信息安全案例】——网络信息面临的安全威胁(学习笔记)
  20. js实现任意节日倒计时html

热门文章

  1. 自学前端需要达到什么水平才能找到工作?
  2. 手机吃鸡语音服务器异常是怎么回事,绝地求生语音卡怎么办_绝地求生新版本语音卡解决办法介绍_游戏吧...
  3. 如何利用小程序+插件快速开发app?
  4. Android-BlutoothBle,蓝牙中心设备(peripheral)向外围设备(GattServer)连续写入多个Characteristic的注意事项
  5. COGNOS8 Transformer使用IQD做为数据源时报 TR1008 错误
  6. VUE事件参数$event
  7. 数字化办公,就选流畅、清晰的华为云桌面
  8. IT-linux-top系列--top静态使用
  9. Power BI数据查询编辑
  10. mysql占用内存过高调优方法