软件工程小记——概要设计

第四章 概要设计
概要设计:
    确定软件系统的总体结构,对软件的功能进行分解,把软件划分为模块,确定了每个模块的功能及模块之间的外部接口.

1.概要设计:
    a.概要设计的任务:
        概要设计是觉得系统怎样做,即系统应该如何实现。
    b.定义:
        概要设计从需求分析阶段的工作成果出发,明确可选的技术方案,做好划分软件结构的前期工作,
        然后划分出组成系统的物理元素,并进行软件的结构设计与数据设计,最后编写出本阶段的成果——
        概要设计说明书。
    c.概要设计说明书的核心是:
        目标系统物理方案、软件结构图、数据设计结果。

2.概要设计的主要过程:
    a.寻找可能的系统实现方案;
    b.选择可行的待推荐的系统实现方案;
    c.确定合理的系统实现方案;
    d.设计树形或层次结构的软件结构图;
    
3.概要设计的原理
    3.1
        a.抽象
            抽象就是抽取出事物的本质而暂时忽略其实现细节。
        b.求精
            求精的本质就是集中精力解决主要问题而推迟对问题细节的考虑。
    3.2.模块和模块化
        a.软件概要设计阶段需要将软件分解为多个模块,并通过树形或层次结构来表达模块之间的调用关系。
        b.模块可以被定义为由边界元素限定的相邻程序元素的序列,而且有一个总体标识符代表他。
          模块是构成软件系统的基本元素。
        c.结构化分析方法中,模块可以示:过程、函数、子程序;
        d.面向对象方法中,模块可以是:类;
        e.获取最适合的模块数的方法:模块复杂性度量方法和启发式规则。
        f.模块化的主要优点:
            软件结构更加清晰;
            有助于软件的实现、测试、维护;
            有助于提高软件的可靠性;
            有助于改善软件的质量;
            有助于软件的开发过程的组织和管理;
            
4.耦合与内聚
    4.1 耦合
        a.耦合:耦合是衡量模块间联系紧密程度的度量,是软件结构中模块相互连接的紧密程度。
        b.三个方面来衡量模块间联系:
            方式:块间联系方式,有直接引用、用过程语句调用;
            作用:块间传递的参数类型,有数据型、控制型、混合型(数据/控制);
            数量:块间传递的参数数量;
        c.使模块间联系最小的措施:
            采用过程语句或函数等间接调用方式调用其他模块;
            模块间传递的参数尽量为数据型;
            模块间传递的参数尽量少;
    4.2 常见的耦合种类
        a.非直接耦合
            定义:模块间没有直接的调用关系,而是通过他们共同的父模块发生了非直接关系;
            非直接耦合的耦合度最低,而且软件系统中必须包含该耦合;
        b.数据耦合
            定义:模块之间存在直接的模块调用关系,且模块间通过传递简单参数(不是控制参数、公共数据结构或外部变量)
            发生关系,实现相关功能。
            软件系统中必须包含该耦合;
        c.特征偶尔/标记耦合
            定义:模块之间通过参数传递复杂数据结构而发生调用关系;
            特征耦合的耦合度较高,例如模块间传递数据库记录、数组结构元素、链表结构元素等数据,则发生特征耦合/标记耦合。
        d.控制耦合
            定义:模块之间通过传递控制参数发生调用关系。
            控制耦合高于特征耦合,已属于中等程度的耦合。控制耦合增加了模块间的依赖性,使系统变得复杂。
        e.公共环境耦合
            定义:模块之间通过一个公共数据环境(全局变量、共享的通信区、内存的公共覆盖区、任何存储介质上文件、物理设备等)
                相互作用时,则他们之间就属于公共环境耦合。
            e.1公共环境耦合的耦合度非常高,且随着耦合模块数量增加而显著增加。
            e.2若只有两个模块发生了公共环境耦合,则公共环境耦合可分为:
                松散公共环境耦合:一个模块向公共环境传送数据,另一个模块仅从公共环境中获取数据,它属于一种数据耦合,耦合度较低。
                紧密公共环境耦合:两个模块都既向公共环境传送数据,又从其中获取数据,则这是一种较紧密的耦合,其耦合度介于
                                数据耦合和控制耦合之间。
        f.内容耦合
            定义:四种情况:一个模块访问另一个模块的内部数据;
                            一个模块通过非正常入口进入另一个模块内部;
                            两个模块有部分代码重叠(一般在汇编语言中);
                            一个模块有多个入口。
            内容耦合的耦合度非常高,应该坚决避免。
            
        模块间的耦合遵循如下原则:
            非直接耦合必然存在;
            数据耦合尽可能多地使用;
            控制耦合和特征耦合少用;
            限制公共环境耦合的应用范围;
            完全不用内容耦合;
            
    4.3 内聚
        定义:内聚是衡量模块内部各个组成部分彼此联系紧密程度的度量。
        内聚高则模块内部联系紧密,模块的信息隐藏和局部化设计好,模块的每一部分都是为实现一个特定的功能而结合在一起的。高内聚是一种好的设计。
    4.4 常见的内聚种类
        a.功能内聚
            模块内部所有元素都属于一个整体,他们组合在一起是为了完成某一个独立的功能,则该模块的内聚是功能内聚。
            功能内聚的内聚度最高,评分最高10。
        b.顺序内聚
            模块内部各部分彼此紧密联系,为实现某一个功能结合在一起,并按照顺序方式执行,则该模块的内聚是顺序内聚。
            顺序内聚仅次于功能内聚,评分为9分。
        c.通信内聚
            模块内部的所有元素都使用相同的输入数据或产生相同的输出结果,则是通信内聚。
            属于中等程度的内聚。
        d.过程内聚
            模块内部的所有元素彼此相关,但必须遵循特定的过程次序执行。
            属于中等程度的内聚。
        e.时间内聚
            模块内部的所有组成部分必须在同一时段内执行完成(如所有的初始化或终止工作)。
            属于低等程度的内聚。
        f.逻辑内聚
            模块内部的各组成部分除了通过逻辑变量(也称控制参数)联系之外无任何联系。
            属于低内聚。
            发生逻辑内聚的模块必是从其父模块中接收了逻辑变量,因此,一个模块内部发生了
            逻辑内聚也就意味着模块之间发生了控制耦合。内聚是和耦合相关的。
        g.偶然内聚
            模块内部的所有组成部分完成了一组毫无关联的子任务,这些任务间即使有联系也非常松散,则是偶然内聚。
            偶然内聚的内聚度最低,组成模块的元素之间没有实质性的联系,应用坚决避免。
    4.5模块内聚设计时遵守的规则:
        尽量追求功能内聚;
        少用逻辑内聚好额偶然内聚;
        可以使用顺序内聚和通信内聚;
        
