面向对象的软件工程包括下面几个部分

1.面向对象分析(object oriented analysis ,OOA)

    软件工程中的系统分析阶段,要求分析员和用户结合在一起,对用户的需求做出精确的分析和明确的表述,从大的方面解析软件系统应该做什么,而不是怎么去做。面向对象的分析要按照面向对象的概念和方法,在对任务的分析中,从客观存在的事物和事物之间的关系,归纳出有关的对象(对象的‘特征’和‘技能’)以及对象之间的联系,并将具有相同属性和行为的对象用一个类class来标识。

  建立一个能反映这是工作情况的需求模型,此时的模型是粗略的。

2 面向对象设计(object oriented design,OOD)

    根据面向对象分析阶段形成的需求模型,对每一部分分别进行具体的设计。

    首先是的设计,类的设计可能包含多个层次(利用继承与派生机制)。然后以这些类为基础提出程序设计的思路和方法,包括对算法的设计。用一种更通用的描述工具(如伪代码或流程图)来描述

3 面向对象编程(object oriented programming,OOP)

    根据面向对象设计的结果,选择一种计算机语言把它写成程序,可以是python

4 面向对象测试(object oriented test,OOT)

    在写好程序后交给用户使用前,必须对程序进行严格的测试,测试的目的是发现程序中的错误并修正它。 面向对象的测试是用面向对象的方法进行测试,以类作为测试的基本单元。

5 面向对象维护(object oriendted soft maintenance,OOSM)

    由于使用了面向对象的方法开发程序,使用程序的维护比较容易。 因为对象的封装性,修改一个对象对其他的对象影响很小,利用面向对象的方法维护程序,大大提高了软件维护的效率,可扩展性高。 

python中关于OOP的常用术语

抽象/实现


抽象指对现实世界问题和实体的本质表现,行为和特征建模,建立一个相关的子集,可以用于绘程序结构,从而实现这种模型。抽象不仅包括这种模型的数据属性,还定义了这些数据的接口。

对某种抽象的实现就是对此数据及与之相关接口的现实化(realization)。现实化这个过程对于客户程序应当是透明而且无关的。 

封装/接口

封装描述了对数据/信息进行隐藏的观念,它对数据属性提供接口和访问函数。通过任何客户端直接对数据的访问,无视接口,与封装性都是背道而驰的,除非程序员允许这些操作。作为实现的 一部分,客户端根本就不需要知道在封装之后,数据属性是如何组织的。在Python中,所有的类属性都是公开的,但名字可能被“混淆”了,以阻止未经授权的访问,但仅此而已,再没有其他预防措施了。这就需要在设计时,对数据提供相应的接口,以免客户程序通过不规范的操作来存取封装的数据属性。

注意:封装绝不是等于“把不想让别人看到、以后可能修改的东西用private隐藏起来”

真正的封装是,经过深入的思考,做出良好的抽象,给出“完整且最小”的接口,并使得内部细节可以对外透明(注意:对外透明的意思是,外部调用者可以顺利的得到自己想要的任何功能,完全意识不到内部细节的存在)

合成

合成扩充了对类的描述,使得多个不同的类合成为一个大的类,来解决现实问题。合成讲述了一个异常复杂的系统,比如一个类由其它类组成,更小的组件也可能是其它的类,数据属性及行为, 所有这些合在一起,彼此是“有一个”的关系。

派生/继承/继承结构

派生描述了子类衍生出新的特性,新类保留已存类类型中所有需要的数据和行为,但允许修改或者其它的自定义操作,都不会修改原类的定义。
继承描述了子类属性从祖先类继承这样一种方式
继承结构表示多“代”派生,可以述成一个“族谱”,连续的子类,与祖先类都有关系。

泛化/特化

泛化表示所有子类与其父类及祖先类有一样的特点。特化描述所有子类的自定义,也就是,什么属性让它与其祖先类不同。

多态与多态性



