热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

重构之实体与引用逻辑实体逻辑存在的形式可引用逻辑实体不可引用逻辑实体散弹式修改...

mozq名词:实体引用逻辑实体可引用逻辑实体不可引用逻辑实体散弹式修改逻辑存在形式:不可引用逻辑实体或者可引用逻辑实体核心:某个逻辑应该以

mozq名词:实体 引用 逻辑实体 可引用逻辑实体 不可引用逻辑实体 散弹式修改逻辑存在形式:不可引用逻辑实体或者可引用逻辑实体核心:某个逻辑应该以什么形式存在呢?可引用逻辑实体(函数)还是不可引用逻辑实体(函数代码中)?
方案:1.为多次使用的逻辑提供可引用的逻辑实体。2.不是必须这么做,实际中可控的逻辑实体重复也是可接受的。3.但是当这种东西大量堆积时,就会导致程序腐败变质。防止逻辑实体重复大量堆积。实体重复的弊端:1.重复的实体增加了代码量,也增加了你需要理解的代码量。2.需要修改实体时,必须同时修改所有重复实体,并确保它们是一致的并且实际中需要修改的代码散步四处,你不但很难找到它们,也很容易忘记某个修改。(每个重复实体都将导致代码更多,更难理解,工作量增加,更容易出错,当它们堆积起来,就会导致腐败)
---------------------------------------------------------代码的坏味道:实体的故事:老板让你通知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



推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
author-avatar
eea1051113
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有