文档库 最新最全的文档下载
当前位置:文档库 › 面向对象的软件开发方法简介

面向对象的软件开发方法简介

面向对象的软件开发方法简介
面向对象的软件开发方法简介

1面向对象的软件开发方法简介

面向对象的开发方法把软件系统看成各种对象的集合,对象就是最小的子系统,一组相关的对象能够组合成更复杂的子系统。面向对象的开发方法具有以下优点。

●把软件系统看成是各种对象的集合,这更接近人类的思维方式。

●软件需求的变动往往是功能的变动,而功能的执行者——对象一般不会有大的变

换。这使得按照对象设计出来的系统结构比较稳定。

●对象包括属性(数据)和行为(方法),对象把数据和方法的具体实现方式一起封

装起来,这使得方法和与之相关的数据不再分离,提高了每个子系统的相对独立性,

从而提高了软件的可维护性。

●支持封装,抽象,继承和多态,提高了软件的可重用性,可维护性和可扩展性。

1.1 对象模型

在面向对象的分析和设计阶段,致力于建立模拟问题领域的对象模型。建立对象模型既包括自底向上的抽象过程,也包括自顶向下的分解过程。

1.自底向上的抽象

建立对象模型的第一步是从问题领域的陈述入手。分析需求的过程与对象模型的形成过程一致,开发人员与用户交谈是从用户熟悉的问题领域中的事物(具体实例)开始的,这就使用户和开发人员之间有了共同语言,使得开发人员能够彻底搞清用户需求,然后再建立正确的对象模型。开发人员需要进行以下自底向上的抽象思维。

●把问题领域中的事物抽象为具有特定属性和行为的对象。

●把具有相同属性和行为的对象抽象为类。

●若多个类之间存在一些共性(具有相同属性和行为),把这些共性抽象到父类中。

再自底向上的抽象过程中,为了使子类能更好的继承父类的属性和行为,可能需要自顶向下的修改,从而使整个类体系更加合理。由于这类体系的构造是从具体到抽象,再从抽象到具体,符合人们的思维规律,因此能够更快,更方便的完成任务。

2.自顶向下的分解

再建立对象模型的过程中,也包括自顶向下的分解。例如对于计算机系统,首先识别出主机对象,显示器对象,键盘对象和打印机对象等。接着对这些对象再进一步分解,例如主机对象有处理器对象,内存对象,硬盘对象和主板对象组成。系统的进一步分解因有具体的对象为依据,所以分解过程比较明确,而且也相对容易。因此面向对象建模也具有自顶向下开发方法的优点,既能有效的控制系统的复杂性,又能同时避免结构化开发方法中功能分解的困难和不确定性。

1.1.2UML:可视化建模语言

面向对象的分析与设计方法,在20世纪80年代末至90年代中发展到一个高潮。但是,诸多流派在思想和术语上有很多不同的提法,对术语和概念的运用也各不相同,统一是继续发展的必然趋势。需要有一种统一的符号来描述在软件分析和设计阶段勾画出来的对象模型,UML(Unified Modeling Language,统一建模语言)应运而生。UML是一种定义良好,易于表达,功能强大且普遍适用的可视化建模语言。而采用UML语言的可视化建模工具是Rational 公司开发的Rational Rose。

1.2 面向对象开发中的核心思想和概念

在面向对象的软件开发过程中,开发者的主要任务就是先建立模拟问题领域的对象模型,然后通过程序代码来实现对象模型,如何用程序代码来实现对象模型,并且保证软件系统的可重用性,可扩展性和可维护性呢?本节节主要阐述面向对象开发的核心思想和概念,这些核心思想为从事面向对象的软件开发实践提供理论武器。

1.2.1 问题领域,对象,属性,状态,行为,方法,实现

问题领域是指软件系统所模拟的真实世界中的系统。随着计算机技术的发展和普及,软件系统渗透社会的各个方面,几乎可用来模拟任何一种问题领域,如学校,医院,商场,银行和太阳系等。

对象是对问题领域中事物的抽象。对象具有以下特性:

1) 万物节杰皆为对象。问题领域中的实体和概念都可以抽象为对象。例如:在学校领域,对象包括学生,成绩单,教师,课程,和教室等;在商场领域,对象包括客户,商品,订单。发票,仓库和管理员等;在用Java 语言创建的图形用户界面中,窗口,滚动面板,按钮,列表,菜单,文本框等也是对象。

2) 每个对象都是唯一的。对象的唯一性来自于真实世界中事物的唯一性。世界上不存在两片一摸一样的叶子,因此在软件系统中用来模拟两片叶子的对

象也具有唯一性。

3)对象具有属性和行为。例如一部手机:牌子是诺基亚,价格

是2000元,银白色,能够拍照,打电话和收发短信等。这部手机的

属性包括品牌类型type ,价格price 和颜色color ,行为包括拍照

takePhoto(),打电话call(),发短信sendMessage()和收短信

receiveMessage()。

对象的行为包括具有的功能和具体的实现。在建立对象模型阶

段,仅仅关注对象有什么样的功能,而不需要考虑如何实现这些功

能。对象的属性用成员变量表示,对象的行为用成员方法表示。

图1-1是手机的UML 类图。

4)对象具有状态。状态是指某个瞬间对象的各个属性的取值。

对象的某些行为往往会改变对象自身的状态,即属性的取值。例

如:小王的本来体重为80kg ,经过减肥后,体重减到45kg ,参见图1-2.

5)对象都属于某个类,每个对象都是某一个类的实例。例如:演员小红,小白和小黄,他们都属于演员类。再例如中文和英文

都属于语言类。类是具有相同属性和行为的对象的集合。

同一个类的所有实例具有相同属性,表明他们的属性的含义

相同,但是他们的状态不一定相同,也就是属性取值不一定相同。

例如演员小红,小白和小黄,都有姓名,性别,年龄和体重这些属性,但他们的属性值不同。

同一个类的所有实例包括类本身的所有实例及其子类的所有实例。类的所有实例具有相同的行为,意味着他们具有一些相同的功能。类本身的所有实例按同样方式实现相同功能,而子类与父类之间,以及子类之间的实例则可能采用不同的方式来实现相同的功能。

1.2.2 类,类型

类是一组具有相同属性和行为的对象的抽象。类及类的关系构成了对象模型的主要内容如图1-3所示,对象模型用来模拟问题领域,Java 程序实现对象模型,Java 程序运行在Java 虚拟机提供的运行时环境中,Java 虚拟机运行在计算机上。

计算机受存储单元的限制,只能表示和操作一些基本的数据类型,比如整数,字符和浮点数。对象模型中的类可以看作是开发人员自定义的数据类型,Java 虚拟机的运行时环境封装了把自定义的数据类型映射到计算机的内置数据类型的过程,使得开发人员不受计算机的内置数据类型的限制,对任意一种问题领域,都可以方便地根据先识别对象,再进行分类(创建任意的数据类型)的思路来建立对象模型。

图1-1 手机的UML 类图

图1-2小王的减肥行为导致体重的下降

图1-3从对象模型中的类型到计算机的内置数据类型的映射

面向对象编程的主要任务就是定义对象模型中的各个类。例如一下是手机类的定义。

public class CellPhone {

private String type;

private String color;

private double price;

/**构造方法*/

public CellPhone(String type,String color,double color) {

this.type=type;

this.color=color;

this.price=price;

}

Public void takephoto() {……};

Public void call() {……};

Public void sengMessage() {……};

Public void receiveMessage() {……};

}

如何创建手机对象呢?Java语言采用new语句类创建对象,new语句会调用对象的构造方法。以下程序代码创建了两个手机对象,一个是诺基亚牌,银白色,价格为2000元,一个是摩托罗拉牌,蓝色,价格为1999元的。

Cellphone phone1=new CellPhone (“诺基亚”,“Silvery”,2000);

Cellphone phone2=new CellPhone (“摩托罗拉”,“blue”,1999);

在运行时环境中,Java虚拟机首先把CellPhone类的代码加载到内存中,然后根据这个模板来创建两个CellPhone对象;所以说,对象是类的实例,类是对象的模板。

1.2.3 消息,服务

软件系统的复杂功能是由各种对象的协同工作共同完成的。例如,电视机和遥控器之间存在着这种协作关系。当用户按下遥控器的“开机”按钮后,遥控机对象对电视对象发送一个“开机”消息。电视机对象接受到这个“开机”消息后,就执行相应的操作。

每个对象都具有特定的功能,相对于其他对象而言,它的功能就是为其它对象提供服务。例如电视机具有的功能包括:开机,关机,选择频道,调节音量等。遥控器为了获得电视机的服务,需要向提出获得特定服务的请求,提出请求的过程被成为发送信息。

对象提供的服务是由对象的方法来实现的,因此发送信息也就是调用一个对象的方法。例如遥控器向电视机发送“开机”消息,意味着遥控器对象调用电视机对象的开机方法。

从使用者的角度出发,整个软件系统就是一个服务提供者。在UML 语言中,系统边界被称为角色。在系统的内部,每一个子系统也是服务的提供者,他们为其他子系统提供服务,子系统之间通过发送消息来相互获得服务,一个孤立的不对外提供任何服务的系统是没有任何的意义的。

对于电视机系统,看电视的观众就是它的系统边界。电视机系统是观众的服务提供者,电视机系统内的电视机对象是遥控器对象的服务提供者。图1-4显示了观众打开电视的UML 时序图。

1.2.4 接口

既然每个对象都是服务的提供者,如何对外提供服务呢?对象通过接口对外提供服务。例如电视机的红外线接收器就是为遥控器提供的接口。

在现实世界中,接口也是实体,比如电源插口,洗衣机上的按钮和电灯的开关。而在面向对象范畴中,接口是一个抽象的概念,

是指系统对外提供的所有服务。系统的接口描述

系统能够提供哪些服务,但是不包含服务的实现细节。这里的

系统既可以指整个软件系统,也可以指一个子系统。对象是最

小的子系统,每个对象都是服务的提供者,因此每个对象都有

接口。

站在使用者的角度,对象中所有向使用者公开的方法的声

明构成了对象的接口。使用者调用对象的公开方法来获得服

务。使用者在获得服务时,不必关心对象时如何实现服务的。 在设计对象模型阶段,系统的接口就确定下来了,例如在

手机CellPhone 类的UML 类图中,它的方法声明就是手机的

