面向对象那么好,为什么贫血模型如此流行?

2.面向对象那么好,为什么贫血模型如此流行?

2.1我们身边真的没有面向对象吗?

我们总是在强调我们的身边都是贫血模型,但是当我们仔细观察我们所引用的jar包时,我们会惊讶地发现,原来面向对象开发一直在我们身边。就拿Java开发者最熟悉的Sprin框架来说,其中充满着有血有肉的对象,这些对象在Spring的童话世界中相互协作,彼此调用构建出了一套功能复杂而完善的功能系统。
应该说正式良好的面向对象设计,让Spring在5个大版本的迭代过后还没有变成一个无法维护的焦油坑——当然些许的修改是在所难免的,因为没有人能够对未来做出预测。但是这种良好的面向对象的设计方式,让更多的修改变成了扩展,从而使代码的可维护性和扩展性大大增强。
用一句话来总结:我们身边充满了优秀的面向对象思想开发的优秀项目,它们也没有什么DDD的指导思想,而是纯粹的面向对象编程思想。

2.2我的代码为什么都是一堆get和set?

Java在国内的兴起与电商行业有着密不可分的关系,而这些电商行业都是基于WEB的应用,当我们进行WEB应用开发的时候,在早期就不可避免地用到所谓的SSH、SSM这种所谓的“三大框架”,到后期更是被SpringBoot一统江湖。在这些框架的“帮助”下,我们“省去”所有复杂逻辑的实现,只需要关注我们的业务代码。
而对于各种WEB应用来说,基本的业务逻辑就是接收数据和指令,然后按照指令对数据进行CRUD(增、删、该、查)操作。这种情况下数据,也就是对象本身就很难有什么“行为”,也就导致很难给对象设计什么行为。
拿一个添加商品的功能为例,那么基本上最初的功能就是根据输入字段新建一个商品的对象,然后设置个字段属性,然后调用ORM框架进行持久化。整个流程中都不会产什么对象行为。但是随着业务迭代,添加商品功能可能变的越来越复杂。比如需要判断商品是不是促销商品,如果是的话就设置优先展示。这时坏事情就发生了,由于在开始时,我们就在service中编写了如示例2-1所示的代码。

public class ProductService() {public void addProduct(ProductVO vo) {Product product = new Product();product.setName(vo.getName());if (vo.getType().equals("服装")) {product.setType(1);} else {product.setType(2);}repository.save(product);}
}

示例2-1
示例2-1中的完全把对象当成了一种数据容器,然后使用面向过程的编程方式来组织所有的逻辑实现。在这种简单的业务场景下,这种编码风格无可厚非。也就是说一堆面向对象开发的框架给我们隐藏了复杂的底层逻辑,而我们要处理的业务相当简单,那本面向过程开发也是完全合理的。
不过后来作为一个"懒惰"的程序员,自然而然就会在示例2-1的基础上进行修改,修改为示例2-2所示的代码。

