Mooc软件工程-02面向对象泛型

1 内聚

  模块

    语义上连续的一系列语句, 由边界符界定, 并且有一个聚集标识符

  常见的模块

    在面向对象中的 类, 方法

    在面向过程的 函数

  模块功能单一, 内部交互程度最大, 模块之间交互程度为最小

  模块的内聚: 模块内部的交互程度

  模块的耦合: 模块之间的交互程度

  模块的内聚性从低到高分为7种:

    偶然内聚 --> 逻辑内聚 --> 时间内聚 --> 过程内聚 --> 通信内聚 --> 功能内聚 --> 信息内聚

  软件模块的内聚性越低越差, 越高越好

  1) 偶然内聚: 模块内部的内容毫不相干

    问题: 可读性低, 可维护性低, 可重用性低

    解决: 拆分成不同的模块

  2) 逻辑内聚: 合并后的EFG就是逻辑性内聚

  

    问题: 接口复杂, 内部复杂, 内部难以修改, 效率低, 增加了调用模块和被调用模块的耦合度

  3) 时间性内聚: 在相同时间需要做的一些操作, 但是可能在本质上没有什么关联性

    问题: 模块内部关联度比较弱, 但是和别的模块可能关联性较强, 一般不可重用

  4) 过程内聚: 模块内部操作必须有先后顺序

    问题: 内部之间多个操作不是相互关联的, 只是有先后顺序, 因此该代码不容易被重用

  5) 通信内聚: 模块内部可能有多个操作, 这些操作是基于相同的输入数据或者输出数据

    问题: 主要是重用性较低

  6) 功能内聚:只具有一个功能或者一个操作

    将之前的内容进行拆分形成的

    具有较高的重用性

    纠错修改也比较容易, 减少更少的回归错误

    更加容易扩展

  7) 信息内聚: 执行多个任务, 每个任务都有自己的入口点,相对独立的代码, 并且在相同的数据结构进行操作

  

2 耦合

  模块的耦合, 模块之间的交互程度, 越低越好

  内容耦合 --> 公共耦合 --> 控制耦合 --> 印记耦合 --> 数据耦合

  1) 内容耦合: 一个模块可以直接访问另一个模块内部内容

    实例: 在一个类中, 可以直接访问类中某个变量并且可以进行一系列的操作

class A:
    name = ‘a‘

class B:
    mA = A()
    def setItem(self):
        self.mA.name = ‘aa‘

  2) 公共耦合: 两个模块存取相同的变量(常见的是全局变量)

    尽量减少公共耦合, 尽量减少全局变量的使用, 防止全局变量在多个模块被修改

  3) 控制耦合: 一个模块向另一个模块传递控制参数, 最常见的就是传递开关变量, 而且必然导致被调用模块的逻辑内聚

  

    解决办法, 把逻辑判断模块写到A中, 将B的两个功能拆分成两个模块

  4) 印记耦合: 一个模块传入另一个模块的封装数据, 但是具体在模块中只使用一部分数据

    例如在类A中传入B的对象, 在A中只是使用B的两个成员变量

class A:
    name = ‘a‘
    age = 18
    sex = ‘male‘

class B:
    def setItem(self, obj):
        self.name = obj.name
        self.age = obj.age

b = B( A() )

    问题: 接口不清晰, 如果不通读代码, 不会知道哪些数据是需要的哪些是不需要的, 降低了可读性, 非常难重用

  5) 数据耦合: 所有参数都是同构的参数, 或者简单的数据, 或者是简单的数据结构且内部的数据都被使用

3 数据封装和信息隐藏      

  诸如操作系统的任务队列

  如果对每个操作写成一个模块, 固然是好事, 但是如果操纵的数据结构更改则所有就要更改

  所以形成新一个模块, 给各个操作共同使用一个数据结构

  这样就形成了信息内聚, 也是对数据的一种封装

  数据封装的优势:

    1) 这样的数据结构+数据操作 就形成了数据抽象, 使得编写最开始专注于数据结构和操作, 而不局限于怎么实现某些操作

    2) 在维护上, 数据封装可以使以后代码改动最小化, 减少出现回归错误的出现可能性

  信息隐藏: 对外提供接口, 而隐藏具体的实现细节