接口,参见图1-5

接口是提高系统之间松耦合的有力手段。例如电视机向遥控器公开了红外线接收器接图1-5 手机的接口 图1-4 观众打开电视机的UML 视图

口,使得电视机和遥控器之间相互独立,当电视机的内部实现发生变化时,比如由电子显示器改为液晶显示器,只要它的红外接收器接口不变,就不会影响遥控器的实现。

接口还提高了系统的可扩展性。例如台式计算机上预留了很多供扩展的插槽(接口),只要在主板上插上声卡,计算机就会增加播放声音的功能,只要插上网卡,计算机就会增加联网的功能。

在Java语言中,接口有两种意思:

一是指以上介绍的概念性的接口,即指系统对外提供的所有服务,在对象中表现为public类型的方法的声明。

二是指用interface关键字定义的实实在在的接口,也称为接口类型,它用于明确地描述系统对外提供地所有服务,它能够更加清晰地把系统地实现细节与接口分离。后面我们会对接口做详细地介绍。

1.2.5 封装,透明

封装是指隐藏对象地属性和实现细节,仅仅对外公开接口。封装能为软件系统带来以下优点。

1)正确,方便地理解和使用系统,防止使用者错误修改系统地属性。比如电视机系统,尽管它本身地实现很复杂,但用户使用起来却非常地简单,只要通过遥控器上地几个按钮就能享受电视机提供地服务。电视机的实现细节就被藏在它的大壳子里,没有必要向用户公开。

2)有助于建立各个系统之间的松耦合关系,提高系统地独立性。当某一个系统发生变化时,只要它地接口不变,就不会影响其他的系统。

3)提高软件的可重用性,每个系统都是一个相对独立的整体,可以在多种环境下得到重用。例如干电池就是一个可重用的独立系统,在相机,手电筒,电动剃须刀和玩具赛车中都能发挥作用。

4)降低了构建大型系统的风险,即使整个系统不成功,个别子系统有可能依然是有价值的。例如如果相机损坏了,它的干电池依然有用,可以安装到手电筒中。

一个设计良好的系统会封装所有的实现细节,把他的接口与实现清晰的隔离开来,系统之间只通过接口进行通信。面向对象的编程语言主要通过访问控制机制来进行封装,这种机制能控制对象的属性和方法的可访问性。在Java语言中提供了以下4种控制级别。

●public: 对外公开,访问级别最高。

●protected: 只对同一个包中的类或者子类公开。

●默认:只对同一个包中的类公开。

●Private: 不对外公开,只能在对象内部访问,访问级别最低。

灵活的运用4中访问级别就能有效的控制对象的封装程度。后面我们会对此做详细的介绍。

到底对象的那些属性和方法应该公开,那些应该隐藏呢?这必须具体问题具体分析。这里指提供封装的两个大致原则:

1:把尽可能多的东西隐藏起来,对外提供简洁的接口

系统的封装程度越高,它的相对独立性就越高使用起来就越方便。例如半自动洗衣机HalfAutoWasher和全自动洗衣机AutoWasher就是两个明显的例子。图1.6是他们的类图。

对比以上两个类图,可以看出全自动洗衣机封装了进水,排水和定时等洗衣服的细节,为使用者提供了更加简单易用的接口,所以全自动洗衣机洗衣服更方便。

2: 把所有的属性藏起来

假如某种属性允许外界访问,那么提供访问该属性的公开方法。例如电视机有个音量属性volume,这是允许使用者访问的。使用者通过setV olume()和getVolume()方法来访问这个属性。

为什么不把volume 属性定义为public 类型,让使用者直接访问呢?这样做有以下原因。

1) 更符合现实世界中外因通过内因起作用的客观规律。一个对象属性发生变化应该是外因和内因共同作用的结果。外因就是使用者向电视机对象发送信息,请求电视机对象调节到某个高度,即调用电视机对象的setVolme()方法;内因就是电视机对象本身的音量控制装置调节音量,即执行setV olume()方法。

2) 能够灵活地控制属性地读和修改地访问级别。对象地有些属性指允许使用者读,但不允许使用者修改,而只有对象内部才能修改,例如电表上显示的用电度数就是这样的属性,此时可以公开读方法,封装写方法。

3)防止使用这错误地修改属性。例如银行帐户Account 对象有一个口令属性password,当用户设置口令时,要求口令必须是六位数,在Account 对象地setPassword()方法中就很容易实现这段逻辑。

图1-6半自动洗衣机和全自动洗衣机的类图

private int volume; /**设置音量*/ public void setV olume(int volume) {

this.volume=volume;

}

/**查看当前音量*/

public int getV olume() {

return volume;

}

Public void setPassword(String password) { If(password==null || password.length() !=6) Throw new IllegalArgument Axception(“口令不合法”); else

this.password=password;

}

4)有助于对象封装实现细节。有时候,如果对象的一个属性发生变化,在他的内部就会发生一系列的连锁反应,但这些反映对使用者来说是透明的。例如计算器有一个内部属性scale表示数学进制。如果用户选择二进制,计算器就会把当前数字转化为二进制数;如果选择十六进制,计算器就会把当前数字转化为十六进制数。

与封装具有相同含义的一个概念就是透明。对象封装实现细节,也就意味着对象的实现细节对使用者来说是透明的。透明在这里应该理解为“看不见”。

1.2.6 抽象

抽象是从特定角度出发,从已存在的事务中抽取出我们所关注的特性,形成一个新的事物的思维过程。

抽象是一种由具体到抽象,由复杂到简洁的思维方式。如图1-17所示,在面向对象的开发过程中,抽象体现在以下方面。

图1-7在面向对象的开发过程中运用抽象思维

1:从问题领域中的事物到软件模型中对象的抽象

在建立对象模型时,分析问题领域的实体,把它抽象为对象。真实世界中的事物往往由多种多样的属性,应该根据事物所处的问题领域来抽象出具有特定属性的对象。比如一只小白兔,如果问题领域是菜市场,那么会关注它的体重和价格;如果问题领域是研究所,那么会关注它的年龄,性别和健康状况等。‘

从问题领域的事物到对象的抽象还意味着分析事物所具有的功能,在对象中定义这些功能的名称,但不必考虑如何实现它们。这种抽象过程使得设计阶段创建的对象模型仅仅用来描述系统应该做什么,而不必关心如何去做,从而清晰地划清软件设计与软件编码的界限。

2:从对象到类的抽象

在建立对象模型时,把具有相同属性和功能的对象抽象为类。比如某学校里有1000个学生,他们都属于学生类。

3:从子类到父类的抽象

当一些类之间具有相同属性和功能时,把这部分属性和功能抽象到一个父类中。从子类到父类的抽象有两种情况:

●不同子类之间具有相同功能时,并且功能的实现方式完全一样。例如自行车和三轮

车的父类为非机动车类。二者都有刹车功能,并且实现方式也一样。在这种情况下

把这个功能放在父类即非机动车类中实现。

●不同子类之间具有相同的功能,但功能的实现方式不一样。例如日光灯和电灯都能

照明,但实现方式不一样。在这种情况下,父类即照明设施类仅仅声明这种功能,

但不提供具体的实现。这种抽象方式与面向对象的多态性相结合,有助于提高系统

的松耦合性。

在Java语言中,抽象有两种意思:

●当抽象作为动词时,就是指上述的抽象思维过程。

●当抽象作为形容词时,可以用来修饰类和方法。若一个方法被abstract修饰,则表

明这个方法没有具体的实现:若一个类被abstract修饰,则表明这个类不能被实例

话。

1.2.7 继承,扩展,覆盖

在父类和子类之间同时存在者继承和扩展关系。子类继承了父类的属性和方法,同时,子类还可以扩展出新的属性和方法,并且还可以覆盖父类中方法的实现方式。覆盖也是专用术语,是指在子类中重新实现父类中的方法。

从每个对象都是服务提供者的角度来理解,子类会提供和父类相同的服务。此外,子类还可以提供父类所没有的服务,或者覆盖父类中服务的实现方式。

继承和扩展同时提高了系统的可重用性和可扩展性。例如,手机和计算机之所以能迅猛的更新换代,具备越来越多的功能,就是因为厂商在生产新型号的手机和计算机时,他们不必从头生产,而在原有手机和计算机的基础上进行升级。

继承和发展导致面向对象的软件开发领域中架构类软件系统的发展。从头构建一个复杂软件系统的工作量巨大,为提高开发效率,有一些组织开发了一些通用的软件架构。有了这些软件架构,新的软件系统就不必从头出发,只需要在这些通用软件架构的基础上进行扩展即可。

如何在这些通用软件架构的基础上进行扩展呢?这些通用软件架构中都提供了一些扩展点。更具体地说,这些扩展点就是专门让用户继承和扩展地类。这些类已经具备了一些功能,并且能和软件架构中其他地类紧密协作。用户只需创建这些类的子类,然后在子类中增加新功能活重新实现某些功能。用户自定义地子类能够和谐地融合到软件架构中,顺利地与软件架构中的其他类协作。

目前在Java领域比较流行的架构软件包括:J2EE,Struts,JSF和Spring。

1.2.8 组合

组合是一种用多个简单子系统来组装出复杂系统的有效手段。如图1-8所示,个人计算机系统就是一个典型的组合系统,它由主机(MainFrame),键盘(Keyboard),鼠标(Mouse),显示器(Screen)和外围设备打印机(Printer)等组成。而主机(MainFrame)由处理器(CPU),内存(RAM),一个和多个硬盘(HardDisk),显卡(GraphicsCard),声卡(SoundCard)和网卡(NetCard)等组成。

图1-8 计算机组合系统

面向对象的组合具有以下优点:

1)在软件的分析和设计阶段,简化为复杂系统建立对象模型的过程。

2)在软件的编程阶段,简化创建复杂系统的过程,只需要分别创建独立的子系统,然后将他们组合起来,就构成了一个复杂系统。而且允许第三方参与系统的建设,提高了构建复杂系统的效率。

3)向使用者隐藏系统的复杂性。

4)提高程序代码的可重用性,一个独立的子系统可以被组合到多个复杂系统中。 以下以台灯ReadingLamp 为例,介绍如何实现组合系统。如图1-8所示,台灯由灯泡Bulb 和电源线路Circuit 组成。

图1-10显示了显示了使用者开灯的UML 时序图

