7.6 GRASP原则六: 多态 Polymorphism
GRASP原则六: 多态 Polymorphism
How to handle alternative behaviors based on type 如何处理依据类型不同而有 不同行为的一类需求 ?
比如,开餐馆
苏州人喜欢甜、四川人喜欢麻、湖南人喜欢辣,咋处理 ?
1.1 9条GRASP原则
Information Expert
responsibilities should be assigned to objects that contain relevant information
Creator
the creator of an object is usually an object that contains, or aggregates it
High Cohesion
responsibilities of a certain class must be highly related
Low Coupling
interdependency between classes should remain low
Controller
class which handles external system events
Polymorphism 多态原则
Indirection 间接原则
Pure Fabrication 纯虚构原则
Protected Variations 隔离变化
1.2 Iteration 2 More Requirement
第一次迭代结束时,完成了
当前软件功能测试:单元测试、用户可接受测试、负载测试、可使用性测试等
必须有客户加入,并给出反馈 Customers engaged in and feedback
把基线稳定下来,发布内部版本 stabilized baseline internal release
第二次迭代时,要考虑加入新的功能
需求变化、业务规则细化、考虑更多的用例
制定本次迭代的计划活动等
Ex, Monopoly game
When a player lands on the Go square, the player receives $200
When a player lands on the Go-To-Jail square, they move to the Jail square
When a player lands on the Income-Tax square, the player pays the minimum of $200 or 10%
of their worth
1.2 Iteration 2 More Requirement
例如POS系统,第二次迭代时增加另外的需求
支持多种第三方服务的接口 Support for variations in third-party external services
计算税费、信用卡授权认证等
复杂的定价机制 Complex pricing rules
可插拔的业务规则 Pluggable business rules
GUI窗口在信息发生变化时得到更新 GUI window updates when information changes
这些功能点,可能属于前轮迭代同样的用例,但更多的是讨论非功能性需求
这些需求对领域模型的影响较小
同样一项功能,原来一种处理方法就可以,现在需要适应多种处理方法,设 计方案该如何支持?
比如付费:现金、储蓄卡、信用卡、支付宝、微信
1.3 GRASP rule6: Polymorphism(多态)
Name: Polymorphism(多态)
Problem:
如何处理依据类型不同而有不同行为的一类需求?
How to handle alternative behaviors based on type?
How to create pluggable software components?
Solution:
使用多态操作为依据类型变化的行为 进行职责分配
When related alternatives or behaviors vary by type (class), assign responsibility for the
behavior using polymorphic operations to the types for which the behavior varies
Corollary(推论):
不要去测试对象的类型或者条件逻辑,并以此选择相应的行为
Do not test for the type of an object and use conditional logic to perform varying alternatives
based on type
即,不要使用条件逻辑,而是为不同的类定义相同名字的方法
That is, don’t use conditional logic, but assign the same name to services (methods) in
different classes
不同的类实现了相同的接口、或者有一个共同的父类(继承)The different classes usually
implement a common interface or are related in an implementation hierarchy with a
common superclass
7.6 GRASP原则六: 多态 Polymorphism的更多相关文章
- 7.9 GRASP原则九: 隔离变化
GRASP原则九: 隔离变化 Protected Variations 需求一定会变化的!如何做到以系统的局部变化为代价就可以应对这一点?4.1 GRASP rule9: Protected ...
- 7.1 通用的职责分配软件原则 GRASP原则一: 创建者 Creator
1.GRASP原则一: 创建者 Creator Who should be responsible for creating a new instance of some class 由谁来负责创 ...
- 运用GRASP原则来做uml交互类图-------pos机实例
重要的几个GRASP原则:1.控制器模式 2.创建者模式 (原则)3.信息专家模式(原则) 4. 高内聚 低耦合 这里所说的模式并不是java中针对具体的事件的设计模式 主成功场景的几个操作: ...
- 7.8 GRASP原则八: 间接 Indirection
GRASP原则八: 间接 Indirection 若两个对象直接连接,导致耦合太紧,如何解决?3.1 GRASP rule8: Indirection 间接 Name: Indirection ...
- 7.7 GRASP原则七: 纯虚构 Pure Fabrication
GRASP原则七: 纯虚构 Pure Fabrication 如果依据信息专家原则获得的解决方案不合适,既不想违反低耦合.高内聚,也不想违 反其他的原则, 该如何把职责分配给对象? 左右为难… ...
- 7.5 GRASP原则五:高内聚 High Cohesion
GRASP原则五:高内聚 High Cohesion How to keep objects focused, understandable and manageable, and as a si ...
- 7.4 GRASP原则四:控制器 Controller
4.GRASP原则四:控制器 Controller What first object beyond the UI layer receives and co-ordinates (control ...
- 7.3 GRASP原则三: 低耦合 Low Coupling
3.GRASP原则三: 低耦合 Low Coupling How to support low dependency, low change impact and increased reuse? ...
- 7.2 GRASP原则二:信息专家 Information Expert
2.GRASP原则二:信息专家 Information Expert What is a general principle of assigning responsibility to obje ...
随机推荐
- 在docker中使用mysql数据库,在局域网访问
1.获取mysql镜像 docker pull mysql:5.6 注意:此处之所以获取mysql5.6是因为mysql5.7在centos7中启动可能会报错 2.查看镜像列表 docker imag ...
- Spring中的事务操作
事务的特性 原子性:强调事务的不可分割. 一致性:事务的执行的前后数据的完整性保持一致. 隔离性:一个事务执行的过程中,不应该受到其他事务的干扰. 持久性:事务一旦结束,数据就持久化到数据库. 如果不 ...
- 保存退出vi编辑
保存命令按i进入编辑模式,编辑完成按ESC键 跳到命令模式,然后: :w 保存文件但不退出vi:w file 将修改另外保存到file中,不退出vi:w! 强制保存,不推出vi:wq 保存文件并退出v ...
- MySQL数据库基础备份
1.备份命令 格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --database 数据库名 > 文件名.sql mysqldump -h -uroot -ppasswor ...
- python常用函数及模块
原文来源于博客园和CSDN 1.计算函数 abs()--取绝对值 max()--取序列最大值,包括列表.元组 min()--取序列最小值 len()--取长度 divmod(a,b)---取a//b除 ...
- Kaggle初学者五步入门指南,七大诀窍助你享受竞赛
Kaggle 是一个流行的数据科学竞赛平台,已被谷歌收购,参阅<业界 | 谷歌云官方正式宣布收购数据科学社区 Kaggle>.作为一个竞赛平台,Kaggle 对于初学者来说可能有些难度.毕 ...
- 邮件发送 utils
package cn.itcast.bos.utils; import java.util.Properties; import javax.mail.Message; import java ...
- c#之如何操作excel
可使用EPPlus类库,下载地址如下: http://epplus.codeplex.com/ 也可以在这里下载: https://files.cnblogs.com/files/jietian331 ...
- https://scrapingclub.com/exercise/basic_login/
遇到的问题:csrftoken cfduid 是在request.headers里面的,一直在找怎么在scrapy里get request.header,从scrapy shell ,then fet ...
- sparkStreaming 与fafka直接方式 进行消费者偏移量的保存如redis 里面 避免代码改变与节点重启后的数据丢失与序列化问题
import java.util import kafka.common.TopicAndPartition import kafka.message.MessageAndMetadata impor ...