zoukankan      html  css  js  c++  java
  • 重构之 实体与引用 逻辑实体 逻辑存在的形式 可引用逻辑实体 不可引用逻辑实体 散弹式修改

    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抽取。
    都让我看到了唯一实体+引用来避免重复实体导致的散弹式修改。
    逻辑应该以什么形式存在? 可引用逻辑实体还是不可引用逻辑实体

  • 相关阅读:
    P1127
    CF274D
    BZOJ1477: 青蛙的约会
    BZOJ2770: YY的Treap
    2017-10-湖南套题2
    BZOJ——2697: 特技飞行
    洛谷——P1621 集合
    2017-10-湖南套题1
    项目包结构初始化
    Maven的pom文件配置
  • 原文地址:https://www.cnblogs.com/mozq/p/11042436.html
Copyright © 2011-2022 走看看