多态指的是同一种事物的多种状态,多态性的概念指出了对象如何通过他们共同的属性和动作来操作及访问,而不需考虑他们具体的类。



自省/反射

自省也称作反射,这个性质展示了某对象是如何在运行期取得自身信息的。如果传一个对象给你,你可以查出它有什么能力,这是一项强大的特性。如果Python不支持某种形式的自省功能,dir和type内建函数,将很难正常工作。还有那些特殊属性,像__dict__,__name__及__doc__

 面向对象实战:


基于面向对象开发程序的开发流程:需求模型->领域模型->设计模型->实现模型

 需求模型之5w1h8c

1. 需求VS功能

需求:客户想要的效果,对客户有价值的事情

功能:系统为了实现客户的价值而提供的能力/功能

举例:

汽车:驾驶是需求,刹车、加速、转弯是功能

打印机:打印是需求,进纸、设定、与电脑连接等是功能

pos机:买单是需求,商品扫描、金额汇总、收银等是功能

2. 需求的重要性

1/3的项目失败或陷入困境是因为需求原因导致的

修复需求错误的问题成本极高

1 编码阶段修复发现一个错误耗费人类是1个单位
2 测试阶段修复需求错误的成本是5-10倍
3 维护阶段(产品上线后),修复需求错误成本是20倍
ps:在需求阶段修复错误,成本只需要0.1-0.2即可
结论:需求错了,几乎要把软件项目重做一遍

3. 需求分析的目的

1 记录员,记录客户的需求
2 分析员,和客户一起分析,完善需求
3 引导员,能够引导客户的需求

4. 需求分析的方法

需求分析518方法,简称我要发,具体就是5w1h8c
5w:
when:用户想在什么时间用,例如半夜备份的任务,很明显我们得知该需求需要自动化执行
where:用户想在什么地方用,如垃圾桶室内和室外的区别,同样的事物放到不同地方用肯定不一样
who:用户想让谁来用,不仅是人,也可以是一个系统
what:用户想要我们程序的输出结果是什么,如图片,文档,系统
why:问一问用户为什么要这么做,包括客户所有觉得不爽的事情(核心) 

1h:

how :用例方法

8c:8个constraint约束
性能performance

性能是系统提供相应服务的效率。主要包括响应时间、吞吐量
性能是很多系统架构设计的关键约束条件之一
例如,同样一个web网站,虽然都是提供信息给用户流量,设计一个日访问量1w的网站与日访问量10亿的网站,二者的设计截然不同

成本cost

成本指为了实现系统而需要付出的代价
成本也是很多系统架构设计的关键约束之一
例如客户只愿意花100w,而我们却设计了一个耗费1000w的系统

时间time

指客户要求什么时候交付

可靠性reliability

指系统长时间正确运行的能力,银行、证券、电信这些公司,对宕机时间要求很严格
安全security

指对信息安全的保护能力,涉及到钱、身份证、社会保险号等需求对这个要求很高

合规性compliance

指满足各种行业标准、法律法规、规范等,例如3C、SOX、3GPP,ITUT

技术性technology

有的客户可能要求我们采用某种技术
例如客户现在都是windows服务器,要求我们基于windows平台开发

兼容性compatibility

指我们的产品与客户其他已有的产品或系统的兼容能力,要知道现在很少有产品是孤立运行的,特别是在大企业、大公司中,多个系统都是相互交互、互相配合的。新的系统必须能够和已有的系统配合,否则将无法运行

注:5w+1h属于功能属性
        8c属于质量属性




三 需求模型之用例的写法

写用例的技巧

三段法:NEA
1 正常处理(normal):分析正常流程
2 异常处理(exception):分析每一步异常情况和对应的处理
3 替代处理(alternative):分析每一步是否有其他替代方法,以及如何做

用例的书写格式

