8.8 change bidirectional association to unidirectional (将双向关联改为单向关联)
来源:互联网 发布:seo网站刷排名推广 编辑:程序博客网 时间:2024/06/13 11:14
两个类之间有双向关联,但其中一个类如今不再需要另一个类的特性。
动机:
双向关联很有用,但你必须为它付出代价,那就是维护双向连接。
大量的双向连接也很容易造成“僵尸对象”。
双向关联也迫使两个类之间有了依赖:对其中一个类的任何修改,都可能引发另一个类的变化。
做法:
找出保存“你想去除的指针”的字段,检查它的每一个用户,判断是否可以去除该指针。
=》不但要检查直接访问点,也要检查调用这些直接访问点的函数。
=》考虑有无可能不通过指针取得被引用对象,如果有可能,你就可以对取值函数使用substitute algorithm,从而让客户在没有指针的情况下也可以使用该取值函数。
=》对于使用该字段的所有函数,考虑将被引用对象作为参数传进去。
如果客户使用了取值函数,先运用self encapsulate field将待删除字段自我封装起来,然后使用substitute algorithm对付取值函数,令它不再使用该字段。
如果客户未使用取值函数,那就直接修改待删除字段的所有被引用点:改以其他途径获得该字段所保存的对象。
如果已经没有任何函数使用待删除字段,移除所有对该字段的更新逻辑,然后移除该字段。
旧代码
class Order...Customer getCustomer(){ return _customer;}void setCustomer(){ if(_customer != null) _customer.friendOrders().remove(this); _customer = arg; if(_customer != null) _customer.friendOrders().add(this);}private Customer _customer;class Customer...void addOrder(Order arg){ arg.setCustomer(this);}private Set _orders = new HashSet();Set friendOrders(){ return _orders;}
新代码
class Order...double getDiscountPrice(Customer customer){ return getGrossPrice() * (1 - customer.getDiscount());}class customer...double getPriceFor(Order order){ Assert.isTrue(_orders.contains(order)); return order.getdiscountedPrice(this);Customer getCustomer(){ Iterator iter = Customer.getInstances().iterator(); while(iter.hasNext()){ if(each.containsOrder(this)) return each; } return null;}}
- Change Unidirectional Association to Bidirectional(将单向关联改为双向)
- Change Bidirectional Association to Unidirectional(将双向关联改为单向)
- 8.8 change bidirectional association to unidirectional (将双向关联改为单向关联)
- 重新组织数据之七 :Change Unidirectional Association to Bidirectional(将单向关联改为双向)
- 重新组织数据之八 :Change Bidirectional Association to Unidirectional(将双向关联改为单向)
- 单向关联(Unidirectional association)
- ChangeUnidirectionalAssociationToBidirectional(将单向关联改为双向关联)
- Hibernate单向一对多关联(Unidirectional One-To-Many)要点
- 一对一单向双向关联
- Hibernate的单向关联和双向关联
- 什么时候用单向关联和双向关联
- 什么时候用单向关联和双向关联
- hibernate单向关联与双向关联
- 8.1.2 Hibernate:一对一双向关联(bidirectional)
- 8.1.1 Hibernate:一对一单向关联(unidirectional)
- 8.2 Hibernate:多对一单向关联(unidirectional)
- 8.3 Hibernate:一对多单向关联(unidirectional)
- Hibernate XML一对一主键关联 单向+双向
- yaffs2文件系统制作
- 三大UML建模工具Visio、Rational Rose、PowerDesign的区别
- My first jsp page!
- 在用installshield制作安装包时如何在注册表中写文件关联
- Difference Between CALL TRANSACTION and SESSION METHOD
- 8.8 change bidirectional association to unidirectional (将双向关联改为单向关联)
- 编程技术面试的五大要点
- 【引用】Oracle alter语句的用法
- AdvancedDataGrid的水印解决方法
- 修改shell终端提示信息
- Android 系统中隐藏文件或文件夹的方法
- 冒泡排序算法
- Ajax检测跨浏览器是否支持
- 关于信息技术在学校的应用思考