way-peng

导航

 

     去年学校开了一门《面向对象程序设计》课,没有好好听,现在搞项目开发的时候突然感到了这门课程的重要性了,也就只好翻开去年的资料,重新开始学习了,下面是我的总结,与大家分享一下。有不对的地方,希望大家给我指出来。

面向对象分析设计系列文章:

面向对象分析设计-------01基础

面向对象分析设计-------02UML

......


本文章的三大目标:

灯泡OO:建立对象的思维方式,对面向对象思想和理论有进一步的理解

灯泡UML:能够熟练地使用UML表达面向对象的设计思想

灯泡Model:运用对象技术的一般原则和模式进行应用系统的分析和设计建模

目录:

一、开篇亮剑:面向对象vs结构化

    1、从设计设计思想的角度比较

    2、(程序)实现角度比较

    3、从建模的角度

二、了解对象技术(Object Technology)

     定义

     特点

     Object Technology发展史

三、核心概念:对象与类

    1、对象

    2、类

    3、对象与类的关系

四、对象技术相关原则

    对象技术基本原则

    对象技术相关机制


一、开篇亮剑:面向对象vs结构化

1、从设计设计思想的角度比较

                      结构化                        面向对象

结构化思维用过程刻画数据间关系

对象思维直接用类表达数据间关系

结构化中,数据是死的,全部依赖算法操作

数据是活的,“她”知道自己的信息(属性),并能完成自己的工作(操作)

结构化思维更像是一个人在解决所有问题

对象思维更像是一个团队的分工协作

2、(程序)实现角度比较

             结构化               面向对象

数据结构+算法=程序设计

以对象为中心组织数据与操作

数据

对象属性

类型与变量

类与对象实例

函数(过程)调用

消息传递

类型与子类型

一般类与特殊类,继承

构造类型

整体-部分结构,聚合

指针

关联

3、从建模的角度

 

传统结构化方法

面向对象方法(UML)

需求模型

输入I、处理P、输出O的视角。

面向功能的文档(用户需求规格说明书)需求变化,其功能变化,所以系统的基础不稳固

从用户和整体角度出发。

使用系统抽象出用例图、活动图,获取需求;如需求变化,对象的性质相对功能稳定,系统基础稳定

分析模型

面向过程的数据流图DFD、 实体—关系图ERD、数据字典DD表示分析模型

功能分解,数据和功能/过程分开

把问题作为一组相互作用的实体,显式表示实体间的关系

数据模型和功能模型,状态、顺序、通信、活动图细化说明一致

类、对象图表示分析模型

设计模型

功能模块(SC图),模块之间的连接/调用是模块的附属形式

类和对象实现, 类/对象的关联、聚集、继承等连接、连接规范和约束作为显式定义

实施模型

体系结构设计

构件图,部署图

测试模型

根据文档进行单元测试,集成测试,确认测试

单元测试采用类图,集成测试用实现图和交互图,确认测试采用用例图

 

二、了解对象技术(Object Technology)

定义:A set of principles (abstraction, encapsulation, polymorphism, ..) guiding software construction, together with languages, databases, and other tools that support those principles.

特点:

1、模拟

可以顺应人类思维习惯,让软件开发人员在解空间中直接模拟问题空间中的对象及其行为。

面向对象实例表示:

东北人都是活雷锋

老张开车去东北…… 撞啦!

class 人 {

Region 籍贯;

}

class Region {

}

interface 雷锋 {

helpPeople(){ }

}

class 东北人 extends 人 implements 雷锋 {

籍贯 = 东北;

helpPeople(){ }

}

class Car{

DriveTo(Region) throws Exception (撞车){}

人 Driver;

}

Main Program {

人 老张;

Car 夏利;

夏利.Driver = 老张;

try {

夏利.DriveTo(东北);

}

catch (Exception) { }

}

2、稳定

较小的需求变化才不会导致系统结构大的改变。

image

所以,可以把交不稳定的数据和功能用较稳定的类包起来,是的设计更加健壮。

3、复用

代码重用:类库、框架等重用机制

通过继承、关联、封装等手段

 

Object Technology发展史

image

 

三、核心概念:对象与类

1、对象

定义:

An object is an entity with a well-defined boundary and identity that encapsulates state and behavior.

State is represented by attributes and relationships.

Behavior is represented by operations, methods, and state machines.

星星每一个对象都有一个唯一的标识, 即使其状态有可能与其它对象一样

星星一个对象的状态是它反映于现实世界的一系列属性

星星对象的行为定义当其它对象发出请求时,该对象如何反应

在UML中的表示形式:

An object is represented as a rectangle with an underlined name.

image

2、类

定义:

A class is a description of a set of objects that share the same attributes, operations, relationships, and semantics.

An object is an instance of a class.

image

在UML中的表现形式:

A class is represented using a rectangle with compartments.

image

3、类和对象的关系

image

星星类是生成对象的模板:类的定义中包含有产生和删除对象的操作。

星星每一个对象都是某一个类的实例。

星星每一个类在某一时刻都有零个或更多的实体

星星类是静态的;它们的存在、语义和关系在执行前就已经定义好了

星星对象是动态的;它们在程序执行时可以被创建和删除

 

四、对象技术相关原则

对象技术基本原则:

抽象(Abstraction) image
封装(Encapsulation) 为了保持数据一致性

struct ShippingAddress {

long cityCode;

String address;

}

改成

class ShippingAddress {

private long cityCode;

private string address;

public long ModifyAddress(String address)

}

模块(Modularity)

Breaks up something complex into manageable pieces

image
层次(Hierarchy) image

对象技术相关机制:

泛化(Generalization)

A relationship among classes where one class shares the structure and/or behavior of one or more classes.

什么是继承

A subclass inherits its parent’s attributes, operations, and relationships .

imageimage

 

单一继承                                                            多重继承

imageimage

多态(Polymorphism)

The ability to hide many different implementations behind a single interface.

image

class abstract Shape {

public abstract void draw();

}

class Rectangle extends Shape {

// 覆盖(override)基类方法

public void draw() { ...
/* 绘制矩形 */ }

}

class Circle extends Shape {

// 覆盖(override)基类方法

public void draw() { …
/* 绘制圆形 */ }

}

应用:1、假设我们有一个数组sharr,里面放着一排Shape,但是不知道哪些是Rectangle,哪些是Circle。利用多态性,我们可以:

for (int i = 0; i < sharr.length; ++i) {

Shape shape = (Shape)sharr[i];

shape.draw();

}

2、遍历整个数组的过程中,各个Shape自己知道应当如何在画布上绘制自己。shape.draw()这同一行代码在shape指向不同的对象时表现出不同的行为,这就是所谓多态性。

posted on 2012-06-10 22:36  way-peng  阅读(3783)  评论(4编辑  收藏  举报