J01 引言:面向对象和程序设计
J01 引言:面向对象和程序设计
在一年之前学过一次面向对象的程序设计,上次课程侧重于编程,这次可能会更加侧重一些面向对象和程序设计方法一些,当然,如果课程涉及的话。
软件工程
软件工程是设计
conception
和实施mise en œuvres
软件产品与程序的一系列活动,旨在合理化rationnaliser
软件的生产和维护production et son suivi
。软件工程包括指定
spécifier
、开发développer
和演化软件faire évoluer
的所有活动,同时需要运用方法méthode
、技术technique
、工具outil
并考虑成本coût
。
开发流程
- 领域建模
Modélisation du domaine
:- 例如企业或业务背景建模,独立于特定软件。
- 近似于本体论(Ontology)。
- 需求表达/需求工程
Expression des besoins / ingénierie des exigences
:- 功能需求
FP
:系统必须提供的服务。 - 非功能需求
FC
:运行限制条件。 - 使用不同场景或用例描述待实现的系统。
- 功能需求
- 分析(问题建模
modélisation du problème
) - 设计(解决方案建模
modélisation de la solution
):- 总体设计:定义系统的架构及各模块的接口,与编程语言无关。
- 详细设计:针对每个模块的设计,包括编程语言的选择。
- 编码
Codage
:将算法翻译traduction
为所选编程语言的实现。 - 测试:
- 单元测试
Tests unitaire
- 集成测试
Tests d’intégration
- 单元测试
- 验证与确认
Vérification et validation
:- 验证:软件是否符合规范
- 确认:软件是否满足客户需求
- 验收
Recette
:客户对软件的认可 - 部署
Déploiement
:软件的安装和使用。 - 维护/演化
Maintenance/évolution
(可占总体成本的95%):- 修复性维护
maintenance corrective
- 进化性维护
maintenance évolutive
- 修复性维护
- 文档
Documentation
:记录软件开发和使用信息。 - 项目管理
Gestion de projet
:- 项目计划
planification du projet
- 项目组织
organisation du projet
- 风险管理
gestion des risques
- 质量管理
gestion de la qualité
- 工件管理
gestion des artefacts
- 项目计划
开发模型
- V模型
Cycle en V
需求说明书(cahier des charges |
运行、操作或使用阶段expliutation |
|||
---|---|---|---|---|
需求阶段(Specification du logiciel) |
确定软件的功能需求和性能约束 | →验收→ | 验证阶段(Validation) |
系统层面对整体功能进行验证,确保软件满足客户需求。 |
初步设计阶段(Conception préliminaire) |
确定系统的架构设计、模块划分以及接口定义。 | →测试→ | 集成测试(Intégration) |
各模块之间的接口和协作是否符合系统架构设计的要求。 |
详细设计阶段(Conception détaillée) |
每个模块进行详细的设计,包括算法的具体规范。 | →测试→ | 单元测试(Tests unitaires) |
模块级别的功能进行验证,确保每个模块按照设计要求工作。 |
→编码阶段(Codage) → |
- 螺旋模型
Cycle en spirale
- 需求与目标确定
(Détermination des objectifs)
:每次迭代开始时,明确项目的目标、可能的方案及其约束条件。 - 风险分析
(Analyse des risques)
:针对开发目标进行风险评估,并提出解决方案以降低风险。 - 原型开发
(Prototype)
:通过开发原型验证需求和设计。可以有多个原型(如Proto 1, Proto 2, Proto 3)。 - 实施与验证
(Conception, vérification et validation)
:在此阶段对项目的设计、编码和测试进行迭代。
统一过程 Rational Unified Process
- 迭代与增量式。
- 以用例为导向。
- 以架构为核心。
- 以风险为驱动。
敏捷方法Méthodes Agiles
- 项目管理与执行的实践集合。
- 敏捷宣言
(Agile Manifesto)
:- 个体和互动 高于 流程和工具
- 工作的软件 高于 详尽的文档
- 客户合作 高于 合同谈判
- 响应变化 高于 遵循计划
软件工艺(Software Craftsmanship, 2009)
- 不仅关注个人与团队的互动,还关注专业社区的建设。
- 不仅追求可运行的软件,还追求良好设计的软件。
- 不仅强调与客户的合作,还追求富有成效的合作关系。
- 不仅适应变化,还强调持续创造价值。
面向对象
经典方法
Approche classique
:基于功能的分解décomposition fonctionnelle
。面向对象方法
Approche objet
:基于协作实体的分解décomposition en entités collaborantes
。
对象 objet
对象是系统中的实体
existence
,对象为系统中的其他对象提供服务rend des services
,其演变不会影响系统的其他部分(前提是其提供的服务不变)。
对象 = 状态 état
+ 行为
comportement
+ 身份
identité
- 状态:由对象的历史决定。
- 行为:定义对象提供服务的方式。
- 身份:即使两个对象具有相同的状态和行为,依然是两个独立的对象。
状态
对象的状态由以下两部分组成:
- 一组属性(名称和值),用于根据其规范提供预期的服务。
- 一组命名的、永久或临时的链接,指向其他对象,以便请求其服务。链接通常通过一个属性来实现,该属性记录了相关对象的身份。
对象的身份通常被认为是一个隐式属性(对象知道自己的身份)。
行为
- 特定服务通过某一操作定义,并由方法实现。
- 一个对象(发送者)通过发送包含所需操作及必要参数的消息,向另一个对象(接收者)请求服务。
- 接收对象激活相应的方法。
- 消息可以是同步或异步的,并可以有或没有响应。
接口,协议,封装
接口与协议 interface & protocole
- 协议(
protocole
)是一个对象所提供的一组操作。 - 两个对象可以有相同的协议(操作,
opérations
),但不一定有相同的行为(方法,méthodes
)。 - 接口(
interface
)是一组操作(通常语义上相关联的操作)。 - 一个协议可以包含一个或多个接口。
封装 encapsulation
- 对象保存其状态(属性和关联)并提供服务(方法)的方式是独立的。它的客户端不需要了解这些细节(也不应该依赖这些细节)。
- 抽象(
abstraction
,隐藏非重要细节)要求使用封装(encapsulation
)。 - 封装的优势:
- 应用的演进
Evolution de l’application
,可复用性Réutilisation
,调试Mise au point
。
- 应用的演进
类,继承,抽象类,多态
- 类(
classe
)是定义结构(属性列表)和行为(方法定义)的一种机制,用于描述一组对象。- 一个对象被称为其类的实例(
instance
),类负责创建对象(实例化,instanciation
)。 - 属性和关联的定义与类的方法一起构成了类的特性(
caractéristiques
)。
- 一个对象被称为其类的实例(
泛化 / 特化 Généralisation / spécialisation
- 泛化(
généralisation
)表达的是“是一种”(is-a
)的关系,可以在集合视角中表示包含关系。- 具体来说,是一个通过超类
super-classe
将其特性继承héritage
给一个或多个子类sous-classes
的机制,从而形成类的层次结构。 - 子类可以添加属性、方法,或者重新定义超类的方法。
- 具体来说,是一个通过超类
- 替换原则
Principe de substitution
:如果 B 是 A 的特化,则每个 B 都是一个 A。 - 多继承
Héritage multiple
:一个类可以继承多个类。 - 委托
délégation
- 某些语言支持面向对象的编程,但不支持继承。在这些情况下,超类特性可以通过委托来替代:一个对象请求另一个对象代为提供所需服务。
- 即使在支持继承的语言中,委托也可以作为一种有用的技术。
抽象类 Classe abstraite
- 抽象类:无法实例化,用于在子类中复用其定义的属性。
- 抽象方法:没有关联实现的方法;包含至少一个抽象方法的类必须是抽象类。
- 一个接口可以看作是仅包含抽象方法(以及常量)的抽象类。
- 一个类可以继承其他类并实现接口;一个接口可以继承其他接口。
多态 polymorphisme
- 多态(
polymorphisme
)一词源于古希腊语:πολλοί
(polloí
,意为“多个”)和μορφος
(morphos
,意为“形式”)。- 多态是指在不同类型的数据上使用相同代码的能力。
- 同一条消息可以发送给两个不同的对象(属于不同的类):这就是接收对象上的多态(通常需要一个共同的超类)。
- 具体来说,面向对象允许为同一操作定义两个不同的方法。