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,意为“形式”)。
    • 多态是指在不同类型的数据上使用相同代码的能力。
    • 同一条消息可以发送给两个不同的对象(属于不同的类):这就是接收对象上的多态(通常需要一个共同的超类)。
  • 具体来说,面向对象允许为同一操作定义两个不同的方法。