面向对象设计
精通面向对象分析与设计的秘诀
面向对象设计的一个重要经验:
谁拥有数据,谁就对外提供操作这些数据的方法,
谁具有这项属性,谁就提供操作这些属性的方法。
经典案例分析:
1、人在黑板上画圆
这个案例有三个对象:Person,Blackboard,Circle
有一个动作画圆,画圆这个动作可以封装成一个方法draw(),那么,这个draw()方法应该封装在那个类中呢?我们知道,要画圆就必须知道圆心和半径,也就是draw()方法需要使用圆心(x,y)和半径radius这两个属性,而这两个属性正是圆的两个属性,所以方法draw()就应该封装在圆Circle类里面。
draw() {
(x,y)、radius
}
2、列车司机刹车
首先我们要知道车子本身就有与刹车有关的一些特性,假如车子没有刹车相关的属性,比如离合器之类的等等,那么车子不可能被刹下来。我们总不能说刹石头,刹房子吧。因为石头,房子本身就没有与刹相关的属性如离合器、轮子之类的等等。所以刹车这个方法就应该封装在车子这个类里面,列车司机只是调用了车子的刹方法。
3、我关门
类似刹车,门本身就有比如旋转轴等与关相关的属性,所以关这个方法就应该封装在门这个类里面,我只是调用了门的关方法。逆向思维,假如我们把关封装在“我”类里面,那我就可以调用“关”的方法去关任何与我有关的东西,这显然不合理。
4、售货员统计票据金额
这个案例与前面类似,首先是票据上有金额数据,所以统计金额这个方法就应该封装在票据这个对象上,售货员只是调用了票据的统计金额的方法。
5、“两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子”
有哪些显式对象:Stone、Stoneknife、Tree、Material、Chair
两块石头-->一把石刀 ==> 从这里我们就应该想到两块石头应该作为参数传进去,返回的结果是石刀,所以还需要一个用石头作原料制作石刀的类,这里是KnifeFactory,它提供一个方法createKnife(Stone first, Stone second)返回结果是StoneKnife。
石刀把树看成木材 ==> 这里我们应该想到StoneKnife需要提供一个方法cut(Tree)返回值是Material
木材-->椅子 ==> 需要额外增加个椅子工厂类ChairFactory提供制作椅子的方法makeChair(Material)返回结果是Chair
Stone
KnifeFactory
StoneKnife = KnifeFactory.createKnife(Stone first, Stone second)
Tree
Material = StoneKinfe.cut(Tree)
ChairFactory
Chair = ChairFactory.makeChair(Material)
6、“小球从绳子的一端移动到另一端”
有两个对象绳子Rope和球Ball,一个必须有的方法move()
示意代码:
class Rope {
private Point start;
private Point end;
public Rope(Point start, Point end) {
this.start = start;
this.end = end;
}
public Point nextPoint(Point currentPoint) {
return null;
}
}
class Ball {
private Rope rope;
private Point currentPoint;
public Ball(Rope rope, Point startPoint) {
this.rope = rope;
currentPoint = startPoint;
}
public void move() {
currentPoint = rope.nextPoint(currentPoint);
System.out.println("小球移动到了" + currentPoint);
}
}
领悟一:
分析的时候不要太死板,“谁拥有此属性,谁就拥有操作此属性的方法”,这条经验适用于很多情况,这也是我们分析时首先要考虑的,而当此项原则解决不了问题的时候,我们就要想想别的办法。我们必须明确,不管怎样分析,其终极目标是,把客观事物抽象成能用尽量简洁精巧高效率的代码表示的形式,切记!
领悟二:
有些项目假如我们没有经验的话根本是做不出来的,根本不可能迅速想到怎样实现,得完全依赖于灵感。有的项目就算你有经验也得依赖于灵感才能做出来。但有一点毫无疑问,经验越多,积累越多,往往有效灵感的产生也会越多越快。所以,不管怎样,我们都要注意经验的积累。而积累经验的一个有效途径便是大量的阅读理解借鉴别人已做成的项目,阅读别人的源代码,借鉴别人的优秀思想。
分享到:
相关推荐
张孝祥-7K月薪面试题破解之一_精通面向对象的分析和设计之秘诀
详细的讲述面向对象分析设计与方法 北航老师的精品课程
学习编程的秘诀是:编程,编程,再编程 1.1 程序设计语言的发展 1.2 面向对象的方法 1.3 面向对象的软件开发
全书共分9章,包括应用程序的基础生成技巧、面向对象程序设计、程序开发技巧、泛型、用户界面的设计与开发、控件的设计技巧、列表类型控件的设计技巧、人机界面的设计技巧以及工具栏、菜单及状态列等内容。...
全书共分9章,包括应用程序的基础建置技巧、面向对象程序设计简介、一般性的程序开发技巧、泛型、探讨重要的人机界面的设计技巧以及工具栏、内容菜单及状态栏等内容。书中包含有大量范例,可作为专业编程人员的参考...
VISUAL C# 2005程序开发与界面设计秘诀,网上找了很久,分001,002和003三个部分,用360解压软件解压
EMC设计秘籍EMC设计秘籍EMC设计秘籍EMC设计秘籍EMC设计秘籍EMC设计秘籍电子产品设计工程师必备手册
EMC培训教程-EMI-EMC设计秘籍 目 录 一、EMC 工程师必须具备的八大技能 二、EMC 常用元件 三、EMI/EMC 设计经典 85 问 四、EMC 专用名词大全 五、产品内部的 EMC 设计技巧 六、电磁干扰的屏蔽方法 七、...
全书共分9章,包括应用程序的基础生成技巧、面向对象程序设计、程序开发技巧、泛型、用户界面的设计与开发、控件的设计技巧、列表类型控件的设计技巧、人机界面的设计技巧以及工具栏、菜单及状态列等内容。...
Visual C#2005程序开发与界面设计秘诀.doc
PCB设计秘籍按PCB布局布线、散热技巧、接地指导、抗扰度等角度进行分类整理,针对在各种器件、应用环境下,提供了一些实用的PCB设计指导以及常见问题解答
EMC资料EMC设计秘籍培训资料EMC设计技巧最全面的EMC设计经验文档36个合集: A)电磁兼容测试与对策技术研讨会(2006年10月27日,深圳).pdf B)强制性产品认证与产品的电磁兼容性能测试(93页).pdf C)电快速瞬变脉冲群...
次为章力民Visual C# 2005 程序开发与界面设计秘诀中的部分程序可以结合数据库来参考,完整版望大家买书
Visual C# 2005 程序开发与界面设计秘诀 <br/>
vs c#2005程序开发与界面设计秘诀一书第九章的源码,有兴趣的下载,看看。
VISUAL C# 2005程序开发与界面设计秘诀.zip.002,网上找了很久,分001,002和003三个部分,用360解压软件解压
ADI智库整合了ADI官网上以往有关PCB设计的技术资料,形成了一本长达100页的《PCB设计秘籍》工具书,以上问题均可在该工具书里找到答案哦~ 首套ADI智库出品的工具书,关注公众号就可以免费获取,上传到CSDN分享给...
VISUAL C# 2005程序开发与界面设计秘诀.zip.002,网上找了很久,分001,002和003三个部分,用360解压软件解压
全书共分9章,包括应用程序的基础建置技巧、面向对象程序设计简介、一般性的程序开发技巧、泛型、探讨重要的人机界面的设计技巧以及工具栏、内容菜单及状态栏等内容。书中包含有大量范例,可作为专业编程人员的参考...
射频电路设计射频天线设计RF电路无线电路设计资料大全50个合集: 01.电子测量概述.pdf 02.混合信号测量.pdf 03.射频测试原理.pdf 04.射频时域测试原理.pdf 05.示波测试原理.pdf 06.频谱分析原理.pdf 0621射频板PCB...