5.模块独立性
    模块独立性的本质就是设计高内聚、低耦合的软件结构。
    独立性的定性标准:内聚和耦合;
    在提高模块内聚的通水也可能会降低模块间的耦合。
    提高模块独立性的主要方法是:分解和合并。
    
6.启发式规则
    a.消除功能重复;
    b.改进软件结构,提高模块独立性;
    c.模块规模要适中;
    d.软件结构图中的深度、宽度、扇出、扇入要合理;
    e.模块的作用域应该在模块的控制域内;
    f.力争降低模块接口的复杂性;
    g.设计单入口、单出口的模块;
    h.模块功能应该可以预测;
    
7.软件结构的设计工具
    7.1 层次图(H图):
        层次图是一种树型结构图,矩形代表模块,连线代表调用关系。自顶向下地描述出了软件系统的软件结构图。
    7.2 HIPO图:由IPO图和H图的基础上发明的。所以也称为层次IPU图,或表示为H图+IPO图。
        HIPO图既描述树型的软件结构关系,又深入模块内部对其调用接口、设计策略等进行描述。
    7.3 结构图:
        结构图是一种树型结构图,可以表达模块之间是如何调用关系和传递数据的。
        结构图包含四种类型的模块:
            传入模块:实现数据从下层模块传入到上传模块;
            传出模块:实现数据从上层模块传出到下层模块;
            变换模块:实现数据的数据变换;
            协调模块:协调传入、传出、变换者三个模块;
    
8.软件结构设计 SD
    8.1软件结构设计是指在需求分析的基础上,将已经细化的数据流图DFD根据映射规则映射成软件结构的层次图或结构图。
        故软件结构化设计是基于对数据流的分析。
    8.2 数据流图中的数据流处理方式:
        a.变换型数据流:
            变换型数据流是指数据以外部世界的形式进入系统,经过变换后再以外部世界的形式离开系统。
            由变换型数据流构成的数据流图则为变换型数据流图。
        b.事务型数据流:
            事务型数据流是指数据流沿着某个输入通路到达一个数据加工之后,该加工根据数据的类型在若干个动作序列中
            选出一个来执行,离开系统。
            
        c.混合型数据流:变换型和事务型结合,以变换为主,事务为辅
            变换分析就是要运用变换分析的方法将变换型数据流图映射成软件结构。
            事务分析就是采用事务分析的方法将事务型数据流图映射成软件结构。
            
9.结构映射:将数据流图中的数据加工转换成软件结构图中的模块,并结合一组规则来确定模块之间的调用关系。