从图1-10可以看出,使用者开灯包含以下过程。

1)使用者打开台灯,即调用ReadingLamp 对象的on()方法。

2)台灯接通电源线路,即ReadingLamp 对象调用Circuit 对象的SwitchOn()方法。

3)电流通过灯泡,灯泡发光,即Circuit 对象调用Bulb 对象的light()方法。

4)灯泡从电源线路中获得电能,即Bulb 对象调用Circuit 对象的transportPower()方法。 1-2-9 多态,动态绑定

图1-9 台灯ReadingLamp 的组合系统

图1-10 使用者开灯的UML 时序图

。例如某些电动剃须Shaver 即允许使用干电池,也允许直接使用交流电。干电池Battery

和交流电源AcPower 都具有供电功能,

不防抽象出父类――电源类Power.

如图1-11所示,电动剃须刀是一

个包含电源子系统的组合系统。电源

类Power 是一个抽象类,它有一个抽

象方法providePower(),它是电源子系

统对外提供的接口。

在运行时环境中,如果Shaver 对

象的power 对象引用AcPower 对象,

Java 虚拟机就会调用AcPower 对象的providePower()方法;如果Shaver 对象中的power 变量引用Battery 对象,Java 虚拟机就会调用Battery 对象的providePower()方法。Java 的这种运作机制被称为动态绑定。

1.3 UML 语言简介

1997年。OMG 组织(Object Mangement Group ,对象管理组织)发布了统一建模语言(Unified Modeling Language ,UML ).UML 的目标之一就是为开发团队提供标准的通用的面向对象设计语言。UML 提供了一套IT 专业人员期盼多年的统一的标准建模符号。

UML 采用一些标准图形元素来直观的表示对象模型,所以它是一种可视化的建模语言。在这里主要介绍常见的UML 框图的用法。

● 用例图(Use Case Diagram ):从用户角度描述系统功能。

● 类框图(Class Diagram ):描述对象模型中类与类之间的关系。

● 时序图(Sequence Diagram )和协作图(Cooperation Diagram ):描述对象间的相互

关系。其中时序图显示对象之间的动态协作关系,它强调对象之间消息发送的时间顺序,同时显示对象之间的交互;协作图能直观地显示对象间的协作关系。这两种图合称为交互图。

● 状态转化图(State Transition Diagram ):描述对象所有可能的状态以及导致状态转

化的转移条件。

● 组件图(Component Diagram ):描述系统中各个软件组件之间的依赖关系,还可以

描述软件组件的源代码的组织结构。

● 部署图(Deployment Diagram )定义系统中软硬件的物理体系结构。它可以显示实

际的计算机和设备,以及它们之间的连接关系,在节点中还可以软件组件在硬件环境中的布局。

在以上框图中,其中用例图,类框图,组件图,和部署图,构成了系统的静态模型;而状态转化图,时序图和协作图则构成了系统的动态模型。

1.3.1 用例图

用例图描述了系统提供的功能。用例图的主要目的是帮助团队以一种可视化的方式来理解系统的功能需求。用例图包含以下内容.

● 角色:角色是系统的边界,即使用特定功能的用户,用人形符号表示。

● 用例:表示系统的某一个功能,用椭圆符号来表示。

● 角色和用例的关系:角色和用例之间是使用关系,用带实线的箭头符号来表示。 ● 用例之间的关系:用例之间存在着包含关系和扩展关系。包含关系是指一个用例包

含了另一个用例的功能,继承关系是指一个用例继承了另一个用例的功能。

本节介绍的Panel 系统的功能是绘制

用户指定的形状。图1-12显示了Panel 系

图1-11电动剃须刀的组合系统

用户

绘制形状

统的用例功能。

在软件的分析和设计阶段,还要分析用例的细节和处理流程,以文档的形式来描述用例。用例文档中应该包含以下内容。

● 前置条件:开始使用这个用例之前必须满足的条件。

● 主事件流:用例的正常流程。

● 其他时间流:用例的非正常流程,如错误流。

● 后置条件:用例使用完之后必须为真的条件。并不是每个用例都有后置条件。 以下是Panel 系统中绘制形状用例的细节。

● 前置条件:无。

● 主事件流:用户输入形状类型,然后绘制该形状。

● 其他事件流:如果用户输入非法的形状类型,则显示错误提示信息“输入的形状类

型不存在”。

● 后置条件:无。

1.3.2 类框图

类框图显示了系统的静态结构,它包括以下内容。

● 类:类是类框图的主要元素,用矩形表示。矩形的上层表示类名,中间表示属性,

下层表示行为。抽象类的类名用斜体字表示,抽象方法也用斜体字表示。

● 类之间的关系:包括联想,依赖。聚集,泛化和实现这5种关系。后面我们会做详

细的介绍

图1-13是Panel 的类框图。

在这个Panel 系统中定义了如下6个类。

● Panel 类:画出用户指定的形状。它的Sselecthape()实现这个功能。

● ShapeFactory 类:根据提供的形状类型,创建相应的Shape 形状对象它的getshape()

实现这一个功能。

● Shape 类:绘制自身的形状。这是一个抽象类,其方法也是一个抽象方法,没有实

现绘画功能。

● Circle 类,Line 类,Rectangle 类:分别画一个圆,线和椭圆。相应的方法draw()

实现这个功能。

图1-12 Panel 系统的用例图 图:1-13 Panel 的类框图

以上五个类存在依赖和泛化的关系,在后面会有详细的解释。

1.3.3 时序图

时序图显示用例(或者一部分)的详细流程。时序图有以下两个纬度。

●水平纬度:显示对象之间发送消息的过程。

●垂直纬度:显示发送消息的时间顺序。

图1-14是Panel系统绘制形状用例的时序图。

图1-14 Panel系统中绘制形状用例的时序图

从图1-25看出,绘制形状用例包括以下步骤。

1)用户选择特定的形状类型。

2)画板从形状工厂中获取形状对象。

3)形状工厂创建一个形状对象。

4)画板调用形状对象的绘画方法绘制形状。

1.3.4 协作图

协作图与时序图包含的信息相同,Ration Rose工具能够根据时序图自动生成协作图,反之亦然。两者的区别在于,时序图演示的是对象与角色随着时间的变化进行的交互,而协作图则不参照时间,直接显示对象与角色之间的交互过程。协作图更能直观地显示出对象之间地协作过程,设计师可以根据协作图来分析和调节对象之间地功能分布。图1-15是Panel 系统地绘制形状用例地协作图,这个图直观地反映了Panel,ShapeFactory和Shape对象地协作过程。

1.3.6 状态转换图

状态转换图表示在它的生命周期内所处的不同的状态,以及状态之间的转换过程。没有必要为每个类建立状态转换图。通常对于那些状态转换比较复杂的对象,才有必要用状态转换图来直观地描述它地状态转换过程。状态转换图包括以下基本元素。

●初始点:用实心圆来表示。

●状态之间地转换:用箭头来表示。

●状态:用圆角矩形来表示。

●终止点:用内部包含实心圆的圆来表示。

假定信用卡帐户有三种状态:打开状态,透支状态和关闭状态。初始状态为打开状态;客户从帐户中取款导致余额小于零时,就转入透支状态;如果在30天以内,余额始终小于零,就转入关闭状态;如果在透支状态,用户向帐户中存款使得余额大于零,就恢复为打开状态。此外,客户也可以请求关闭帐户。在打开状态,客户可以存款和取款;在透支状态,客户只允许存款;在关闭状态,客户不能存款和取款。图1-16显示了信用卡帐户的状态转换图。

图1-16 信用卡帐户的装态转换图

1.3.6 组件图

组件图的主要用途时显示软件系统中组件之间的依赖关系,以及和其他第三方组的依

赖关系,此外,它还能显示包含软件源程序代码的文件的物理组织结构。组件图即可以在一个非常高的层次上仅显示粗粒度的组件,也可以在较低的层次上展示某个组件的组成结构。

这里的组件也就是指软件系统中的子系统,它由一组协作完成特定服务的类组成。每个组件都能封装实现细节,对外公开接口。组件之间具有较高的独立性,他们只存在依赖关系,即一个组件会访问另一个组件的服务。

例如,图1-17是一个企业Java应用的高层次的组件图。这个Java应用分为客户端组件和服务器端组件两部分,客户端组件负责创建客户端界面,服务器端组件负责实现各种业务逻辑,此外,服务器端组件通过JDBC驱动程序类库组件访问数据库,通过JavaMail类库组件来收发电子邮件。

1

图:1-17 一个企业Java应用的高层次的组件图

1.3.8 部署图

部署图表示软件系统如何部署到硬件环境中,能够展示系统中的组件在硬件环境中的物理布局。部署图中最主要的元素是节点,一个节点可以代表一台物理机器,或代表一个虚拟机器节点。节点用三位立体表示,每个节点下方可以表明此节点上运行的可执行程序。

图1-18显示了一个按照客户端组件和服务器组件来划分的企业Java应用的部署图。客户端组件运行在客户机上,服务器端组件运行在应用服务器上。

图1-18 一个企业Java应用的部署图

1.4 类之间的关系

UML把类划之间的关系划分为以下五种。

●关联:类A与类B的实例之间存在特定的对应关系。

●依赖:类A访问类B提供的服务

●聚集:类A为整体类,类B是局部类,类A的对象由类B的对象组合而成。

●泛化:类A继承类B。

●实现:类A实现了B接口。

1.4.1 关联(association)

关联指的是类之间的特定的对应关系,在UML中用箭头表示。按照类之间的数量比,关联可以分为三种:一对一关联,一对多关联和多对多关联。关联还可以分为单向关联和双向关联。例如客户和订单之间的存在着的关联关系如图1-19到图1-21

1.4.2 依赖

依赖是指类之间的调用关系,在UML

中用带虚线的箭头表示。如果类A 访问类B

的属性和方法,或者类A 负责实例话化类B ,

那么可以说类A 依赖类B 。和关联关系不同,

无需在类A 中定义类B 的属性。例如Panel 与

Shape 类之间存在依赖关系。如图1-22。 1.4.3 聚集

聚集指的是整体与部分之间的关系,在

UML 中带实线的菱形箭头来表示,例如台灯和

灯泡之间就是聚集关系。如图1-23

当ReadingLamp 类由Bulb 类和Circuit 类聚

集而成时,在ReadingLamp 类应包含Bulb 和Circuit 类型的成员变量。