public class ProductService() {public void addProduct(ProductVO vo) {Product product = new Product();product.setName(vo.getName());if (vo.getType().equals("服装")) {product.setType(1);} else {product.setType(2);}//设置促销商品优先展示if (vo.getPromotion().equals("是")) {product.setPromotion(1);} else {product.setPromoiton(0);}if (product.getPromotion() == 1) {product.setPreferToHomePage(1);}repository.save(product);}
}

示例2-2
随着口口相传,和不断迭代。这种在简单业务场景下遗留下来的风格就延续到了复杂的场景下。就算上面的方法越来越长,其中的if判断越来越多。程序员也懒得改了。这就形成了传说中的”屎山“。最后就会形成在屎山上拉屎的恶性循环。

总结

(1)面向对象距离我们并不遥远,我们使用的很多底层框架都是优秀的面向对象产物。
(2)在业务简单的初期使用面向过程加贫血模型进行编程并非有罪,只是在适当的时候要进行代码重构,适时地向面向对象进行靠拢来应对越来越复杂的业务逻辑和越来越大的代码量。然而往往开始使用面向过程后,由于人才和习惯等原因就会进行“屎山”堆积性开发,最后就会得到只要在线上能运行的代码就是好代码的结论。
(3)面向对象并不一定需要DDD,只要能够对系统进行合理的抽象和设计,完全可以构建一套自己的童话世界,让这些可爱的对象在这个童话世界里快乐生活。而这种抽象能力一般需要大佬级别的人物进行操刀,如果没有这样的人物带领,往往也难以迈出重构这一步。

最后DDD只是一种面向对象的实现“公式”和“方法论”,在面向业务领域设计时使用这套“公式”和“方法论”能够有效地降低进行面向对象系统设计的难度。也就是说DDD只是通往面向对象设计的道路之一。
后续的章节将通过各种前提来讨论如何规劝自己放弃DDD。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spfa_队列

spfa:1.当给定的图存在负权边时,Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了.2.我们约定有向加权图G不存在负权回路,即最短路径一定存在3.思路:用数组d记录每个结点的最短…

Tomcat配置解析

Tomcat文件配置 tomcat解压后目录 bin:可执行文件(startup.bat shutdown.bat) conf:配置文件(server.xml) lib:tomcat依赖的jar文件 log:日志文件(记录出错等信息) temp&…

教你配置安全的ProFTPD服务器(中)

二、 基本加固ProFTPD服务器步骤 1.升级版本 注:如果当前版本已经是最新版本,可以跳过第一步。 升级陈旧的ProFTPD版本,因为早期的ProFTPD版本存在的安全漏洞。对于一个新配置的ProFTPD服务器来说使用最新稳定版本是最明智的选择,…

前端动画 wow.js 效果

让花里胡哨的特效变简单 wow.js动画class介绍 引入css样式以及js插件 <link rel"stylesheet" type"text/css" href"./css/animate.min.css"><script src"./js/wow.min.js"></script><script> new WOW().init(…

Clob类型转换为String

SQL CLOB 是内置类型&#xff0c;它将字符大对象存储为数据库表某一行中的一个列值&#xff0c;使用CHAR来存储数据&#xff0c;如XML文档。 如下是一个Clob转换为String的静态方法&#xff0c;可将其放在自己常用的工具类中&#xff0c;想直接用的话&#xff0c;自己稍作修改即…

Java 将Word转为PDF、PNG、SVG、RTF、XPS、TXT、XML

同一文档在不同的编译或阅读环境中&#xff0c;需要使用特定的文档格式来打开&#xff0c;通常需要通过转换文档格式的方式来实现。下面将介绍在Java程序中如何来转换Word文档为其他几种常见文档格式&#xff0c;如PDF、图片png、svg、xps、rtf、txt、xml等。 使用工具&#xf…

CentOS7上GitLab的使用

生成SSH Keys 生成root账号的ssh key # ssh-keygen -t rsa -C "adminexample.com" 显示pub key的值 # cat ~/.ssh/id_rsa.pub 复制显示出来的 pub key 以root账号登陆gitlab&#xff0c;点击 "profile settings" 然后点击 "SSH Keys" 将复制的pu…

数据与计算机通信复习重点

数据与计算机通信讲义 第一次课 网络概论 自我介绍 主要承担网络方向课程教学&#xff1a;计算机网络、网络程序设计等 负责课程设计、工程实训等实践教学组织&#xff1a;程序设计基础实训、OS课设、程序设计综合实训 课程安排 课程性质 理论课46学时&#xff0c;限选、考试、…

数据库:除运算

除运算 设关系R除以关系S的结果为关系T&#xff0c;则T包含所有在R但不在S中的属性及其值&#xff0c;则T的原则与S的元组的所有组合都在R中。用象集来定义除法&#xff1a;给定关系R&#xff08;X&#xff0c;Y&#xff09;和S&#xff08;Y&#xff0c;Z&#xff09;。其中X&…

[图解tensorflow源码] 入门准备工作附常用的矩阵计算工具[转]

[图解tensorflow源码] 入门准备工作附常用的矩阵计算工具[转] Link: https://www.cnblogs.com/yao62995/p/5773142.html tensorflow使用了自动化构建工具bazel、脚本语言调用c或cpp的包裹工具swig、使用EIGEN作为矩阵处理工具、Nvidia-cuBLAS GPU加速计算库、结构化数据存储格式…

现共收到 5 个分组,其目的地址分别为: (1) 128.96.40.10 (2) 128.96.41.12 (3) 128.96.41.151 (4) 192.4.123.17 (5) 192.4.

计算目的地址的下一跳&#xff1a; 设某路由器建立了如表 1 所示路由表。现共收到 5 个分组&#xff0c;其目的地址分别为&#xff1a;(1) 128.96.40.10(2) 128.96.41.12(3) 128.96.41.151(4) 192.4.123.17(5) 192.4.123.90试分别计算下一跳解答&#xff1a; 用目的IP地址和路由…

衡量模块独立性的两个定性标准

衡量模块独立性的两个定性标准- 耦合&#xff1a;- 内聚内聚和耦合 模块的独立程度可以由两个定性标准衡量&#xff0c;这两个标准分别是内聚和耦合。 耦合衡量不同模块彼此间互相依赖&#xff08;连接&#xff09;的紧密程度&#xff1b;内聚衡量一个模块内部各个元素彼此结合…

【转】Docker学习_本地/容器文件互传(5)

1、查找所有容器 #docker ps a 2、找出我们想要的容器名字并查找容器长ID #docker inspect -f {{.ID}} python 3、拷贝本地文件到容器 docker cp 本地路径 容器长ID:容器路径docker cp /Users/xubowen/Desktop/auto-post-advance.py 38ef22f922704b32cf2650407e16b146bf61c221…

数据流图典型例题

数据流图典型例题 1.假设一家工厂的采购部每天需要一张订货报表&#xff0c;报表按零件编号排序&#xff0c;表中列出所有需要再次订货的零件。对于每个需要再次订货的零件应该列出下列数据&#xff1a;零件编号、零件名称、订货数量、目前价格、主要供应商、次要供应商。零件…

对称机密算法与非对称机密算法

1、对称加密算法&#xff0c; 加密和解密用的是同一个密钥&#xff0c;常见的为AES算法。缺点&#xff1a;秘钥才传输过程中可能被截取&#xff0c;存在安全问题&#xff0c; 2、非对称加密算法&#xff0c;常见的为RSA算法&#xff0c;它不是像对称机密的算法&#xff0c; 双方…

白盒测试的逻辑覆盖辨析(语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖)

白盒测试逻辑覆盖&#xff08;语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖&#xff09; 逻辑覆盖测试&#xff1a; 语句覆盖&#xff1a;每条语句至少执行一次判定覆盖&#xff1a;每一判定的每个分支至少执行一次条件覆盖&#xff1a;每一判定中的每个条件&…

03 CSS听课笔记

CSS&#xff1a;页面美化和布局控制 1. 概念&#xff1a; Cascading Style Sheets 层叠样式表层叠&#xff1a;多个样式可以作用在同一个html的元素上&#xff0c;同时生效 2. 好处&#xff1a;(1)功能强大(2)将内容展示和样式控制分离   * 降低耦合度。解耦   * 让分工协作…

安装MySQL时出现“服务没有响应控制功能。请键入 NET HELPMSG 2186 以获得更多的帮助。”的问题解决

安装MySQL时出现“服务没有响应控制功能”的问题解决第一步&#xff1a;设置环境变量第二步&#xff1a;初始化my.ini第三步&#xff1a;添加文件第一步&#xff1a;设置环境变量 安装MySQL时&#xff0c;运行“net start mysql”时出现“服务没有响应控制功能。请键入 NET HE…

vue-cli webpack 引入jquery

今天费了一下午的劲&#xff0c;终于在vue-cli 生成的工程中引入了jquery&#xff0c;记录一下。(模板用的webpack) 首先在package.json里的dependencies加入"jquery" : "^2.2.3"&#xff0c;然后install 在webpack.base.conf.js里加入 var webpack requi…

时间序列模型——ARIMA模型实现预测

ARIMA模型和因子预测 文章目录ARIMA模型和因子预测一、ARIMA模型&#xff08;整个周期&#xff09;1.数据预处理2.展示时序图2.数据建模&#xff08;1&#xff09;差分d&#xff08;2&#xff09;p和q&#xff08;3&#xff09;选择模型&#xff08;4&#xff09;检验残差序列&…