重构之 实体与引用 逻辑实体 逻辑存在的形式 可引用逻辑实体 不可引用逻辑实体 散弹式修改
时间:2019-06-17
本文章向大家介绍重构之 实体与引用 逻辑实体 逻辑存在的形式 可引用逻辑实体 不可引用逻辑实体 散弹式修改,主要包括重构之 实体与引用 逻辑实体 逻辑存在的形式 可引用逻辑实体 不可引用逻辑实体 散弹式修改使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
mozq 名词: 实体 引用 逻辑实体 可引用逻辑实体 不可引用逻辑实体 散弹式修改 逻辑存在形式:不可引用逻辑实体或者可引用逻辑实体 核心: 某个逻辑应该以什么形式存在呢?可引用逻辑实体(函数)还是不可引用逻辑实体(函数代码中)? 方案: 1.为多次使用的逻辑提供可引用的逻辑实体。 2.不是必须这么做,实际中可控的逻辑实体重复也是可接受的。 3.但是当这种东西大量堆积时,就会导致程序腐败变质。防止逻辑实体重复大量堆积。 --------------------------------------------------------- 代码的坏味道: 实体的故事: 老板让你通知6:00开会,你打电话挨个通知所有人,老板突然有事,晚上会议取消了。你又挨个通知了,结果你忘记把取消会议的消息告诉你的上级,然后就没有然后了。 另一种方式:你直接把6:00开会的消息发到群里,所有人都会立即得知这个消息。老板告诉你取消会议,你就在群里发了取消会议的消息。所有人都立即得知这个消息。 (假设:所有人都直接引用群里的消息) 实体与引用: 好味道:唯一实体+引用 坏味道:多个重复实体。 原则:唯一实体+引用来避免重复实体导致的散弹式修改 核心: 某个逻辑应该以什么形式存在呢?可引用逻辑实体(函数)还是不可引用逻辑实体(函数代码中)? 方案: 1.为多次使用的逻辑提供可引用的逻辑实体。 2.不是必须这么做,实际中可控的逻辑实体重复也是可接受的。 3.但是当这种东西大量堆积时,就会导致程序腐败变质。防止逻辑实体重复大量堆积。 多个重复实体的弊端:(因实体重复导致散弹式修改) 1.如果你产生了多个实体,那么当需要修改实体时,你必须保证同时修改所有的实体,并确保它们是一致的。 2.实际中,需要修改的实体散步四处,你不但很难找到它们,也很容易忘记某个修改。 1.重复之实体重复: 实体:某种东西。 逻辑实体:一些代码,代码描述的是逻辑,所以就把它们叫做逻辑实体。 可引用逻辑实体:函数由于可以被引用,所以函数体是可引用的逻辑实体。 不可引用逻辑实体:整个函数表示的逻辑中蕴含的一些逻辑,由于不可被引用,被称做不可引用逻辑。 函数越大:函数中蕴含的不可引用逻辑实体的数量就可能更多。不可引用逻辑实体的数量越多,发生逻辑实体重复的可能性就越大,就会更可能发生散弹式修改。 2.散弹式修改:(逻辑实体重复必将导致散弹式修改) 重构中的例子: 分析: 可引用逻辑实体: Customer.statement(租赁信息)->租赁字符串详单 蕴含的逻辑实体:(不可引用) 1.根据租赁项计算该项的金额 2.根据租赁项计算改项的积分 3.计算所有租赁项的总金额 4.计算所有租赁项的总积分 结论: 目前,这个方法还没有显示出什么问题。 变化发生了:需要提供将租赁信息打印成html形式的方法 分析: 可引用逻辑实体: Customer.htmlStatement(租赁信息)->租赁html详单 逻辑实体 生成htmlStatement的方法包含的逻辑: 1.根据租赁项计算该项的金额 2.根据租赁项计算改项的积分 3.计算所有租赁项的总金额 4.计算所有租赁项的总积分 这些逻辑直接编码还是建立可引用逻辑实体? 问题:(逻辑实体重复,导致散弹式修改) 1.直接编码(不为这些逻辑创建函数,它们就不可引用) 蕴含的逻辑实体:(不可引用) 1.根据租赁项计算该项的金额 (htmlStatement和statement都创造了这个逻辑的实体,逻辑实体重复,导致散弹式修改) 2.根据租赁项计算改项的积分 (htmlStatement和statement都创造了这个逻辑的实体,逻辑实体重复,导致散弹式修改) 3.计算所有租赁项的总金额 (htmlStatement和statement都创造了这个逻辑的实体,逻辑实体重复,导致散弹式修改) 4.计算所有租赁项的总积分 (htmlStatement和statement都创造了这个逻辑的实体,逻辑实体重复,导致散弹式修改) 方案:(为某个逻辑建立可引用逻辑实体,并在需要的地方进行引用) 2.建立可引用逻辑实体(为这些逻辑创建函数,它们就可引用) 1.根据租赁项计算该项的金额 amountFor(rental) (修改statement引用这个方法,htmlStatement也引用了这个方法) 2.根据租赁项计算改项的积分 pointFor(rental) (修改statement引用这个方法,htmlStatement也引用了这个方法) 3.计算所有租赁项的总金额 totalAmount() (修改statement引用这个方法,htmlStatement也引用了这个方法) 4.计算所有租赁项的总积分 totalPoint() (修改statement引用这个方法,htmlStatement也引用了这个方法) 更多的场景: 1.数据库冗余问题 2.spring配置文件中切点和切点的引用,mybatis中的sql抽取。 都让我看到了唯一实体+引用来避免重复实体导致的散弹式修改。
原文地址:https://www.cnblogs.com/mozq/p/11042436.html
- hdu----(1402)A * B Problem Plus(FFT模板)
- uva----(100)The 3n + 1 problem
- 程序员你为什么这么累[续]:编码习惯之接口定义
- Python-贝叶斯实战垃圾邮件过滤(大量数据)
- hdu------(3549)Flow Problem(最大流(水体))
- go语言实现http服务端与客户端
- hdu-----(1532)Drainage Ditches(最大流问题)
- LNMP无法删除.user.ini文件的解决方法
- HDU-----(4858)项目管理(模拟)
- hdu-----(4857)逃生(拓扑排序)
- HDU-----(1083)Courses(最大匹配)
- HDU----(3294)Girls' research(manacher)
- map
- hdu----(3068)最长回文(manacher)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用laravel和ajax实现整个页面无刷新的操作方法
- Laravel 读取 config 下的数据方法
- PHP实现数组根据某个字段进行水平合并,横向合并案例分析
- laravel框架上传图片实现实时预览功能
- PHP 多进程与信号中断实现多任务常驻内存管理实例方法
- Yii 框架控制器创建使用及控制器响应操作示例
- laravel-admin 实现给grid的列添加行数序号的方法
- Laravel 自动生成验证的实例讲解:login / logout
- 关于Laravel-admin的基础用法总结和自定义model详解
- 解决Laravel5.2 Auth认证退出失效的问题
- php输出文字乱码的解决方法
- laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
- laravel 5.3 单用户登录简单实现方法
- Thinkphp5.0 框架的请求方式与响应方式分析
- Yii框架视图、视图布局、视图数据块操作示例