聚集关系还可以分为两种类型:一是被聚集的子系统允许被拆卸和替换,这是普通聚集关系;二是被聚集的子系统不允许被拆卸和替换,这时强聚集关系。

1.4.4 泛化

泛化指的是类之间的继承关系。在UML 中带实线的三角箭头来表示。例如长方形,圆形和直线都Shape 类,图1-24就是他们的类框图。

1.4.5 实现

实现指的是类与接口拉之间的关系。在UML 中用带虚线的三角形箭头来表示,这里的接口指的是接口类型,接口名字用斜体字来表示,接口中的方法是抽象方法,也采用斜体字表示。

1.4.6 区分依赖,关联和聚集关系

图1-19 从Order 到Customer 的多对一映射

图1-20 从Customer 到Order 的一对多单向关联 图1-21 从Customer 到Order 的一对多双向关联

图 1-22 Panel 类依赖Shape 类

图1-23台灯类和灯泡类之间的聚集关系

图1-24 类之间的继承关系

在建立对象模型时,很容易把依赖,关联和聚集关系搞混淆。当当对象A和对象B之间存在着依赖,关联和聚集关系时,对象A都由可能调用对B的方法,这是着三种关系的相同之处,除此之外,他们有着不同的特性。

1. 依赖关系的特性

对于两个相对独立的系统,当一个系统构造另一个系统的实例,或者依赖另一个系统的服务时,这两个系统之间主要体现为依赖关系,例如生产零件的机器和零件,机器负责构造零件对象。在例如充电电池和充电器,充电电池通过充电器来充电。

2. 关联关系的特征

对于两个相对独立的系统,当一个系统的实例与另一个系统的一些特定实例存在固定的对应关系时,这两个系统之间为关联关系。例如客户和订单,每个订单对应特定的客户,每个客户对应特定的订单;而充电电池和充电器之间就不存在着固定的对应关系。

3 聚集关系的特征

当系统A被加入到系统B中,成为系统B的组成部分时,系统B和系统A之间是聚集关系。例如自行车和它的响铃,龙头,轮胎和刹车装置就是聚集关系。

聚集关系和关联关系的区别还表现在以下几个方面。

●对于具有关联关系的两个对象,在多数情况下两者有独立的生命周期。比如自行车

和它的主人,当自行车不存在时,它的主人依然存在。

●对于具有聚集关系的两个对象,整体对象会制约它的组成对象的生命周期,部分类

的对象不能单独存在,它的生命周期依赖于整体类的对象的生命周期,当整体消失

时部分也随之消失了。比如小王的自行车被偷了,那么自行车的所有组件也就不存

在了。

1.5 实现Panel系统

上一节已经采用UML语言建立了Panel系统的对象模型,而在软件编码阶段的主要任务就是用程序来实现对象模型中的类。对于复杂的软件项目,会采取分组并行开发的方式来提高开发效率。本章的Panel系统规模较小,可以从被依赖的组件开始编码。Panel子系统依赖于Shape子系统,因此首先实现Shape子系统。在Shape子系统中,ShapeFactory类依赖于Shape类,因此首先实现Shape类和它的3个子类。下面几个程序分别是Shape类,Circle 类,Line类和Rectangle类的源程序。

例程1-1 shape.java

abstract public class shape{

abstract void draw() ;

}

例程1-2 circle.java

Public class Circle extens Shape {

Public void draw() {

System.out.pritlin(“draw a circle”);

}

例程1-3 line.java

Public class Line extends Shape{

Public void draw() {

System.out.pritlin(“draw a Line”)

}

}

例程1-4 Rectangle.java

Public class Rectangle extends Shape{

Public void draw() {

System.out.pritlin(“draw a Rectangle”)

}

}

ShapeFactory类负责构造Shape类的子类的具体实例。ShapeFactory类时一个专门制造Shape对象的工厂,它封装了制造Shape对象的复杂细节,向Panel子系统提供了一个简单的接口:getShape(int tyoe)。对于使用者的Panel子系统,只要给定用整数数表示的形状类型。ShapeFactory的作用就是进一步削弱Panel子系统和Shape子系统之间的耦合关系,提高两者的相对独立性。系统A通过系统B的工厂来获得系统B的某个实例,这种设计方式也被称为工厂设计模式。

例程1-5 ShapeFactory。Java

Import java.HashMap;

Import java.util.Map;

public class ShapeFactory{

public static final int SHAPE_TYPE_CIRCLE=1;

public static final int SHAPE_TYPE_RECTANGLE=2;

public static final int SHAPE_TYPE_LINE=3;

private static Map shape=new HashMap();

static{

shapes.put(new Integer (SHAPE_TYPE_CIRCLE), “Circle”);

shapes.put(new Integer(SHAOE_TYPE_RECTANGLE), “Rectangle”);

shapes.put(new Integer(SHAOE_TYPE_LINE), “Line”);

}

public static Shape getShape(int type){

type{

String className=shapes.get(new Integer (type));

Return (shape)Class.forName (className).newInstance();

} catch (Exception e){return null;}

}

}

软件的最后一步是创建Panel子系统,它仅包含一个类:Panel类。

例程1-6 Panel.java

从以上程序代码可以看出Panel 类对Shape 子系统中 ShapeFactory 类和Shape 类的依赖关系。Panel 类调用ShapeFactory 类的getShape()方法获得Shape 对象,Panel 类还调用Shape 对象的draw()方法来绘制圆。在Panel 类中,使用没有访问Shape 类的三个子类。

1.5.1 扩展Panel 系统

假定Panel 系统需要增加一个功能——画三角形,者需要对Panel 做如下修改:

1) 在Shape 子系统中增加一个三角形类Triangle ;

2) 在ShapeFacto

ry 类中增加一个SHAPE_TYPE_TRINGL

E 常量,并且修改静态代码块。 Public class triangle extends Shape{

Public void draw() {

System.out.pritlin(“draw a triangle ”)

}

} import java.io*; public class Panel ( public void selectShape()throws Exception{ System.out.printlin(“请输入形状类型:”); BufferedReader input = new BufferedReader(new InputStreamReader(system.in)); int shapeType=Integer.parseInt(input,readLine()); Shape shape=ShapeFactory.getShape(shapeType); If(shape=null) System.out.println(“输入的形状不存在”); else shape.draw(); } Public Static void main (String[] args) throws Exception{ new Panel().selectShape(); } }

Import java.HashMap;

Import java.util.Map;

public class ShapeFactory{

public static final int SHAPE_TYPE_CIRCLE=1;

public static final int SHAPE_TYPE_RECTANGLE=2;

public static final int SHAPE_TYPE_LINE=3;

public static final int SHAPE_TYPE_TRIANGLE=4;

private static Map shape=new HashMap();

static{

shapes.put(new Integer (SHAPE_TYPE_CIRCLE), “Circle”);

shapes.put(new Integer(SHAOE_TYPE_RECTANGLE), “Rectangle”);

shapes.put(new Integer(SHAOE_TYPE_LINE), “Line”);

shapes.put(new Integer(SHAOE_TYPE_TRIANGLE), “Triangle”);

}

public static Shape getShape(int type){

type{

String className=shapes.get(new Integer (type));

Return (shape)Class.forName (className).newInstance();

由此可见,当Panel系统中增加一个画三角形的功能时,仅仅修改了Shape子系统,对Panel子系统没有任何的影响。此外,Shape子系统具有良好的可扩展性,当Shape子系统需要增加新的绘画功能时,无须修改Shape子系统的系统结构,只需创建Shape类的子类Triangle即可。

面向对象软件开发教程

软件是在代码之外发生的一切事情。 如何继续学习过程 你将从本章学到什么? 两千年后(P2K)的软件环境是什么样的? P2K软件环境中的技术和技能是什么?有关P2K技能和技术有哪些概述性的资源?软件专家在面向对象项目中充当什么角色/职位? 如何继续面向对象的学习过程? 为什么需要阅读本章? 你的技能,以及如何使用它们,是能否成为成功的软件专家的重要决定性因素。通过阅读本书,你会获得学习对象技术和技巧所需的基本知识,本章也给你提供了继续进一步学习过程的建议。 至此,你已经了解了面向对象的全部内容,现在你已经是一名准备开发大型、关键性任务软件的对象专家。好吧,现在你还不全是。实际上,你已经掌握了一些有用的概念和技能,也明白了它们如何一起使用,在浏览复习题以及案例学习的过程中,你已经使用了它们。目前你正处在有利地位,可以继续你的学习过程,这个过程将很可能贯穿你的整个职业生涯。本章给出了对软件业目前的状况以及将来的发展方向的见解,在接下来的几年中将会需要什么样的技能,要如何才能获得这些技能。 11.1 P2K 环境 在你的整个职业生涯中一直要学习新的技能。 软件业在20世纪90年代后半期被Y2K危机严重影响了,新的开发被耽搁下来或者干脆取消,以转移资源解决Y2K危机,结果,许多企业都推迟了对采用新的技术和技能的投资。现在 Y2K危机已经过去了,我们正面对着两千年后(P2K)的软件环境,一个使用本书中描述的技术支配的环境。 在P2K环境中,你将会应用新的方法,例如面向对象的和基于组件的方法,采用迭代和增 量方法的新的开发过程,像Java和CORBA这样新的技术,以及像用况建模这样新的技术。本 书概述了对象开发技术,本节也总结了用于P2K环境的关键技术和技能。要理解P2K环境, 必需考虑下面几项内容:

浅谈敏捷项目管理在软件开发中的应用

浅谈敏捷项目管理在软件开发中的应用 摘要:本文先介绍了使用传统项目管理技术管理软件开发项目的方法,然后介绍了使用敏捷项目管理的初步实践,通过两者比较,提出了使用敏捷项目管理进行软件开发的方法。 一、使用传统项目管理技术管理软件开发项目的方法 按照《人月神话》的说法,软件开发是个焦油坑,书店里关于软件开发管理的书籍林良满目,各个软件开发组织也在尝试和应用不同的软件开发管理办法,希望寻找到“软件开发的银弹”。 在软件开发管理中,引入项目管理的办法,已经得到广大软件开发管理人员的一致认同,但对于具体实施何种项目管理办法,各个软件开发组织都有不同的答案,更多的迷茫,因为引入的项目管理办法不能从根本上解决软件开发项目面临的进度拖后、费用超支等问题,软件开发的银弹到底在哪里? 以下是笔者对国内软件开发组织不同项目管理成熟度的归纳和总结,大概可以分如下几类;1)小作坊、混沌形的,这样的组织还处在接单求生存的阶段,管理者还根本没有项目的意识,以满足客户需求、定制开发和回款为第一要务;2)尝试按照项目管理的思路与方法管理软件开发项目,但发现推

行困难,不得要领,目前很多中小型的软件开发组织都处于这个阶段;3)大型的软件企业,已经通过CMM|ISO认证、有足够的资源做保障,实行规范的项目管理做法,如一些软件外包工厂。 本文主要讲述处于第二个层次的软件开发组织的项目管理问题。软件开发项目管理涉及非常多的内容,从软件开发本身的业务出发,有需求管理、变更控制、配置管理、测试管理、系统分析与设计等;从项目管理的知识领域角度,有范围管理、时间管理、沟通管理、人力资源管理等内容。 按照传统的经典项目管理方法,通过一定的项目管理模板与IT工具,总结多个项目的经验,笔者总结有如下经典步骤来完成项目管理的计划编制与进度控制过程: 计划编制的经典步骤: ①建立企业和项目资源库:这个是进行项目管理的基础工作。 ②设置项目日历、资源日历。 ③设置项目的主要里程碑点。 ④在WBS(工作包)下列出工作清单(Task,Activity)。工作分解结构(WBS)和作业是进行项目范围管理的途径。 ⑤对每个Task估计工期。 ⑥连接每个Task间的逻辑关系(SS,FS,FS,FF,延时)。