4 类的继承

  类: 抽象数据类型

  对象: 类派生出来的实例

  继承: 子类继承父类, 会取得父类所有的公开内容

  在UML中, 继承是用一个空心箭头指向, 被指向的是父类, 指向出去的是子类

    一个类基本由三部分组成, 第一部分是类名; 第二部分是由成员变量组成, 前面加上减号表示; 第三部分是成员函数, 由加号前面表示

  继承之间的关系可以用 is a kind of 来表示

5 类的聚合

  类的聚合是指多个类共同组成了一个大类

  具体有两个例子

  

  

  其中空心菱形表示脱离聚合的大类, 原有组成的小类可以继续存在

  实心菱形表示, 脱离了聚合的大类之后, 原有组成的小类将不可继续存在

6 类的关联和多重性

  类的关联关系是, 两个类之间, 既不是继承也不是聚合也不是组合关系, 两者之间可以通过一个动作来关联, 共同构成了主动宾关系

  如学生上课, 顾客下订单

  

  如果有多个动作关系, 那应该都列举出来, 例如借书的人与书之间的关系有借书, 还书, 续借, 预约

  

  具体在代码中的表现就是, 类中包含其他类的对象

  在描述类之间的关系的时候, 还需要考虑多重性

  也就是一对多, 多对一,多对多等之间的关系, 具体可以查看多重性指示器

  

7 多态与动态绑定

  在运行中, 正确的方法被激活, 这就是动态绑定

  方法可以被不同的类的对象调用, 这也就是多态  

8 面向对象泛型

  抽象数据类型的优势: 信息隐藏, 数据抽象, 过程抽象  

  结构化泛型当程序超过50000行之后, 变暴露出问题了

  此时使用面向对象泛型更为合适

  面向对象泛型主要是基于 将数据和操作绑定到一起; 或者说形成对象, 利用对象来绑定操作

9 UML

  UML 统一建模语言

  UML定义了多种图, 各种图的相互之间的关系如下

  

  用例图

  类图: 分为简单类图和复杂类图(实体类,边界类等详细类图)

  活动图

  状态图

  顺序图: 说明每个用例的具体实现过程

  协作图

  常见的UML工具

    visio; rational rose; magicdraw; argouml等 

时间: 2024-10-16 09:49:14

Mooc软件工程-02面向对象泛型的相关文章

Mooc软件工程-03面向对象分析与设计

1 用例建模 统一过程是目前最好的面向对象泛型 分析工作流, 是为了更深的理解需求, 使设计和实现目标系统更加容易 统一过程覆盖了三种类 实体类(分析工作流涉及到的) 边界类 控制类 面向对象分析的三项工作 用例建模: 目标系统如何来提供功能, 不考虑这些功能的先后顺序, 结果是用例图 类建模: 确定实体类以及实体类的属性, 结果是类图 动态建模: 确定由或者对一个实体类的一些操作, 结果是状态图 用例模型 以用例的形式描述目标系统的功能性需求 主要包括三个元素, 参与者+用例+参与者与用例之间

java面向对象 泛型

