欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

软件构造 课堂笔记5

程序员文章站 2022-03-10 14:15:25
...

本文主要来源于ppt,省略了一部分我觉得没用的地方


子程序设计

可取的内聚性(由高到低)

  1. 功能内聚性

    一个子程序仅执行一项操作

  2. 顺序内聚性

    子程序内包含需要按特定顺序执行的操作,这些步骤共享数据 ,只有全部执行完毕后才完成一项完整的功能

    例:

    // 根据出生日期计算退休时间
    func1() {
     1. 根据出生日期计算员工**年龄**
     2. 根据**年龄**计算退休时间
    }

    这就是顺序内聚,可以改成功能内聚

    // 根据出生日期计算员工年龄
    func2() {
     根据出生日期计算员工年龄
    }
    
    // 根据出生日期计算退休时间
    func3() {
     func2();
     根据年龄计算退休时间
    }

  3. 通信内聚性

    在一个子程序中,两个操作只是使用相同数据,而不存在其它任何联系

    例:

    // 从用户记录中获取用户的姓名和电话号码
    GetNameAndChangePhoneNumber();

    两个操作: 1. 获取姓名 2. 修改电话号码

    相同数据: 比如说通过用户id查找用户,那么相同数据就是用户id

  4. 临时内聚性

    因为需要同时执行的原因才被放入同一个子程序

    例:

    StartUp() {
     读取一个配置文件
     初始化一个临时文件
     建立内存管理
     显示初始化屏幕
    }

    可以修改成这样:

    GetConfig() {
    读取一个配置文件 
    }
    InitTemp() {
    初始化一个临时文件
    }
    MemManage() {
     建立内存管理
    }
    InitDisplay)() {
     显示初始化屏幕
    }
    
    StartUp() {
     GetConfig();
     InitTemo();
     MemManage();
     InitDisplay();
    }

    不可取的内聚性

    1. 过程内聚性

      当子程序中的操作是按某一特定顺序进行的,就是过程内聚性

      • 过程内聚性VS顺序内聚性
      • 顺序内聚性中的顺序操作使用的是相同数据
      • 过程内聚性中的操作使用的并不是相同数据

      例如:

      过程内聚性

      PrintReport() {
      1. 打印销售收入报表操作
      2. 打印支出报表操作
      3. 打印雇员名单报表操作
      4. 打印客户名单报表操作
      }

      功能内聚性

      FileOperation() {
      1. 打开文件操作
      2. 读文件操作
      3. 处理文件内容操作
      4. 输入结果操作
      5. 关闭文件操作
      }

    2. 逻辑内聚性

      若干操作被放入一个子程序中,通过传入的控制标志选择执行其中的一项操作

      例:

      InputData(用户名,雇员时间卡信息,库存数据) {
      if(用户名) {
      对用户名进行处理
      } else if(雇员时间卡信息) {
      对雇员时间卡信息进行处理
      } else if(库存数据) {
      对库存数据进行处理
      } else {
      进行其他操作
      }

      如果把里面的语句换成函数,那么是可以的,但是语句是不行的

      如果代码仅由一系列if或case语句,以及调用其他子程序的语句组成,那么通常也是可以的,如果只发布命令,不做任何处理,成为“事件处理器”

    3. 偶然内聚性

如何使用子程序参数

  • 按照 输入——修改——输出 的顺序排列参数
  • 对参数采用某种表示输入、修改、输出的命名规则
    • 如加上i_、m_、o_前缀
  • 使用所有的参数
  • 不要把参数用做工作变量 // 不要为了省内存就直接把变量拿来存储其他的值,万一需要用到的时候找不到
  • 在接口中对参数的假定加以说明
    • 同时在子程序的内部和调用子程序的地方说明
    • 断言assertion比注释好