敏捷开发流程详解

敏捷开发流程详解by yangdl 1敏捷开发流程 ?敏捷软件开发核心是迭代式开发,增量交付。 ?每一次迭代都建立在稳定的质量基础上,并作为下一轮迭代的基线,整个系统的功能随着迭代稳定地增长和不断完善。每次迭代要邀请用户代表(外部或内部)验收,提供需求是否满足的反馈。 ?迭代型的方法就是将整个软件生命周期分成多个小的迭代,每一次迭代都由需求分析、设计、实现和测试在内的多个活动组成,每一次迭代都可以生成一个稳定和被验证过的软件版本。 ?迭代建议采用固定的周期(1-4)周,可以每个迭代周期不一定要相同,但迭代内工作不能完成,应该缩减交付范围而不是延长周期。 1.1敏捷流程详解图-敏捷流程图 1.2敏捷流程三种角色及其职责

1.3敏捷开发流程详解 1.3.1流程图详解步骤 1.制定产品需求列表 ?PO收集来自客户、市场、领导等渠道的信息,从业务角度和市场价值编制一份按优先级排序的、明确的、可度量的、合理的产品需求列表; 2.召开计划会议 ?PO召集TM和SM(也可邀请其他利益相关者参加)召开计划会议(发布计划会议和冲刺会议一块开),发布计划主要是说明产品完整交付给客户的计划时间和交付物, ?冲刺计划就是确定该冲刺阶的长度(建议冲刺长度1-4周)、目标和冲刺任务单及其工作量估算

(以理想人天manday=7.5h估算,单位为小时计算),会议时间建议不要超过6h时间; ?在计划会议上就需要进行确认,是否需要使用持续集成;若使用持续集成,团队需要每天下班前至少提交一次私有构建成功的代码到服务器,并且要求写详细的日志信息;若不使用持续集 成,团队每天有完成任务单的情况,都需要在svn上以增量形式发包并通知到相关人员; ?项目计划会议上可以确定每天站立会时间及其规则要求(建议会议时间在15-20分钟左右),每个人回答3个问题:昨天做了什么,遇到什么问题,今天要做什么。具体问题讨论及其解决, 在私下进行沟通,不要在会议上讨论。站立会上只有TM人员有发言权,其他人员不要干预,SM 主要是维护秩序、规则及其引导作用。 3.需求分析、设计、编码和测试: ?计划会议结束后,TM获取各自的冲刺任务单进行后面的需求分析、设计、编码和测试; ?这里特别要说明的是,开发和测试是并行工作,必要的文档还是需要输出(如:讨论次数较多的功能点、备选方案很多但最后确认一种、重要功能、业务逻辑复杂的等等)。具体情况,需要 项目组根据实际情况决定,但客户要求交付的文档必须要输出; 4.冲刺任务单和燃尽图更新 每天SM需要根据每日站立会上TM反馈的情况,进行更新冲刺任务单和燃尽图或SM和TM之间达成共识,TM各自完成后进行更改状态,这里涉及到的文档都会有相对应的模板供参考使用。 5.迭代周期结束点 ?已到迭代周期结束点,只有哪些经过测试通过的冲刺需求列表才能算是真正的完成,其他未经过测试或测试不通过的不能算是完成。 ?这里要特别注意,所谓的测试通过不是说要把所有的问题都解决才算是通过,这个要根据项目具体的要求和规定来定。还没有达到迭代结束点,该冲刺任务需求列表就完成,可以从产品需 求列表中挑选优先级高的进行开发。 6.冲刺评审会议 ?TM需要召开冲刺评审会议,邀请PO、客户或客户代表来参加,由这些客户或客户代表来表决是否满足需求和期望目标。一般会议时间建议不要超过2个小时,参加人员除PO及其相关利益 人来参加外,TM全体成员,也可以邀请其他相关人员参加。 7.冲刺回顾会议 ?迭代输出的增量交付可能会引起原产品需求列表的改变,可能需要更新原产品需求列表;最后TM需要开展本次迭代的好的实践和不足的改进机会,最终稿由SM整理汇总,作为下一次的迭 代的经验参考。回顾会议建议时间不用太长,一般15-30分钟即可,全体人员都需要参加,包括:

敏捷软件开发理论与实践

BJUG
敏捷软件开发方法理论与实战
敏捷软件开发方法理论与实战
https://www.wendangku.net/doc/2f15332151.html,/ mailto:morningspace@https://www.wendangku.net/doc/2f15332151.html,
https://www.wendangku.net/doc/2f15332151.html,/

BJUG
敏捷软件开发方法理论与实战
议 题
? ? ? ? 敏捷方法概述 极限编程简介 敏捷实践案例 敏捷游戏
https://www.wendangku.net/doc/2f15332151.html,/

BJUG
敏捷软件开发方法理论与实战
敏捷方法概述
https://www.wendangku.net/doc/2f15332151.html,/

BJUG
敏捷软件开发方法理论与实战
开场白
军事历史就是一个在装备和灵活性的相对优势之间来回摇摆 的钟摆。
—— 卡尔·冯·克劳塞维茨《战争论》
– – – –
盔甲骑士 vs. 布衣士兵 盔甲骑士 vs. 轻骑兵 坦克 vs. 轻骑兵 坦克 vs. 反坦克导弹
在IT领域,我们正好都在从装备统治一切的时代走出来。现 在我们正进入一个唯有灵活性才是至关重要的时代。
—— Tom DeMarco《规划极限编程》序
– 工程方法 vs. 没有方法 – 工程方法 vs. 敏捷方法
https://www.wendangku.net/doc/2f15332151.html,/

BJUG
敏捷软件开发方法理论与实战
工程方法 Engineering Methodology
? 借鉴了工程领域的实践,有着严格而详尽的规定,强调 项目的可控性 ? 官僚繁琐,要做太多的事情从而延缓开发进程 ? 从泰勒主义,到精益制造
https://www.wendangku.net/doc/2f15332151.html,/

面向对象的软件开发方法简介

1面向对象的软件开发方法简介 面向对象的开发方法把软件系统看成各种对象的集合,对象就是最小的子系统,一组相关的对象能够组合成更复杂的子系统。面向对象的开发方法具有以下优点。 ●把软件系统看成是各种对象的集合,这更接近人类的思维方式。 ●软件需求的变动往往是功能的变动,而功能的执行者——对象一般不会有大的变 换。这使得按照对象设计出来的系统结构比较稳定。 ●对象包括属性(数据)和行为(方法),对象把数据和方法的具体实现方式一起封 装起来,这使得方法和与之相关的数据不再分离,提高了每个子系统的相对独立性, 从而提高了软件的可维护性。 ●支持封装,抽象,继承和多态,提高了软件的可重用性,可维护性和可扩展性。 1.1 对象模型 在面向对象的分析和设计阶段,致力于建立模拟问题领域的对象模型。建立对象模型既包括自底向上的抽象过程,也包括自顶向下的分解过程。 1.自底向上的抽象 建立对象模型的第一步是从问题领域的陈述入手。分析需求的过程与对象模型的形成过程一致,开发人员与用户交谈是从用户熟悉的问题领域中的事物(具体实例)开始的,这就使用户和开发人员之间有了共同语言,使得开发人员能够彻底搞清用户需求,然后再建立正确的对象模型。开发人员需要进行以下自底向上的抽象思维。 ●把问题领域中的事物抽象为具有特定属性和行为的对象。 ●把具有相同属性和行为的对象抽象为类。 ●若多个类之间存在一些共性(具有相同属性和行为),把这些共性抽象到父类中。 再自底向上的抽象过程中,为了使子类能更好的继承父类的属性和行为,可能需要自顶向下的修改,从而使整个类体系更加合理。由于这类体系的构造是从具体到抽象,再从抽象到具体,符合人们的思维规律,因此能够更快,更方便的完成任务。 2.自顶向下的分解 再建立对象模型的过程中,也包括自顶向下的分解。例如对于计算机系统,首先识别出主机对象,显示器对象,键盘对象和打印机对象等。接着对这些对象再进一步分解,例如主机对象有处理器对象,内存对象,硬盘对象和主板对象组成。系统的进一步分解因有具体的对象为依据,所以分解过程比较明确,而且也相对容易。因此面向对象建模也具有自顶向下开发方法的优点,既能有效的控制系统的复杂性,又能同时避免结构化开发方法中功能分解的困难和不确定性。 1.1.2UML:可视化建模语言 面向对象的分析与设计方法,在20世纪80年代末至90年代中发展到一个高潮。但是,诸多流派在思想和术语上有很多不同的提法,对术语和概念的运用也各不相同,统一是继续发展的必然趋势。需要有一种统一的符号来描述在软件分析和设计阶段勾画出来的对象模型,UML(Unified Modeling Language,统一建模语言)应运而生。UML是一种定义良好,易于表达,功能强大且普遍适用的可视化建模语言。而采用UML语言的可视化建模工具是Rational 公司开发的Rational Rose。 1.2 面向对象开发中的核心思想和概念 在面向对象的软件开发过程中,开发者的主要任务就是先建立模拟问题领域的对象模型,然后通过程序代码来实现对象模型,如何用程序代码来实现对象模型,并且保证软件系统的可重用性,可扩展性和可维护性呢?本节节主要阐述面向对象开发的核心思想和概念,这些核心思想为从事面向对象的软件开发实践提供理论武器。

