精通面向对象分析与设计的秘诀

标签: 面向对象 分析 设计 | 发表时间:2013-12-15 19:33 | 作者:asdf314159265
出处:http://www.iteye.com
面向对象设计

精通面向对象分析与设计的秘诀
面向对象设计的一个重要经验:
谁拥有数据,谁就对外提供操作这些数据的方法,
谁具有这项属性,谁就提供操作这些属性的方法。
经典案例分析:
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);
}
}
领悟一:
分析的时候不要太死板,“谁拥有此属性,谁就拥有操作此属性的方法”,这条经验适用于很多情况,这也是我们分析时首先要考虑的,而当此项原则解决不了问题的时候,我们就要想想别的办法。我们必须明确,不管怎样分析,其终极目标是,把客观事物抽象成能用尽量简洁精巧高效率的代码表示的形式,切记!

领悟二:
有些项目假如我们没有经验的话根本是做不出来的,根本不可能迅速想到怎样实现,得完全依赖于灵感。有的项目就算你有经验也得依赖于灵感才能做出来。但有一点毫无疑问,经验越多,积累越多,往往有效灵感的产生也会越多越快。所以,不管怎样,我们都要注意经验的积累。而积累经验的一个有效途径便是大量的阅读理解借鉴别人已做成的项目,阅读别人的源代码,借鉴别人的优秀思想。




已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [面向对象 分析 设计] 推荐:

精通面向对象分析与设计的秘诀

- - 移动开发 - ITeye博客
精通面向对象分析与设计的秘诀. 面向对象设计的一个重要经验:. 谁拥有数据,谁就对外提供操作这些数据的方法,. 谁具有这项属性,谁就提供操作这些属性的方法. 这个案例有三个对象:Person,Blackboard,Circle. 有一个动作画圆,画圆这个动作可以封装成一个方法draw(),那么,这个draw()方法应该封装在那个类中呢.

面向对象设计的设计原则

- - 博客园_知识库
  在设计面向对象的程序的时,模式不是一定要套的,但是有一些原则最好是遵守. 这些原则已知的有七个,包括:开闭原则、里氏代换原则、依赖倒转原则、合成/聚合复用原则、迪米特法则、接口隔离原则,单一职责原则. Martin引入了SOLID的说法,包括了其中的五个原则. 另外两个,这里把他们算成额外的两个规则.

面向对象设计模式的核心法则

- tonytech - Michael`s blog
有本经典的书叫《设计模式》,讲了经典的21种设计模式,建议大家都看看. 就一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力. 这种耦合会导致脆弱的设计,当变化发生时,设计会遭到意想不到的破坏. 软件设计真正要做的许多内容,就是发现职责并把那些职责互相分离.

面向对象设计原则:不要STUPID,坚持GRASP和SOLID

- - CSDN博客架构设计推荐文章
不要STUPID,坚持GRASP和SOLID. 有人可能会说:这是描述设计原则的一个专业术语,由我们可爱的代码整洁之道传教者鲍勃(罗伯特C. 马丁)大叔提出,是一组用于指导我们如何写出“好代码”的原则. 在编程界充满了这样由单词首字母组成的缩略词. 其它类似的例子还有DRY(Don’t Repeat Yourself.

JavaScript 游戏中的面向对象的设计

- - 博客 - 伯乐在线
来源: IBM developerworks. 简介: 从程序角度考虑,许多 JavaScript 都基于循环和大量的 if/else 语句. 在本文中,我们可了解一种更聪明的做法 — 在 JavaScript 游戏中使用面向对象来设计. 本文将概述原型继承和使用 JavaScript 实现基本的面向对象的编程 (OOP).

面向对象设计原则和创建SOLID应用的5个方法

- - ImportNew
最近我听到了很多关于函数式编程(FP),受之启发我觉得也应该关注面向对象编程(OOP)和面向对象设计(OOD),因为在设计系统时这些仍然非常重要. 我们将以SOLID原则为起点开始我们的旅程. SOLID原则是类级别的,面向对象的设计理念,它们与测试工具一起帮你改进腐坏的代码. SOLID由程序员们最喜欢的大叔 Robert C.

Java程序员应了解的10个面向对象设计原则

- - ITeye博客
众所周知,Java编程最基本的原则就是要追求高内聚和低耦合的解决方案和代码模块设计. 查看Apache和Sun的开放源代码能帮助你发现其他Java设计原则在这些代码中的实际运用. Java Development Kit则遵循以下模式:BorderFactory类中的工厂模式、Runtime类中的单件模式.

面向对象的Shell脚本

- jejer - 酷壳 - CoolShell.cn
还记得以前那个用算素数的正则表达式吗. 编程这个世界太有趣了,总是能看到一些即别出心裁的东西. 你有没有想过在写Shell脚本的时候可以把你的变量和函数放到一个类中. 不要以为这不可能,这不,我在网上又看到了一个把Shell脚本整成面向对象的东西. Shell本来是不支持的,需要自己做点东西,能搞出这个事事的人真的是hacker啊.

拥抱原型面向对象编程

- - 博客 - 伯乐在线
来源: IBM DeveloperWorks. 简介: JavaScript 是最低级的 Web 编程接口,随处可见. 随着 Web 日益成为日常生活的一部分,JavaScript 也开始变得备受关注. JavaScript 是一个经常遭到误解的语言,被认为是一种玩具语言或者一种 “不成熟的 Java™ 语言”.

如此理解面向对象编程

- - 酷壳 - CoolShell.cn
从Rob Pike 的 Google+上的一个推看到了一篇叫《 Understanding Object Oriented Programming》的文章,我先把这篇文章简述一下,然后再说说老牌黑客Rob Pike的评论. 先看这篇教程是怎么来讲述OOP的. 它先给了下面这个问题,这个问题需要输出一段关于操作系统的文字:假设Unix很不错,Windows很差.