这个第一篇知识梳理的博客,希望我可以坚持下去将知识进行总结. 这是在极客学院里看到的视频,目录如下,蛮清晰的.然后我将视频中所说再记忆下. java面向对象之泛型:认识泛型 Java SE 1.5的新特性,泛型的本质是参数化类型,可以代表任何数据类型. java面向对象之泛型:构造函数中使用 class Gen<T>{ private T value; Gen(T value){//构造函数中就泛型就不需要用尖括号了 this.value=value; } public void setVal

软件工程----6面向对象基础

1 面向对象方法概述 面向对象技术是软件工程领域的重要技术.面向对象=对象+类+继承+通信 面向对象的发展历史 1 初始阶段 2 发展阶段 3 成熟阶段 面向对象的软件工程方法:1 面向对象分析 2 面向对象设计 3 面向对象编程 4 面向对象测试 5 面向对象维护 2 面向对象基本概念 对象从不同角度有不同含义.属性是用来描述对象静态特征的一个数据项.服务是用来描对象动态特征的一个操作序列. 类是具有相同属性和服务的一组对象的集合.封装是把对象的属性和服务结合独立的一个系统单位,并尽可能的隐藏

Mooc软件工程-01软件基础和软件过程

1 软件的概念 含义 软件 = code + data + documents 也就是软件的代码, 软件相关的输入输出等数据, 和一切相关的文档 特点 抽象的, 无形的, 逻辑实体 不会被磨损 可以移植 软件是复杂的, 难设计难实现难维护 软件是昂贵的 2 软件危机和软件工程 软件危机 进度成本估算不准确 用户通常对完成的产品不满意 软件的质量通常是不可靠的 软件的可维护性差 没有可用文档 在计算机的比例越来雨大, 但是跟不上计算机的发展 软件工程 软件的实现是一个团队完成的, 这是一个工程项目

【软件工程】面向对象的设计

面向对象分析是获取和认识用户需求,对问题领域进行分析.确认并建立问题域概念模型的一个过程.而面向对象设计(OOD)则是从计算机技术的角度,将分析阶段得到的概念模型转换成软件系统的技术实现方案,并在功能.性能及成本方面满足用户和质量要求的过程.是一个将问题空间中的面向对象模型转换为求解空间中的技术实现模型的过程. 分析是提取和整理用户需求,并建立问题域精确模型的过程.设计则是把分析阶段得到的需求转变成符合成本和质量要求的.抽象的系统实现方案的过程.分析和设计是一个多次反复迭代的过程,许多分析结果可

软件工程----8面向对象设计

1 设计概念 功能模型  动态模型  分析对象模型 设计活动主要分为两个阶段: 1 系统设计 2 详细设计 设计原则 :模块化,耦合度和内聚性.耦合度是两个子系统之间的关联可划分为松散耦合和紧密耦合. 还有复用性. 2 软件体系结构 仓库体系结构:有两种不同的体系部分一个表示当前的中心数据结构和一组相互独立的处理的中心数据结构的子系统 分层体系结构;层次化是一种概念,他将软件设计组成为类或组建的层次或集合 MVC体系结构:在MVC体系结构中,子系统划分为三种不同的类型:模型子系统,视图子系统,控

【软件工程】面向对象的分析

面向对象分析(object-orientedanalysis)简称OOA,就是抽取和整理用户需求并建立问题域精确模型的过程. 1.关键: 识别出问题域内的对象,并分析它们相互间的关系,最终建立起问题域的简洁.精确.可理解的正确模型. 2.目的: 系统分析员应该深入理解用户需求,抽象出系统的本质属性,提取系统需求规格说明,并用模型准确地表示出来. 3.分析过程: 从分析陈述用户需求的文件开始.可能由用户单方面写出需求陈述,也可能由系统分析员配合用户,共同写出需求陈述.接下来,系统分析员应该深入理解

02.List泛型集合

List泛型可以转换成数组 List泛型和数组的相同点: List泛型的数据类型必须是指定的,数组的数据类型也必须是指定的. List泛型和数组的不同点: List泛型的长度是随意的,而数组的长度必须是在声明时就指定. 因为List泛型集合的类型是唯一的,所以List泛型集合可以转换成数组. List泛型集合可以转换成什么类型的数组取决于,List泛型集合是什么类型的. List泛型集合和ArrayList的常用方法大多是一致的. list泛型集合示例代码: namespace _09.List

Mooc数据分析-02数据展示

主要内容是Matplotlib库的基本使用和方法 1 Matplotlib库 1.1 Matplotlib的介绍 Python优秀的数据可视化第三方库 数据可视化就是将数据以特定的图形图像的方式展示出来, 使数据更加的直观明了 范例网站 Matplotlib库是由各种可视化类构成, 内部结构复杂 为了简洁使用, 可以使用matplotlib.pyplot这个绘制各类可视化图形的命令子库, 类似于快捷方式的库来简化操作 导入 import matplotlib.pyplot as plt 同样pl