敏捷软件开发

敏捷软件开发:SRP单一职责原则 (2009-03-24 20:30:24) 转载 标签: it 这条原则实际就是体现内聚性原则的体现,一个模块的组成元素之间的功能相关性。把内聚性概念扩展一下:把内聚性和引起一个模块或者类改变的作用力联系起来。 一个类应该只有一个发生变化的原因。若Game类有2个不同的职责,一个是记录当前轮,另一个式计算分数,最后要把这两个职责分离到两个类中。为何把这两个职责分在单独的类中呢?因为每个职责都是变化的一个轴线,当需求变化会反映为类的职责的变化。如果一个类承担了多于一个职责,那么引起它变化的原因就会有多个。 如果一个类承担的职责太多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或抑制这个类完成其他职责的能力,这种耦合或导致脆弱的设计,当变化发生时,设计会遭受到预想不到的破坏。 定义职责:如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责,有时候我们很难注意到这点,我们习惯以组的形式去考虑职责。 public interface Modem{ public void Dial(String pno); public void Handup(); public void Send(char c); public char Recv(); } 接口包括了2个职责,第一个职责是连接管理,第二个职责是数据通信。 如果应用程序的变化方式总是导致这两个职责同时变化,那么就不要分离他们,分开他们就会有不必要的复杂性味道。仅当变化发生时,变化的轴线才有实际意义,如果没有征兆,那么应用SRP或者任何其他原则都是比明智的。 分离耦合的职责:经常会有一些和硬件或者操作系统的细节有关的原因,迫使我们把不愿意耦合在一起的东西欧和在一起了。然而,对于应用的其余部分来说,通过分离他们的接口我们已经解耦概念。 如果ModenImplementation implemet DataChannel,Conection。ModenImplementation看起来是一个混杂物,或者有缺陷的类,所有的依赖关系都是从它发出来的。谁都不需要依赖它,谁都不需要知道它的存在。因此,我们已经把丑陋的部分隐藏起来了。其丑陋性不会泄露出来,污染应用程序的其它部分。 持久化:如Emplyee:CalculatePay,Store,Emplyee类包括了业务规则和对于持久化的控制,这两个职责在大多数情况下绝不应该混合在一起。业务规则往往会频繁地变化,而持久化的方式却不会如此频繁的变化,并且变化的原因也不一样。把持久化系统和业务规则绑定在一起是自讨苦吃的做法。如果发现这种情况存在了,应该使用FACADE、dao或者proxy模式对设计进行重构,分离这两个原则。 SRP是所有原则中最简单的原则之一,也是最难正确运用的原则之一。

面向对象程序设计概述

1.什么是结构化程序设计方法?这种方法有哪些优点和缺点? 【解答】结构化程序设计方法是指20世纪60年代开始出现的高级语言程序设计方法,由于采用了数据结构化、语句结构化、数据抽象和过程抽象等概念,使程序设计在符合客观事物与逻辑的基础上更进了一步。结构化程序设计的思路是:自顶向下、逐步求精。程序结构由具有一定功能的若干独立的基本模块(单元)组成,各模块之间形成一个树状结构,模块之间的关系比较简单,其功能相对独立,模块化通过子程序的方式实现。结构化程序设计方法使高级语言程序设计开始变得普及,并促进了计算机技术的深入应用。 虽然结构化程序设计方法采用了功能抽象、模块分解与组合,以及自顶向下、逐步求精的方法,能有效地将各种复杂的任务分解为一系列相对容易实现的子任务,有利于软件开发和维护;但与面向对象程序设计方法相比,结构化程序设计存在的主要问题是,程序的数据和对数据的操作相互分离,若数据结构改变,程序的大部分甚至所有相关的处理过程都要进行修改。因此,对于开发大型程序具有一定的难度,软件的可重用性差,维护工作量大,不完全符合人类认识世界的客观规律。 2.面向对象程序设计有哪些重要特点? 【解答】软件设计的目的是为了解决日常生活中存在的各种实际问题,面向对象程序设计与以往各种程序设计方法的根本区别是程序设计的思维方法的不同。它主要具有如下重要特点: (1)面向对象程序设计实现了较直接地描述客观世界中存在的事物(即对象)及事物之间的相互关系,它所强调的基本原则是直接面对客观事物本身进行抽象,并在此基础上进行软件开发,将人类的思维方式与表达方式直接应用在软件设计中。 (2)面向对象的程序设计将客观事物看作具有属性和行为的对象,通过对客观事物进行抽象来寻找同一类对象的共同属性(静态特征)和行为(动态特征),并在此基础上形成类。 (3)面向对象的程序设计将数据和对数据的操作封装在一起,提高了数据的安全性和隐蔽性。

JAVA语言与面向对象程序设计课后习题答案

第1章面向对象软件开发概述 1.简述面向过程问题求解和面向对象问题求解的异同。试列举出面向对象和面向过程的编程语言各两种。 答:面向过程问题求解,以具体的解题过程为研究和实现的主体,其思维特点更接近于计算机;面向对象的问题求解,则是以―对象‖为主体,―对象‖是现实世界的实体或概念在计算机逻辑中的抽象表示,更接近于人的思维特点。 面向过程的编程语言:C,Pascal,Foratn。 面向对象的编程语言:C++,Java,C#。 2.简述对象、类和实体及它们之间的相互关系。尝试从日常接触到的人或物中抽象出对象的概念。 答:面向对象技术中的对象就是现实世界中某个具体的物理实体在计算机逻辑中的映射和体现。类是同种对象的集合与抽象。类是一种抽象的数据类型,它是所有具有一定共性的对象的抽象,而属于类的某一个对象则被称为是类的一个实例,是类的一次实例化的结果。如果类是抽象的概念,如―电视机‖,那么对象就是某一个具体的电视机,如―我家那台电视机‖。 3.对象有哪些属性?什么是状态?什么是行为?二者之间有何关系?设有对象―学生‖,试为这个对象设计状态与行为。 答:对象都具有状态和行为。 对象的状态又称为对象的静态属性,主要指对象内部所包含的各种信息,也就是变量。每个对象个体都具有自己专有的内部变量,这些变量的值标明了对象所处的状态。 行为又称为对象的操作,它主要表述对象的动态属性,操作的作用是设置或改变对象的状态。 学生的状态:姓名、性别、年龄、所在学校、所在系别、通讯地址、电话号码、入学成绩等; 学生的行为:自我介绍、入学注册、选课、参加比赛等。 4.对象间有哪三种关系?对象―班级‖与对象―学生‖是什么关系?对象―学生‖与对象―大学生‖是什么关系? 答:对象间可能存在的关系有三种:包含、继承和关联。 对象―班级‖与对象―学生‖是包含关系。 对象―学生‖与对象―大学生‖是继承关系。 5.有人说―父母‖和―子女‖之间是继承的关系。这种说法是否正确?为什么? 答:―父母‖和―子女‖之间不是面向对象意义上的―继承‖关系。因为这里的继承关系是―is a‖的关系,―男人‖与―人‖之间可以说是继承关系。 6.面向对象的软件开发包括哪些过程?OOA模型包括哪三个层次?OOD模型在OOA模型的基础上引入了哪些工作? 答:面向对象的软件开发过程可以大体划分为面向对象的分析(Object Oriented analysis,OOA)、面向对象的设计(Object oriented design,OOD)、面向对象的实现(Object oriented programming,OOP)三个阶段。 面向对象的分析的主要作用是明确用户的需求,并用标准化的面向对象的模型规范地表述这一需求,最后将形成面向对象的分析模型。 面向对象的设计将在OOA模型的基础上引入界面管理、任务管理和数据管理三部分的内容。 7.面向对象的程序设计方法有哪些优点? 答:由于对象的概念能够以更接近实际问题的原貌和实质的方式来表述和处理这些问题,所以面向对象的软件开发方法比以往面向过程的方法有更好的灵活性、可重用性和可扩展性,

面向对象的软件开发过程

面向对象的软件开发过程 【摘要】本文介绍了面向对象技术的基本思想,阐述了面向对象软件开发的分析与设计实现过程,说明了面向对象技术在软件开发中的应用,总结出面向对象技术在程序开发中的优势。 【关键词】面向对象;软件开发 1面向对象技术的基本思想 随着计算机应用领域的不断扩大,软件的规模和复杂性也在不断增加,我们需要按照更科学、有效的方法组织软件的生产与管理。面向对象技术首先在编程领域兴起,并逐渐发展成熟,并随着面向对象的测试、集成等技术的出现而发展为一套贯穿整个软件生命周期的方法体系。 面向对象技术首先在编程领域兴起,并逐渐发展成熟,并随着面向对象的测试、集成等技术的出现而发展为一套贯穿整个软件生命周期的方法体系。面向对象方法的基本思想是:从客观存在的事物(即对象) 出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式。 具体地讲,面向对象技术是从问题域中客观存在的事物出发构造软件系统,用对象作为这些事物的抽象表示,并以此作为系统的基本构成单位。每个对象都有其属性和方法,属性表示事物的静态特征, 方法表示事物的动态特征。对象的属性和方法结合为一体,对外屏蔽其内部细节,称作封装。把具有相同属性和相同方法的对象归为一类,类是对象的抽象描述,每个对象是它所属类的一个实例。通过在不同程度上运用抽象的原则,可以得到基类和子类,子类继承基类的属性和方法。 面向对象的三个基本特征: 封装——是把客观事物封装成抽象的类,可以隐藏实现细节,使得代码模块化; 继承——使用现有类的所有功能,并在无需重写原来类的情况下对这些功能进行扩展; 多态——指同一消息作用于不同的对象时,具有不同的处理方案和处理结果,即所谓的“同一接口, 多种方法”,增强了程序的灵活性。 2面向对象的分析与设计实现 面向对象的程序设计以解决的问题中所涉及的各种对象为主要矛盾,力图从实际问题中抽象出封装了数据和操作的对象,通过定义属性和操作来表述他们的特征和功能,定义接口来描述他们的地位及与其他对象的关系,最终形成一个可理解、可扩充、可维护的动态对象模型。面向对象的软件开发过程可以大体划分为面向对象的分析,面向对象的设计,面向对象的实现三个阶段。 2.1面向对象的分析 面向对象的分析主要作用是明确用户的需求,并用标准化的面向对象的模型规范来表述这一需求,最后形成面向对象的分析模型。图1展示的是面向对象系统分析示意图。 图1面向对象系统分析示意图 面向对象的分析分为如下几步: 2.1.1确定需求 明确用户的需求,包括对用户需求的全面理解和分析;明确所要开发的软件系统的职责界限;进行可行性研究和制订方案,交给用户确认。