#1. 用例名称
一般情况下,用例名称即需求名称
#2. 场景
场景即用例发生的环境,正好对应5w中的:when,where,who
#3. 用例描述
描述详细的用例内容,对应5w中的what和how
即用户应该怎样做,以及每个步骤中的输出,但不要求每个步骤都有一定的输出,可以有也可以没有,也可以有多个
#4. 用例价值
描述用例对应的客户价值,对应5w中的why
#5. 约束和限制
即真个需求流程中相关的约束和限制条件,对应518方法中的8C

用例编写案例

#用例名
 答题系统

#场景:
    when:8.10开始
    where:北京
    who:linux学院,网络客户

#用例描述:
    1. linux学院提供50道题
    2. 每个客户无需输入任何个人信息就可以参与答题,随机选择20道题,给客户回答,每道题5分,
    3.答题结束后,输入手机号,提交,算总分
    4.60分参与抽奖,<60分赠送基础视频

#用户价值:
    答题有奖,答题提交时输入自己的手机号获取成绩,获得潜在客户的联系方式,为后期将客户转成学员做准备

#约束:
    暂无

四 领域模型

需求分析阶段不区分面向对象还是面向过程,领域模型是完成从需求分析到面向对象设计的一座桥梁

#定义:领域模型是对领域内的概念或现实世界中对象的可视化表示,又称为观念模型,领域对象模型,分析对象模型
#它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系

领域模型主要两个作用:

#1 发掘重要的业务领域概念
#2 建立业务领域概念之间的关系

归纳领域建模的方法就是:

#1 从用例中找名词(找完后需要删除不是领域对象的名词,具体删除什么,与不同领域有关,没有统一标准,靠经验)
#2 加属性(有些属性并没有在用例中明确给出,靠行业经验自己添加)
#3 连关系(画UML图)

五 设计模型

面向对象类设计的具体步骤
    第一步:领域类映射(不是全盘拷贝)
        类筛选:并不是每个领域类都会出现在软件中
        名称映射:对应
        属性映射:对应
        提炼方法:领域类中并没有方法,在用例中找动词
    第二步:应用设计原则和设计模式
    第三步:拆分辅助类(领域类可以在实现阶段拆分为几个类)

六 实现模型

选取一种支持面向对象的语言实现我们的设计

七 答题系统案例

第一步:需求分析(写用例)


#用例名
    答题系统
#场景:
    when:8.10开始
    where:北京
    who:linux学院,网络客户
#用例描述:
   1. linux学院提供50道题
    2.每个客户无需输入任何个人信息就可以参与答题,随机选择20道题,给客户回答,每道题5分,
    3.答题结束后,输入手机号,提交,算总分60分参与抽奖,<60分赠送基础视频
#用户价值:
    答题有奖,答题提交时输入自己的手机号获取成绩,获得潜在客户的联系方式,为后期将客户转成学员做准备
#约束:
    暂无


第二步:领域模型(找名词,加属性,连关系=>出图)

#找名词:
linux学院,题,客户,得分,奖,视频
#筛选:去掉与领域无关的名词。视频应该算作一种奖品
linux学院,题,客户,得分,奖
#加属性
加属性
名词         属性                        备注
linux学院    NA                       对于答题系统来说,并不需要linux学院的属性,因此在领域模型中,linux学院是没有属性的
题          题目编号,题目类型,题目描述,答题选项,正确答案,分数
客户        客户编号,姓名,性别,年龄,手机号
答题记录     记录编号,客户编号,题目编号列表,总分数,时间     通过答题记录就可以知道用户是谁,以及用户答过的题目
奖品        奖品编号,奖品名字
#连关系:画图
1:答题记录是客户与题的关系类,而客户与奖品之间可以建一个关系类,这样以后单查关系类就可以知道谁得了什么奖品
2:找动词:
    创建题目
    随机选择题目
    答题
    提交
    算总分
    抽奖



Python全栈工程师(10:面向对象的软件开发)_面向对象


 

第三步:设计模型

第四部:实现模型

八 UML图

类图中通过加号(+)来表示 public 

通过减号(-)表示 private

通过井号(#)表示 protected