面向对象设计
面向对象设计
设计中的SoC ·设计的本质是用黑箱及其接口描述系统 一每个部件通过其接口提供一些服务,其他部件 是这些服务的用户(客户) 客户只需了解服务的接口,而实现细节对客户 无关紧要 一服务组件只管提供服务的实现,不管客户如何 应用 Lu Chaojun,SJTU 2
Lu Chaojun, SJTU 2 设计中的SoC • 设计的本质是用黑箱及其接口描述系统. – 每个部件通过其接口提供一些服务,其他部件 是这些服务的用户(客户). – 客户只需了解服务的接口,而实现细节对客户 无关紧要. – 服务组件只管提供服务的实现,不管客户如何 应用
自项向下设计与OOD ·自顶向下设计: 一函数是黑箱 -客户只要知道函数接口即能使用之 一函数实现细节被封装在函数定义中. ● OOD: -黑箱是对象 -对象的能力由类定义. -类对外提供的接口即方法, 一方法的实现对外部客户是不重要的 Lu Chaojun,SJTU 3
Lu Chaojun, SJTU 3 自顶向下设计与OOD • 自顶向下设计: – 函数是黑箱. – 客户只要知道函数接口即能使用之. – 函数实现细节被封装在函数定义中. • OOD: – 黑箱是对象. – 对象的能力由类定义. – 类对外提供的接口即方法. – 方法的实现对外部客户是不重要的
OOD设计指南 OOD:对给定问题找出并定义一组有用的类的 过程. 一确定有用的对象 人考虑问题描述中的名词(事物) 人这些事物有什么行为 一确定实例变量 一确定接口 人考虑问题描述中的动词(对象行为) 一复杂方法的自顶向下逐步求精 -反复设计 一尝试其他途径 一力求简单 Lu Chaojun,SJTU 4
Lu Chaojun, SJTU 4 OOD设计指南 • OOD:对给定问题找出并定义一组有用的类的 过程. – 确定有用的对象 ©考虑问题描述中的名词(事物) ©这些事物有什么行为 – 确定实例变量 – 确定接口 ©考虑问题描述中的动词(对象行为) – 复杂方法的自顶向下逐步求精 – 反复设计 – 尝试其他途径 – 力求简单
编程实例:壁球 ·对象: 一球员:有技术水平数据 -一局比赛:输入两个球员,提供play0 -得分统计:统计比赛结果,提供update(,)printReport() 0 主程序核心代码: stats Simstats() for i in range(n): theGame RBallGame (probA,probB) theGame.play ( stats.update(theGame) o5 完整程序:objrball.py Lu Chaojun,SJTU 5
编程实例:壁球 • 对象: – 球员:有技术水平数据 – 一局比赛:输入两个球员,提供play() – 得分统计:统计比赛结果,提供update(), printReport() • 主程序核心代码: stats = SimStats() for i in range(n): theGame = RBallGame(probA,probB) theGame.play() stats.update(theGame) • 完整程序:objrball.py Lu Chaojun, SJTU 5
编程实例:壁球(续) ·设计一个类时会获得其他类的设计思路 -例如:实现SimStats的update(aGame)时,需要aGamel的 分数,由此想到RBallGame类应提供getScores?方法 又如:实现RBallGamel时,发现技术是属于球员而非比 赛的,因此应设计Player类 Player 各类间的关系可用图来表示 RBallGame prob: 0.6 playerA: score: 0 playerB: server: Player prob: 0.5 score: 0 Lu Chaojun,SJTU 6
Lu Chaojun, SJTU 6 编程实例:壁球(续) • 设计一个类时会获得其他类的设计思路 – 例如:实现SimStats的update(aGame)时,需要aGame的 分数,由此想到RBallGame类应提供getScores方法. – 又如:实现RBallGame时,发现技术是属于球员而非比 赛的,因此应设计Player类. • 各类间的关系可用图来表示
编程实例:Dice Poker 两对 $5 。游戏规则: 三同 $8 一对加三同 $12 -玩家开始时有$100 四同 $15 -每轮花$10进行游戏 顺子(1-5或2-6) $20 - 先投掷一手5个骰子. 五同 $30 一然后有两次机会重掷部分或全部骰子 一最后根据上表结帐 图形界面要求: 一显示余额 一玩家破产时自动终止,玩家也可选择退出 一提示程序状态及用户如何响应的信息 Lu Chaojun,SJTU 7
编程实例:Dice Poker • 游戏规则: – 玩家开始时有$100. – 每轮花$10进行游戏. – 先投掷一手5个骰子. – 然后有两次机会重掷部分或全部骰子. – 最后根据上表结帐. • 图形界面要求: – 显示余额 – 玩家破产时自动终止,玩家也可选择退出 – 提示程序状态及用户如何响应的信息 Lu Chaojun, SJTU 7 两对 $5 三同 $8 一对加三同 $12 四同 $15 顺子(1-5或2-6) $20 五同 $30
编程实例:Dice Poker(续) 0 模型-视图(nodel-view)设计方法:将复杂 程序分解为模型和用户界面. -模型是程序的核心,视图是模型状态的展现 一分开的好处:对同一模型,容易改变视图 -本例中: 人游戏模型:PokerApp类 人游戏界面:TextInterface.或GraphicsInterface类 Lu Chaojun,SJTU 8
编程实例:Dice Poker(续) • 模型-视图(model-view)设计方法:将复杂 程序分解为模型和用户界面. – 模型是程序的核心,视图是模型状态的展现. – 分开的好处:对同一模型,容易改变视图. – 本例中: ©游戏模型:PokerApp类 ©游戏界面:TextInterface或GraphicsInterface类 Lu Chaojun, SJTU 8
编程实例:Dice Poker(续) ·实现模型 -低层对象:类Dice 人构造器:初始化Dice对象集合体 人rollAll:对5个骰子赋随机值 人ol:对部分骰子赋随机值,其他不变 人values:返回骰子当前值 人score:返回骰子的得分(金额) -高层对象:PokerApp Lu Chaojun,SJTU 9
编程实例:Dice Poker(续) • 实现模型 – 低层对象:类Dice ©构造器:初始化Dice对象集合体 ©rollAll:对5个骰子赋随机值 ©roll:对部分骰子赋随机值,其他不变 ©values:返回骰子当前值 ©score:返回骰子的得分(金额) – 高层对象:PokerApp Lu Chaojun, SJTU 9
编程实例:Dice Poker(续) 实现界面 -文本界面:测试用 -GUI界面 Python Poker Parlor ● Dle 3 05 Roll Dice Scoro 590 回 Lu Chaojun,SJTU 10
编程实例:Dice Poker(续) • 实现界面 – 文本界面:测试用 – GUI界面 Lu Chaojun, SJTU 10