Scrum敏捷软件开发过程

Scrum敏捷软件开发过程 目录 ?什么是敏捷软件开发? ?敏捷方法的项目计划 ?敏捷项目管理和传统项目管理 ?为什么使用敏捷? ?Scrum概述 ?Scrum的角色 ?Scrum实践和工作产品 ?敏捷开发中的估计方法 ?测试驱动开发 ?Scrum应用 ?支持工具和模版 ?一些常见的误解 敏捷开发方法 什么是敏捷软件开发? ?敏捷软件开发是软件项目的一个概念框架. ?有许多建立在敏捷概念上的方法,如Scrum和Extreme Programming(XP). ?与僵化的、重量级的、官僚式的方法形成对照,比如瀑布模型(指纯粹形式的)?最大限度地降低短期固定时间的迭代式软件的开发风险. 敏捷宣言(2001年) ?人和交互胜过过程和工具. ?Individuals and interactions over processes and tools ?可以工作的软件胜过完备的文档. ?Working software over comprehensive documents ?客户协作胜过合同谈判. ?Customer collaboration over contract negotiation ?随时应对变化胜过遵循计划. ?Responding to change over following a plan 敏捷过程的限制 ?敏捷软件开发过程包含过程、原则、工具,和最重要的-人 ?因此:诚信是基础 ?没有过程能够对诚信进行有效地约束,诚信与否是有效实施敏捷过程的最大限制