10.变换型数据流图的映射规则
    a.变换型数据流图包括三部分:
        输入部分:即传入部分;
        变换部分:即变换中心;
        输出部分: 即输出部分;
    b.物理输入:直接由外部实体提交给软件系统的一组数据流;
      物理输出:直接由软件系统输出给外部实体的一组数据流;
      逻辑输入:直接由变换型数据流图的输入部分提交给变换中心的一组数据流;
      逻辑输出:直接由变换型数据流图的变换中心提交给输出部分的一组数据流;
    
    c.映射规则1:
        在划分出数据流图的输入部分、变换中心和输出部分之后,首先在软件结构中映射出主模块Cm,
        它抽象地表达目标软件系统,然后映射出输入处理控制模块Ca、变换中心控制模块Ct和输出处理控制模块Ce,
        此时,得到了初始的软件结构。
    d.映射规则2:
        对输入部分的加工进行映射:
    e.映射规则3:对输出部分的映射
    f.映射规则4:对变换中心的映射
    
    
11.事务型数据流图的映射规则
    映射规则1:事务型数据流图包括三部分:输入通路、事务调度中心和活动通路。首先,在软件结构中映射出主模块,
        然后诸葛分支地映射输入通路,接着,映射一个事务调度控制模块,并为每条活动通路映射一个控制模块,
        此时,得到了初始的软件结构。
    映射规则2:对每条活动通路进行映射。
        若未变换型数据流图则依据变换型数据流图的映射规则进行结构设计;若为事务型数据流图则以及事务型数据流图
        的映射规则进行结构设计。直到每条通路映射完毕。
        
12.结构化设计的步骤:
    a.精化数据流图并确定数据流图的类型;
    b.若数据流图是变换型数据流图则逐一确定其输入部分、变换中心、输出部分;
      若数据流图是事务型数据流图则逐一确定其输入通路、事务调度中心、活动通路;
    c.根据映射规则1,完成初始软件结构的设计,即第一级映射;
    d.根据映射规则2、3、4,完成对其他所有加工的映射,得到一个最初的软件结构;
    e.根据模块的独立性原理和启发式规则,对最初的软件结构图进行设计优化,得到最终的软件结构。
    
13.软件结构的设计优化
    a.设计优化的主要依据是模块独立性原理和启发式规则,本质是得到高内聚、低耦合的软件结构关系。
    b.设计优化的主要方法是对模块进行分解和合并。
    

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
接入第三方登录是让用户方便快捷地使用已有账号登录你的网站或应用程序,提高用户体验的一种方式。本文将介绍如何使用 PHP 实现微信公众号第三方登录。 1. 获取微信授权 首先,需要获取微信用户的授权。具体步骤如下: 1)引导用户打开微信授权页面: ```php $appid = 'your_appid'; $redirect_uri = urlencode('http://yourdomain.com/callback.php'); $scope = 'snsapi_userinfo'; $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=$scope&state=STATE#wechat_redirect"; header("Location: $url"); ``` 其中,`$appid` 是你的微信公众号的 AppID,`$redirect_uri` 是授权后回调的 URL,`$scope` 是授权作用域,可以是 `snsapi_base` 或 `snsapi_userinfo`,`$state` 是自定义参数,用于防止 CSRF 攻击。 2)获取授权码: 用户同意授权后,会重定向到 `$redirect_uri` 指定的 URL,带上授权码 `code` 和 `state` 参数。 ```php $code = $_GET['code']; $state = $_GET['state']; ``` 3)获取 access_token 和 openid: 使用授权码 `code` 获取 `access_token` 和 `openid`。 ```php $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$secret&code=$code&grant_type=authorization_code"; $response = file_get_contents($access_token_url); $result = json_decode($response, true); $access_token = $result['access_token']; $openid = $result['openid']; ``` 其中,`$secret` 是你的微信公众号的 AppSecret。 2. 获取用户信息 获取到 `access_token` 和 `openid` 后,可以使用以下代码获取用户信息: ```php $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN"; $response = file_get_contents($userinfo_url); $userinfo = json_decode($response, true); ``` 其中,`$userinfo` 包含用户的昵称、头像等信息。 3. 将用户信息保存到数据库 最后,将获取到的用户信息保存到数据库中,以便下次使用时快速登录。 ```php // 连接数据库 $con = mysqli_connect('localhost', 'username', 'password', 'database'); mysqli_set_charset($con, "utf8"); // 查询用户是否已存在 $sql = "SELECT * FROM users WHERE openid='$openid'"; $result = mysqli_query($con, $sql); if (mysqli_num_rows($result) == 0) { // 用户不存在,插入新用户信息 $nickname = mysqli_real_escape_string($con, $userinfo['nickname']); $headimgurl = mysqli_real_escape_string($con, $userinfo['headimgurl']); $sql = "INSERT INTO users (openid, nickname, headimgurl) VALUES ('$openid', '$nickname', '$headimgurl')"; mysqli_query($con, $sql); } // 保存用户登录状态 $_SESSION['openid'] = $openid; ``` 以上就是使用 PHP 实现微信公众号第三方登录的步骤。需要注意的是,为了确保安全性,应该对用户输入的数据进行过滤和验证,防止 SQL 注入和 XSS 攻击等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值