有关的教材是南大软院用的教材《软件工程与计算》,覆盖大部分软件工程的知识
    
    可用于准备南大软院专业课842的复习,也可应对面试中有关软件工程的知识。
   
    
     1. 什么是设计?
    
    
    设计是一种建造之前的“规划”,包括工程部分,也包含艺术部分。
   
    
     2. 软件设计
    
    
    1) 广义的软件设计
    
    程序代码时对真正软件的规划。编译器负责根据规划建造真正产品,为产生程序代码所进行的一切工作都是设计活动。
    
    好的设计保证质量
    
    2) 狭义的软件设计
    
    为使以软件系统满足规定的需求而定义系统或部件的体系结构,部件,接口和其他特征的过程
   
    
     3为什么要设计?
    
    
    软件开发的最大挑战就是软件的复杂性,所以控制系统复杂度是软件设计方法的核心问题。
   
    
     4软件产品设计
    
    
    软件产品设计是规定软件产品特性,功能和接口以满足用户需求和愿望的活动,需要用户界面,交互设计,沟通,工业设计,市场营销等技能。
   
    
     5软件工程设计
    
    
    软件工程设计是规定程序,子系统以及他们的组成部分和工作方式以满足软件产品规格的活动。需要编程,算法,数据结构,软件设计原则,实践,过程,架构和模式等技能。
   
    
     6.软件设计的层次性
    
    
    高层设计描述系统的高层结构,关注点和设计决策
    
    中层设计关注组成构件的模块的划分,过程之间的调用关系,类之间的协作
    
    低层设计关注具体的数据结构,算法,类型,语句等
   
    
     7.关注点分解:多视点方法
    
    
    常见设计视角
    
    设计视角 设计关注 样例设计语言
    
    上下文 系统服务和用户 Uml用例图
    
    组合 功能分解和运行时分解,子系统的构造,购买vs建造,构建的重用 Uml包图,构件图
    
    逻辑结构 静态结构,类型和实现的重用。最重要的层,子系统,包,框架,类,接口等的概念性组织 Uml类图,对象图
    
    依赖 互联,分享,参数化 包图,构件图
    
    交互 对象之间的消息通讯 顺序图,通信图
    
    动态状态 动态状态的转移 状态图
   
    
     8.软件设计的标准(外部要简洁,内部要坚固)
    
    
    效用:需求(功效是必须的,容易达到的)
    
    坚固:质量(可修改性等)(坚固是设计的重点任务,是合格设计必须的)
    
    美感包括1)简洁性,抽象,归纳,取出噪音(美感是卓越者的素质)
    
    2)结构清新:隐喻显而易见是正确的
    
    3)一致性:用相同的方法做相同的事情
   
    
     9.软件设计过程(软件设计没有严谨,精确地过程
    
    )
    
    1)经验主义:在软件设计过程中添加一些灵活性以应对设计中人的因素,文档化,原型,尽早验证,迭代式开发
    
    2)理性主义:利用模型语言,建模语言,工具支持,将软件设计过程组织成系统,规律的模型建立过程,设计方法学的目标就是不断克服人的弱点,最终得到完美。
   
    
     10.软件设计的演化(迭代)性
    
    
    完美的理性设计不存在,真实的设计过程是演化和迭代的,不是一次完成的。反复迭代,直到最后兼顾了功效,坚固和美感。
   
    
     11.软件设计的决策性 (决策要一致!)
    
    
    决策:为解决一个问题而采取的决定
    
    软件设计是问题求解和决策的过程
    
    决策的影响因素:经验,类似的系统,参考模型,设计约定,设计原理,体系结构风格,设计模式
   
    
     12.区分逻辑设计和物理设计
    
    
    1)物理设计=逻辑设计+介质匹配
    
    2)先逻辑后物理的设计思路,否则,如果介质匹配的复杂度较高,可能会扰乱逻辑设计的思路。
    
    3)物理是逻辑在载体上的实现。物理设计复杂度=事物(逻辑)复杂度+载体与事物的适配复杂度
    
    4)物理实现的载体
    
    《1》低层:基本类型+基本控制结构
    
    《2》中层:oo编程语言机制
    
    类声明,实例创建与撤销,实例生命期管理
    
    类权限控制机制
    
    复杂机制,继承
    
    《3》高层:导入导出和名称匹配
    
    5)比较
    
    基于抽象的体系结构更好的表现系统结构的组织,抓住系统的基本功能和主要协作机制,利用部件和连接件之间的依赖关系将部分有机的联系起来形成整体。
    
    而实现模型更多的考虑实现细节。
   
    
     13.软件体系结构模型:部件+连接件+配置
    
    
    部件:在系统体系结构中封装处理和数据的元素称为软件部件,部件通常提供特定应用的服务,部件主要通过端口(port)元素定义自己的外部可见特征,即部件与外部发生联系的窗口
    
    连接件:定义了部件间的交互。在复杂系统中,交互可能比独立部件的功能更重要且更有挑战性,连接件通过角色(role)元素定义交互参与者的特征
    
    连接件分为显式和隐式
    
    配置:部件和连接件是软件体系结构的独立元素单位,相互没有直接关联,配置是将部件和连接件整合起来的专门机制,配置定义部件端口与连接件角色的适配情况,并以此为基础描述整个软件体系结构
   
    
     14.体系结构风格
    
    
    
     一.主程序与子程序风格
    
    
    《1》部件:程序,函数,模块
    
    《2》连接件:他们之间的调用
    
    《3》约束:(控制从子程序层次结构顶部开始且向下移动)
    
    1)层次化分解,基于定义使用关系,上层使用下层,下层不能使用上层
    
    2) 单线程控制,主程序拥有最初控制权,在使用中将控制权转移到下层
    
    3) 隐含子系统结构,子程序通常合并成模块
    
    4) 层次化推理,子程序的正确性依赖于他所调用的自程序的正确性
    
    《4》实现:实现机制:模块实现,每个子程序都实现为一个模块
    
    主程序/子程序风格是基于部件和连接件建立的高层结构,类似于结构化程序的结构,但是部件不同于程序,是粗粒度的模块,部件的实现模块内部可以用结构化分析方法也可以使用面向对象方法。
    
    《5》效果
    
    1) 特点:功能分解,集中控制
    
    2) 优点:流程清晰,易于理解,强控制性,更好的控制程序的正确性
    
    3) 缺点:强耦合,依赖于交互方的接口,难以修改和复用,隐含的共享数据交流,不必要的公共耦合,破坏“正确性”控制能力
    
    《6》应用:功能可以分解为多个顺序执行步骤的系统
    
    
     二.面向对象风格
    
    
    1)将系统组织成多个对象,每个对象封装其内部的数据,并基于数据对外提供接口
    
    2)部件:对象或模块
    
    3)连接件:功能或调用(方法)
    
    4)约束:
    
    《1》数据表示对于其他对象是隐藏的,信息内聚
    
    《2》对象负责保持数据表示的完整性,以此为基础对外提供“正确”的服务
    
    《3》基于方法调用机制建立连接件,连接对象部件
    
    《4》每个对象都是自主代理,不同对象之间是平级的,没有主次,从属,层次,分解等关系
    
    5) 实现:模块实现,将每个对象部件实现为一个模块,基于面向对象分析的实现,基于结构化方法的实现
    
    6) 应用:适用于核心问题是识别和保护相关结构信息(数据)的应用,数据表示和相关操作封装在抽象数据类型
    
    7) 效果:
    
    优点:可修改性,不影响外界情况下变更内部实现
    
    易开发,易理解,易复用,自治单位,自己负责正确性
    
    缺点:接口的耦合性:方法调用
    
    标识的耦合性:调用其他对象需要知道对象的标识
    
    副作用:难以实现程序的正确性(比如A.B使用C,B对C的修改可能会对A产生不可预期的影响)
    
    
     三.分层风格
    
    
    1)部件:通常是程序或对象的集合
    
    2)连接件:通常是有限可见度下的程序调用或方法调用
    
    3)层次结构,通过分解,将复杂系统划分为多个独立的层次,每一层高度内聚,层与层之间的连接器通过层间交互的协议定义
    
    4)约束:系统组织成层,其中每一层给上一层提供服务,作为下一层的客户端,不允许跨层,层内部件可以交互。逆向调用也是不允许的
    
    5)应用:适用于包含不同类服务的应用,而且这些服务能够分层组织&
   
 