Product constantly Scope frozen new PBL items to next Sprint Backlog 使用敏捷方法的项目计划 “Sprintful” of top - priority PBL to the next Sprint Sprint More accurate estimates as man hours 8 Short term planning (commitment by May be 5 2 1 3 8 5 8 ∑32 Long term planning (best guess at the moment): Initial Size Estimates As Story Points Velocity 8 SP/Sprint 4 Sprints T arget Sprint for each PBL item set, feasible implementation Order. 敏捷项目管理和传统项目管理 ? 传统项目管理: ? 事先对整个项目进行估计、计划、分析 ? 反对变更; 变更需要重新估计、重新规划 ? 严密的合同来减少风险, 如果改变需求要走 CR 流程. ? 项目作为一个“黑盒子”,对客户与供应商的可视性差. ? 产品化和测试阶段是分离的. ? 文档和计划驱动的方法. ? 软件交付时间晚, 意识到风险的时间晚. ? 敏捷项目管理: ? 对整个项目做一个粗略的估计,每一次迭代都有详细的计划. ? 鼓励变化, 客户价值驱动开发. ? 信任和赋予权力;合约使变更变得简单,增加价值. ? 客户和开发人员之间是紧密的连续的合作关系 ? 每次迭代都产生可交付的软件 ? 专注于交付软件. ? 第一次迭代就可交付能工作的版本,风险发现的早. 为什么采用敏捷? –预期的收益 ? 采用敏捷方法得当的话,可以: ? 更加透明; 随时跟踪项目的状态和进展情况,及早发现问题和风险 . ? 快速交付, 每次迭代都能交付可运行的软件. ? 最高风险和最高优先级的需求,最优先进行开发. ? 改善应对变更能力, 减少大量的重计划. ? 改善项目沟通. ? 更好的客户参与, 避免错误的假设. ? 总之: ? 提高了生产率; 减少“浪费”(不需要的文档,重复工作等),项目的每次迭代都有明

面向对象的分析过程

面向对象的分析过程 摘要 分析了面向对象技术应用于仿真领域的种种优点,亦即我们选择采用面向对 象的方法进行改造的原因。一些面向对象方法存在的不足。 关键词:仿真,面向对象,岸边集装箱起重机,训练器 面向对象的开发方法是以对象作为最基本的元素,它是分析问题、解决问题的核心。 面向对象=对象(Object) +分类(classification) +继承(inheritance) +通过消息的通信(communication with messages) 从下图中我们可以看出,面向对象的开发方法明显不同。 面向对象的仿真为仿真人员提供了开发模块化可重用的仿真模型的工具,它把系统看成由相互作用的对象所组成,而对象则往往表示现实系统中的真实实体。从而提高了仿真模型的可理解性、可扩充性和模块性,并且便于实现仿真与计算机图形和人工智能的结合。采用面向对象的方法,原因如下: 1.可理解性 面向对象仿真对设计者、实现者,以及最终用户来说都改进了仿真的可理解性。因为仿真系统中的对象往往直接表示现实系统中的真实实体,这些实体在面向对象的仿真系统中可以用外观上类似于人们熟悉的实际系统的对象的图形或图像来表示,用户可以通过图形界面与仿真模型进行交互,利用图形或图像来直接建立仿真模型,这对于熟悉实际系统的用户来说是很容易理解的。 2.可重用性和可扩充性 在面向对象的仿真中,可以建立起一个模型库用以保存以前建立的模型,模型库中的模型可以作为建立新模型的可重用构件,通过面向对象技术内在的继承机制可以容易地和系统地修改现有的对象(类)以创建新的对象。并且可以加入现有的类库中。类库提供了仿真建模所需要的一般设施。通过修改现有的类,可以建立各种应用中所需要的特殊对象。 3.模块性 面向对象的仿真是模块化,特殊的过程来寻找相应的信息,不会影响其它的对象。 4.图形用户界面

面向对象方法题库1-0-5

面向对象方法题库1- 0-5

问题: [单选]当()时,用例是捕获系统需求最好的选择。 A.系统具有很少的用户 B.系统具有很少的接口 C.系统算法复杂,功能单一 D.系统有很多参与者 用例描述的是系统的执行者(参与者)与系统的交互,同时也是开发人员与用户进行交流的工具,可用来很好地定义系统的边界。所以,当执行者较多的时候,用例是捕获系统需求最好的选择。

问题: [单选]对OO系统的技术度量的识别特征,Berard定义了导致特殊度量的特征。其中()抑制程序构件的操作细节,只有对访问构件必需的信息被提供给其他希望访问的构件。 A.局部化 B.封装 C.信息隐藏 D.继承 面向对象的软件和用传统方法开发的软件有本质的不同,为此,对OO系统的技术度量必须调整以适应那些区别OO和传统软件的特征。Berard定义了5个导致特殊度量的特征,分别是局部化、封装、信息隐蔽、继承和对象抽象技术。 (1)局部化。局部化是软件的一个特征,它指明信息在程序中被集中的方式,例如,针对功能分解的传统方法围绕功能局部化信息,它们典型地以过程模块来实现。数据驱动方法围绕特定的数据结构局部化信息。在OO语境中,信息是通过封装数据和处理在类或对象的边界内而集中的。因为传统软件强调函数为局部化机制,软件度量着重于函数的内部结构或复杂性(例如,模块长度、内聚性或环路复杂性等)或函数间相互连接的方式(例如,模块耦合)。因为类是OO系统的基本单位,所以,局部化是基于对象的,因此,度量应该应用于作为一个完全实体的类(对象)。此外,在操作(函数、方法)和类间的关系不必要是一对一的。因此,反应类协作方式的度量必须能够适应一对多和多对一的关系。

敏捷开发与敏捷测试(很详细的说明)

敏捷开发与敏捷测试 来源: cnblogs 敏捷开发:1.敏捷型方法是“适配性”而非“预设性”。重型方法试图对一个软件开发项目在很长的时间跨度内作出详细的计划,然后依计划进行开发。这类方法在计划制定完成后拒绝变化。而敏捷型方法则欢迎变化。其实,它们的目的就是成为适应变化的过程,甚至能允许改变自身来适应变化。2.敏捷型方法是“面向人” 的(people-oriented) 而非“面向过程”的(process-oriented)。它们试图使软件开发工作顺应人的天性而非逆之。它们强调软件开发应当是一项愉快的活动。 我认为以上两个特点很好的概括了敏捷开发方法的核心思想:适应变化和以人为中心。 敏捷开发其实借鉴了大量软件工程中的方法。迭代与增量开发,这两种在任何一本软件工程教材中都会被提到的方法,在敏捷开发模式中扮演了很重要的角色。再向前追溯,我们还也可见到瀑布式与快速原型法的影子,也许还有多。改善,而非创新。敏捷开发可理解为在原有软件开发方法基础上的整合——取其精华,去其糟粕。因此敏捷开发继承了不少原有方法的优势。“在敏捷软件开发的过程中,我们每两周都会得到一个可以工作的软件,”Fowler介绍,“这种非常短的循环,使终端客户可以及时、快速地看到他们花钱构建的软件是一个什么样的结果。” 敏捷开发提出了以下遵循的原则: ·我们最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意。 ·即使到了开发的后期,也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势。 ·经常性地交付可以工作的软件,交付的间隔可以从几个星期到几个月,交付的时间间隔越短越好。 ·在整个项目开发期间,业务人员和开发人员必须天天都在一起工作。 ·围绕被激励起来的个体来构建项目。给他们提供所需的环境和支持,并且信任他们能够完成工作。 ·在团队内部,最具有效果并富有效率的传递信息的方法,就是面对面的交谈。 ·工作的软件是首要的进度度量标准。 ·敏捷过程提倡可持续的开发速度。责任人、开发者和用户应该能够保持一个长期的、恒定的开发速度。 ·不断地关注优秀的技能和好的设计会增强敏捷能力。 ·简单是最根本的。

【项目管理知识】面向对象软件开发和过程

面向对象软件开发和过程 代码是核心 面向对象发展到今天,已经出现了许许多多的实践、方法和技术。很多的技术都能够有效的提高软件质量,而要用好这些技术,我们需要从过程和管理的角度来看待它们,而不是为了使用技术而使用技术。此系列文章包括:代码是核心、案例实战(上)、案例实战(下)、重用、优化代码的组织、针对契约设计、业务建模。 在一个有效的组织中,必定拥有杰出的一线人才。软件设计也是一样的,一线人才的素质决定了软件的质量。从敏捷的观点来看,代码是检验软件过程是否有效的终标准。目前为止,以及在短时间的未来,我们都不太可能完全脱 离代码进行软件设计。所以,软件过程中的任何一个活动都是为了能够产出的代码。所以,代码才是核心。 1.代码是软件开发的基础 编码是软件开发过程中基本、底层的技艺,然而也是重要的技艺。任何一个领域的专家都需要花费大量的时间来进行基本技艺的锻炼,木匠需要花费大量的时间来锻炼他们对各种工具的掌握,厨师则需要练习刀工和火候。程序员也是一样的,对我们来说,语言的各种特性必须要了然于胸。而对软件的管理也需要从代码做起。 从____ 年到现在,国内兴起了一股软件工程热,需求管理、配置管理、甚 至CMM。面对纷至沓来的各种方法学、UML、00A大家似乎已经热衷于这些概念本身了,却往往忽略了软件开发中基本的元素-代码。在和很多软件组织的接触过程中,我们认为大多数组织急切需要的并不是这些工程理论,不是说这些理论不重要,而是这些组织的症结不在于此。很多的组织连代码的质量都管理不好,又何谈其它呢?代码管理是基础的基础,从管理的角度上来看,任何一个组织的管理都需要一个从上至下的管理过程,有基层的管理人员,也有 高层的管理人员。对代码的管理就是软件开发中的基层管理,它起到的作用就是能够把需求、设计的思路贯彻到终的代码中。 "管理无大事"。对软件的管理也是一样,大部分的问题都是由于很小的原因 引起的。例如,一个产品如果后期在debug上花费了大量的时间,那么,这种现象是由于什么原因引起的?一种可能的原因是前期的代码设计中对代码质量的把握不严。每一次代码功能的演化并不会产生太多的问题,但是当代码累积

面向对象软件开发教程

软件是在代码之外发生的一切事情。 第11章 如何继续学习过程 你将从本章学到什么? ●两千年后(P2K)的软件环境是什么样的? ●P2K软件环境中的技术和技能是什么? ●有关P2K技能和技术有哪些概述性的资源? ●软件专家在面向对象项目中充当什么角色/职位? ●如何继续面向对象的学习过程? 为什么需要阅读本章? 你的技能,以及如何使用它们,是能否成为成功的软件专家的重要决定性因素。通过阅读本书,你会获得学习对象技术和技巧所需的基本知识,本章也给你提供了继续进一步学习过程的建议。 至此,你已经了解了面向对象的全部内容,现在你已经是一名准备开发大型、关键性任务软件的对象专家。好吧,现在你还不全是。实际上,你已经掌握了一些有用的概念和技能,也明白了它们如何一起使用,在浏览复习题以及案例学习的过程中,你已经使用了它们。目前你正处在有利地位,可以继续你的学习过程,这个过程将很可能贯穿你的整个职业生涯。本章给出了对软件业目前的状况以及将来的发展方向的见解,在接下来的几年中将会需要什么样的技能,要如何才能获得这些技能。 11.1 P2K环境 在你的整个职业生涯中一直要学习新的技能。 软件业在20世纪90年代后半期被Y2K危机严重影响了,新的开发被耽搁下来或者干脆取消,以转移资源解决Y2K危机,结果,许多企业都推迟了对采用新的技术和技能的投资。现在Y2K危机已经过去了,我们正面对着两千年后(P2K)的软件环境,一个使用本书中描述的技术支配的环境。 在P2K环境中,你将会应用新的方法,例如面向对象的和基于组件的方法,采用迭代和增

量方法的新的开发过程,像Java和CORBA这样新的技术,以及像用况建模这样新的技术。本书概述了对象开发技术,本节也总结了用于P2K环境的关键技术和技能。要理解P2K环境,必需考虑下面几项内容: ●新的软件策略。 ●使能技术。 ●领先的开发技术。 ●现代软件过程。 ●对象编程语言。 ●如何获得P2K技能。 定义 两千年后(P2K)环境(post-2000 environment):机构在IT部门内部部署的一系列技术和技能(大部分是基于面向对象和组件技术的)。 2000年(Y2K)危机(year 2000 crisis):软件组织在20世纪90年代未期要更新或替代那些使用两位数而不是四位数来存储年份的软件。 11.1.1 新的软件策略 21世纪初期将会由两项关键的软件策略来统治:企业应用集成(EAI)和电子商务。EAI 把全异的软件应用集成为一个整体以支持新的和复杂的业务过程。中间件和组件技术,例如下面这节里描述的CORBA和兼容COM+的工具也用于支持EAI。了解EAI的一个好去处是,也可以参考《Enterprise Application Integration》(Linthicum,2000)一书。包装技术是《Building Object Applications That Work》(Ambler,1998a)一书详细讲述的主题,对于EAI的开发者来说它也是一项重要的技能。 电子商务也称为基于Internet的商务,它关注于使用电子技术支持产品销售和服务。电子商务成功的机构有,戴尔公司()—一个计算机软硬件零售商;亚马逊()—一个销售书、录像带、音乐CD的零售商;Ebay网()—一个在线拍卖网站。电子商务最好的资源是杂志《The Industry Standard》(),它以报纸和在线两种形式出版发行。 11.1.2 使能技术 除了11.1.5节描述的对象编程语言外,还有好几个使能技术也是P2K环境中占主导地位的技术。这些技术有: ● CORBA ● COM+ ● EJB(企业Java组件模型) ● XML ●持久层/框架

什么是敏捷软件开发

敏捷是一个术语,用于描述软件开发的方法,强调增量交付,团队协作,持续计划和持续学习,而不是试图在接近结束时立即交付。 敏捷专注于保持流程的精益,并创建最小的可行产品(MVP),在最终结果出现之前经历多次迭代。不断收集和实施反馈,总而言之,这是一个更加动态的过程,每个人都在朝着一个目标努力。 Scrum和其他的敏捷方法 敏捷是一种思维方式,它是一套价值观和原则。敏捷是一种思考和行动的方式。敏捷就是短周期,迭代和增量交付,快速失败,获得反馈,及早向客户提供商业价值,关于人员,协作和互动。敏捷是一种关于透明度,检查和适应的心态。但是,敏捷不包含任何角色,事件或工件。这是一种心态。例如,Scrum是敏捷伞下广泛使用的框架之一,它可以帮助你变得更敏捷,但敏捷运动中有更多的框架,如看板,XP,Crystal等等,如图所示下面:

Scrum Scrum是一个框架,人们可以在其中解决复杂的自适应问题,同时有效且创造性地提供具有较高价值的产品。它用于管理软件项目和产品或应用程序开发。它的重点是适应性产品开发战略,其中跨职能团队作为一个单元在2-4周内达成共同目标(Sprint)。它由一系列价值,文物,角色,仪式,规则和较佳实践组成。 Lean (精益) 精益起源于丰田生产系统(TPS),它在20世纪50年代,60年代及以后改变了实物商品的生产。精益保持其在制造业中的地位,但也在知识工作中找到了新的应用,帮助所有行业的企业消除浪费,改进流程并促进创新。软件开发是精益方法的自然应用,因为与制造业一样,它通常遵循一个确定的过程,具有一定的接受条件,并导致有形价值的传递。指导精益方法所有实践的关键概念,我们称之为精益支柱。他们是: ·连续的提高 ·尊重人 ·轻量级领导

敏捷开发过程中如何开发高质量的软件

.、八、- 刖言 什么是软件质量?很多技术同仁都认为软件质量是软件是否存在Bug,是否性 能高,安全性好等等。其实软件质量的含义远多与此。质量就是软件产品对于 某个(或某些)人的价值;价值是指创造利润,又或是降低成本。总的来说, 软件质量是软件的灵魂和存在意义。另外,我们知道现在敏捷开发日趋流行, 其实敏捷开发也是顺应市场的对价值的诉求和日益复杂的业务而产生的方法论, 敏捷开发是追求高质量软件的方法论和过程。 本文将和大家一起探讨软件质量的含义,以及敏捷开发中如何进行高质量软件 的开发。 软件质量的理解 首先,我们先来看看什么是软件产品质量?先有了软件质量定性的了解,才能 介绍如何影响、控制和改进质量。 大师温伯格在《质量?软件?管理系统思维》说到:“质量就是软件产品对于 某个(或某些)人的价值”(某个或某些人文章中统称之为用户),这里面包含两个层次的质量含义,即“正确的软件”及“软件运行正确”: 1.“正确的软件”是说,一个软件要能够满足用户的需求,为用户创造价值 此处的价值可以体现在两个方面,即为用户创造利润或者减少成本。如果一个软 件能够满足需求的用户群体越大、创造的利润越大或减少的成本 越大,则该软件产品的质量越高。反之,一个产品尽管运行良好,没有 Bug,扩展性很强,性能很好,但如果没有服务的用户人群,没有为用户 创造价值,则这样的软件尽管运行良好,也无任何质量可言。 2.“软件运行正确”是说软件没有或很少Bug,扩展性很强,性能良好,易 用性高等。这样的软件是一个运行良好的软件,但还不能称之为高质量 的软件。只有在软件符合用户的需求的基础上,运行良好的软件,才是 一个高质量的软件。当然,如果软件完全符合用户需求,但不易使用, 经常出错,性能很差,这样的软件也不是一个高质量的软件。 “正确的软件”及“软件运行正确”二者相辅相成,前者关系到软件的成败, 后者关系到软件的好坏。在现实的很多开发团队中,特别是偏技术的开发团队中,往往过分注重后者(软件的Bug率,性能,可扩展性,架构等),经常陷入在软件开发过程的细节之中,而忽略了前者(软件需要符合用户的需求),开发出的软件经常能用但无用,不是最终用户期望的软件,这样的软件是能用但无用零质量软件。 在产品开发中,能用但无用的现象尤为明显。产品和项目不一样,项目往往是 为某个客户而开展,有特定的需求来源,而产品往往是一个更广泛的概念,是

相关文档
相关文档 最新文档