版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章软件设计本章学习目标1.了解软件设计的主要目标。2.掌握有关软件设计的基本概念。3.掌握结构化软件设计的基本方法。4.重点掌握面向对象设计方法。5.掌握软件详细设计方法。6.掌握人机交互界面设计的基本原则。7.了解软件设计模式的基本概念软件工程中的设计1结构化设计2面向对象的设计3用户界面设计4软件设计优化5序言
20世纪90年代初,MitchKapor发表的“软件设计宣言”中这样写道:什么是设计?设计就是你身处两个世界——技术世界和人类的目标世界,而你尝试将这两个世界结合在一起……序言软件设计是软件工程过程中的核心技术。在这个阶段,软件工程师设计出软件的“蓝图”,创建各种软件模型,让这些模型能正确反映出客户的需求,并为系统实现提供软件体系结构、数据结构、接口和构件的细节。序言
面向对象的软件设计方法把OOA阶段得到的需求模型进行逐步扩充:把类或对象进一步修改和细化,设计属性、方法,以及类或者对象之间的联系,由一组协同工作的对象共同完成整个系统功能。面向对象的设计模型一般包括四个部分:问题论域、人机交互、任务管理和数据管理。6.1软件工程的设计6.1.1设计原理
在传统软件工程方法学中形成的软件设计的基本原理,在面向对象设计时依然成立,此外还增加了一些与面向对象方法特征相关的新特点。(1)模块化
在软件工程领域,软件可以被划分成为一系列独立命名、可处理的部件,有时也被称为模块。6.1软件工程的设计6.1.1设计原理(1)模块化
在过程化语言中过程、函数、子程序、宏等都可以看作模块。在面向对象程序设计中的类或类的方法也可以称之为模块。
模块化将复杂系统分解为可管理的模块。这种处理问题的方式体现了设计中“关注点分离”的概念,即希望将复杂问题分解为可以独立解决和(或)优化的若干块,从而使得这个复杂问题能够更容易地被处理。6.1软件工程的设计图6-1模块化和软件成本6.1软件工程的设计(2)抽象
抽象是人类在认识复杂现象过程中使用的一种思维工具。它把无数现象中相似的方面集中和概括起来,暂时忽略它们之间的差异,提取出事物的本质特征。抽象通过抑制不必要的细节,同时强调和集中在当前重要的细节来达到逐步求精的目标。6.1软件工程的设计(3)信息隐蔽信息隐蔽是指在设计和确定模块时,使得一个模块内包含的信息对于不需要这些信息的其他模块来说,是不可访问的。(4)模块的独立性模块独立性是模块内部各部分及模块间关系的一种衡量标准。模块独立性概念是模块化、抽象概念和信息隐蔽的直接结果,也是完成模块设计中需要遵循的基本标准。模块独立性可以使用两个定性的标准评估:内聚性和耦合性。6.1软件工程的设计
模块的内聚性反映了某个模块相关功能的强度,是信息隐蔽概念的自然扩展。一个内聚的模块执行一个独立的任务,与程序的其他部分部件只需要很少的交互。简单地说,一个内聚的模块应该只完成一件事情。模块的耦合性显示了模块间的相互依赖性,表明了在软件结构中多个模块之间的相互连接程度。耦合性依赖于模块之间的接口复杂性、引用或进入模块所在的点以及什么数据通过接口传递等因素。6.1软件工程的设计表6-1模块的内聚内聚级别(低到高)内聚名称定义1偶然性内聚
如果一个模块内部各部分之间没联系,即使有也很松散,则称该模块为偶然性内聚2逻辑性内聚
模块把几种相关功能代码组合在一起,每次调用时,由传给模块的判定参数来确定该模块应执行哪一种功能,则称该模块为逻辑性内聚模块3时间性内聚
如果一个模块内部的几个功能必须在同一时间内执行(例如一个初始化模块),但这些功能只是因为时间因素关联在一起,则称该模块为时间性内聚模块4过程性内聚
如果一个模块内部的处理成分是相关的,且必须以特定的次序执行,则称该模块为过程性内聚6.1软件工程的设计续表6-1模块的内聚内聚级别(低到高)内聚名称定义5通信性内聚
如果一个模块内部的各部分功能使用相同的输入数据,或者产生相同的输出数据,则称该模块为通信内聚模块6功能性内聚
如果一个模块中各个部分都是完成某一具体功能必不可少的组成部分,或者说该模块中所有部分都是为了完成一项具体功能而协同工作,紧密联系,不可分割,则称该模块为内聚模块7信息性内聚
如果模块能够完成多个功能,各个功能都在相同的数据结构上操作,每一项功能有一个唯一的入口点,代码相对独立。这个模块将根据不同的要求,确定执行哪一个功能,则称该模块为信息性内聚模块6.1软件工程的设计表6-2模块的耦合耦合级别(低到高)耦合名称定义1内容耦合
如果一个模块直接修改另一个模块的数据,或直接跳转入另一个模块,则称这两个模块之间存在着内容耦合2公共耦合
如果两个模块都访问同一个公共数据环境,并且该公共数据环境是全局数据结构、共享的通信区、内存的公共覆盖区等,则称这两个模块之间存在着公共耦合3控制耦合
如果一个模块通过传递开关、标志、名字等控制信息,明显地控制选择另一模块的功能,则称这两个模块之间存在着控制耦合4标记耦合
如果两个模块通过参数表传递记录信息,并且这个记录是某一数据结构的子结构,不是简单变量,则称这两个模块之间存在着标记耦合6.1软件工程的设计续表6-2模块的耦合耦合级别(低到高)耦合名称定义5数据耦合
如果一个模块访问另一个模块,彼此间通过简单数据参数来交换输入、输出信息,并且这里的简单数据参数不同于控制参数、公共数据结构或外部变量,则称这两个模块之间存在着数据耦合6非直接耦合
如果两模块间没有直接关系,之间的联系完全是通过主模块的控制和调用来实现的,则称这两个模块之间不存在耦合,或者称为存在非直接耦合
在软件设计中,要尽可能保持模块内部的高内聚和模块之间的低耦合。6.1软件工程的设计6.1.2设计过程
软件设计的主要任务是要解决“如何做”的问题。在软件设计过程中一般要完成数据/类、软件体系结构、接口、构件级和部署级几个基本设计模型的创建。
数据设计或者类设计:首先以用户或者客户看待数据的角度来创建数据模型和(或)信息模型,然后通过逐步求精将其转化为特定于实现的表示,例如应用级别的数据库或者业务级别的数据仓库等。6.1软件工程的设计
体系结构设计:定义软件主要结构元素之间的关系、可用于达到系统所定义需求的体系结构风格、设计模式以及影响体系结构实现方式的约束。
接口设计:定义了软件和协作系统之间、软件和使用人员之间的通信。
构件级设计:将软件体系结构的结构元素变换为对软件构件的过程性描述。构件通常是指“系统中模块化的,可部署和可替换的部件,封装了实现并对外开放一组接口”。
部署级设计:规划如何将软件功能和子系统分布在物理计算环境中。6.1软件工程的设计图6-2从需求模型到设计模型的转化6.2结构化设计6.2.1结构化设计主要步骤图6-3结构化设计的基本流程6.2结构化设计步骤1:进一步分析和审查需求分析阶段得到的数据流图。步骤2:根据系统的数据流图形式来确定系统的数据处理方式属于“变换型”还是“事务型”。步骤3:根据不同数据处理类型,参照不同的方式,逐步给出初始的系统结构图。步骤4:利用启发式规则(如模块的耦合性)多次修改,得到最终的系统结构图。6.2结构化设计步骤5:根据需求分析阶段得到的数据字典和实体关系图进行数据库设计或者是数据文件设计。步骤6:根据数据流图中对加工的说明、输入输出说明进行模块的接口设计。步骤7:使用详细设计工具(如程序流程图、PDL、盒图等)描述模块内部的详细设计。步骤8:制定测试计划。
典型的数据流类型有变换型数据流和事务型数据流,根据不同数据流类型,可以转化成不同的系统结构。6.2结构化设计(1)变换型数据流映射图6-4变换型数据流图6.2结构化设计(1)变换型数据流映射图6-5具有变换型特征系统的模块结构图6.2结构化设计(2)事务型数据流映射图6-6具有事务处理中心的数据流6.2结构化设计图6-7具体有事务型特征的系统结构图6.2结构化设计
首先对系统的模块进行划分,通过系统结构图来表示模块之间组成,然后用程序描述语言(ProgramDesignLanguage,简称PDL)来描述模块内部详细设计,并给出数据库表的部分简单设计。6.2.2结构化设计实例6.2结构化设计(1)系统结构图图6-8智慧教室管理系统结构图6.2结构化设计(2)模块详细设计//用户管理PDLvoidlogin(String角色,String用户名,String密码){switch(角色)case管理员:if(verify(用户名,密码)==true){//verify将账号密码与数据库对应信息对比
页面跳转到"管理员页面";}else{
页面跳转到错误页面;}break;case用户或操作员或调度员或维修员:if(verify(账号,密码)==true){//verify将账号密码与数据库对应信息对比
页面跳转到对应角色页面;}else{
页面跳转到错误页面;}}6.2结构化设计(2)模块详细设计booleanregister(String用户类型,String用户名,String密码){if(userIsExist()){returnfalse;}else{//add_to_database将信息添加到数据库add_to_database(用户类型,用户登录名,密码);returntrue;}}
UserInfosaveUser(String用户名){UserInfouserInfo=null;userInfo=save_database(用户名);returnuserInfo;}6.2结构化设计(2)模块详细设计booleanupdateUser(String用户类型,String用户登录名,String密码,其他信息){if(userIsExist()==false){//用户是否存在returnfalse;}else{//更新数据库信息update_database();returntrue;}}booleandeleteUser(String用户名){//更新数据库信息if(userIsExist()==false){//用户是否存在returnfalse;}else{update_database();returntrue;}}6.2结构化设计(3)数据设计表6-3学生表结构字段名字段类型描述约束studentIdvarchar学号主键namevarchar姓名不为空passwordvarchar密码不为空sexvarchar男or女stateinteger用户状态(可用/不可用)不为空gradeClassvarchar学生所在班级faceFeatureblob人脸特征avatarvarchar头像permissionvarchar权限phoneNumbervarchar手机号6.2结构化设计(3)数据设计表6-4教师表结构字段名字段类型描述约束teacherIdvarchar学号主键namevarchar姓名不为空passwordvarchar密码不为空sexvarchar男or女stateinteger用户状态(可用/不可用)不为空faceFeatureblob人脸特征avatarvarchar头像permissionvarchar权限phoneNumbervarchar手机号6.2结构化设计(3)数据设计表6-5楼管表结构字段名字段类型描述约束buildingIdvarchar学号主键namevarchar姓名不为空passwordvarchar密码不为空sexvarchar男or女stateinteger用户状态(可用/不可用)不为空locationvarchar楼管管理的大楼permissionvarchar权限phoneNumbervarchar手机号6.2结构化设计(3)数据设计表6-6系统管理员表结构字段名字段类型描述约束adminIdvarchar工号主键namevarchar姓名不为空passwordvarchar密码不为空sexvarchar男or女stateinteger用户状态(可用/不可用)不为空permissionvarchar权限6.2结构化设计(3)数据设计表6-7教室表结构字段名字段类型描述约束roomIdinteger教师号主键locationvarchar教室所在大楼位置不为空statusinteger状态(可用/正在使用)不为空字段名字段类型描述约束deviceIdinteger设备编号主键namevarchar设备名不为空typevarchar设备类型不为空runStatusvarchar是否正在运行不为空roomIdinteger所在房间id外键表6-8设备表结构6.2结构化设计(3)数据设计表6-9课程表结构字段名字段类型描述约束courseIdinteger课程号主键namevarchar课程名称不为空teacherIdinteger责任教师id外键couresHoursinteger课时creditfloat学分introvarchar课程简介6.2结构化设计(3)数据设计表6-10教学班表结构字段名字段类型描述约束classIdinteger教学班号主键namevarchar教学班名称不为空courseIdinteger课程号不为空、外键studentNuminteger学生数量不为空classRoomIdinteger上课房间号外键teacherIdinteger主讲教师id外键Scheduledatatime上课时间不为空6.2结构化设计(3)数据设计表6-11云课堂表结构字段名字段类型描述约束cloudIdinteger云课堂编号主键classIdinteger教学班id外键startTimedatetime开始时间不为空endTimedatetime结束时间不为空videoPathvarchar视频路径文件不为空字段名字段类型描述约束noteIdinteger白板笔记编号主键cloudIdinteger云课堂id外键imgPathvarchar图片文件路径不为空noteTimedatetime笔记时间不为空表6-12白板笔记录表结构6.2结构化设计(3)数据设计表6-13考勤记录表结构字段名字段类型描述约束attenIdinteger记录编号主键userIdinteger学生id外键classIdinteger教学班id外键arrTimedatetime到课时间不为空stateinteger状态(正常/申诉/接受申诉/拒绝申诉)不为空6.2结构化设计(3)数据设计表6-14请假记录表结构字段名字段类型描述约束leaveIdinteger记录编号主键userIdinteger学生id外键classIdvarchar教学班id外键infodatetime请假说明不为空createTimedatatime请假时间stateinteger状态(未审核/批准/拒绝)不为空6.3面向对象的设计面向对象设计的步骤概括如下:步骤1:细化重组类。步骤2:细化和实现类间关系,明确其可见性。步骤3:增加属性,指定属性的类型与可见性。步骤4:分配职责,定义执行每个职责的方法。步骤5:对消息驱动的系统,明确消息传递方式,避免对象之间的关系数目日益膨胀,形成复杂的网状结构。步骤6:利用设计模式进行优化设计步骤7:画出详细的类图与时序图。6.3.1面向对象软件设计的步骤6.3面向对象的设计面向对象设计还有如下启发式规则:(1)设计结果应该清晰易懂①用词一致。②使用已有的协议。③减少消息模式的数量。④避免模糊的定义。(2)一般—特殊结构的深度应适当6.3面向对象的设计(3)设计简单的类①避免包含过多的属性。②有明确的定义。③尽量简化对象之间的协作关系。④不要提供太多服务。(4)使用简单的消息传递(5)使用简单的服务(6)把设计变动减至最小6.3面向对象的设计(1)类的调整和详细设计6.3.2面向对象软件设计实例表6-15智慧教室系统中的部分实体类及其重要属性、基本方法类名属性基本方法方法说明用户User-userId:String-name:String-sex:String-password:String-state:integer-userType:String-permission:List-faceFeature:Blob-faceInfo:String+login():void+getPermission():List+getFaceFeature():Blob+getFaceInfo():String+setUserInfo():void登录验证获取权限获取人脸特征获取人脸信息设置用户信息6.3面向对象的设计续表6-15智慧教室系统中部分实体类类名属性基本方法方法说明学生Student(父类:User)-gradeClass:String-avatar:String-phoneNumber:String+getgradeClass():String+setStudentInfo():void获取学生班级设置学生信息教师Teacher(父类:User)-avatar:String-phoneNumber:String+getRelClass():String+setTeacherInfo():void获取相关课程设置教师信息楼管BuildingManagement(父类:User)-location:String+getLocation():String+updateLocation():boolean+setBuildingManagementInfo():void获取管理大楼更改管理大楼设置楼管信息系统管理员SystemManagement(父类:User)+insertUser():boolean+deleteUser():boolean+updateUser():boolean+returnUserInfo():String+setSystemManagementInfo():void新建一个用户删除一个用户修改用户信息返回用户信息设置系统管理员信息6.3面向对象的设计续表6-15智慧教室系统中部分实体类类名属性基本方法方法说明设备Device-deviceId:integer-name:String-type:String-runStatus:boolean-roomId:String+freshStatus():boolean+updateStatus():boolean+insertDevice():boolean+deleteDevice():boolean+getDeviceInfo():String+setDeviceInfo():void+checkDevice():boolean+repairDevice():boolean刷新设备状态更改设备状态增添设备删除设备返回设备信息设置设备信息检查设备维修设备环境设备EnvironmentDev(父类:Device)-direction:integer+getTemperature():float+getHumidity():float+setEnvironmentDeviceInfo():void获取环境温度获取环境湿度设置环境设备信息6.3面向对象的设计续表6-15智慧教室系统中部分实体类类名属性基本方法方法说明摄像头Camera(父类:Device)-direction:integer+openCamera():boolean+stopCamera():boolean+setDirection():void+setCameraInfo():void开启摄像头关闭摄像头设置摄像头角度设置摄像头信息教室ClassRoom-roomId:integer-location:String-status:integer-relDev:List+updateStatus():boolean+updateRoom():boolean+getRoomInfo():String+insertRoom():boolean+getRelDev():List+updateRelDev():boolean+setClassRoomInfo():void更新使用状态更新教室信息返回教室信息添加教室获取设备列表更新设备列表设置教室信息6.3面向对象的设计续表6-15智慧教室系统中部分实体类类名属性基本方法方法说明教室ClassRoom-roomId:integer-location:String-status:integer-relDev:List+updateStatus():boolean+updateRoom():boolean+getRoomInfo():String+insertRoom():boolean+getRelDev():List+updateRelDev():boolean+setClassRoomInfo():void更新使用状态更新教室信息返回教室信息添加教室获取设备列表更新设备列表设置教室信息课程Course-courseId:integer-teacherId:integer-name:String-courseHours:integer-credit:float-intro:String+insertCourse():boolean+deleteCourse():boolean+updateCourse():boolean+getCourseInfo():String+setCourseInfo():void添加课程删除课程更新课程信息获取课程信息设置课程信息6.3面向对象的设计续表6-15智慧教室系统中部分实体类类名属性基本方法方法说明教学班Class-classId:integer-name:String-classRoomId:integer-courseId:integer-studentId[]:integer+addStudent():boolean+getStudentList():List+setClassInfo():void增加学生获取学生列表设置教学班信息人脸库FaceDB-faceId:integer-faceFeature:Blob+addFaceFeature():boolean+deleteFaceFeature():boolean+setFaceDBInfo():void添加人脸特征删除人脸特征设置人脸库信息6.3面向对象的设计续表6-15智慧教室系统中部分实体类类名属性基本方法方法说明考勤Attendance-attenId:integer-userId:integer-courseId:integer-arrTime:datetime-state:integer+insertAtten():boolean+updateAtten():boolean+deleteAtten():boolean+analysisAtten():String+appealAtten():boolean+acceptAtten():boolean+setAttendanceInfo():void添加到课记录更新到课记录删除到课记录获取统计结果申诉到课记录接受申诉到课设置考勤信息
在确定每一个类的具体属性后,在设计相关类的具体方法时需要注意如下几点:①需考虑所有用户信息的增、删、改、查功能,设定相应的方法。6.3面向对象的设计②确认上课时首先将所有学生考勤状态设置为缺勤,将已请假并通过审批的学生考勤状态设置为已请假。上课过程中摄像头自动捕捉学生头像进行匹配,匹配后更新当前课堂对应学生的考勤记录。//用户类详细设计publicclassUser{privateStringuserId;//用户IDprivateStringname;//用户名称privateStringsex;//用户性别privateStringpassword;//用户密码privateStringstate;//用户状态privateStringuserType;//用户类型privateStringpermission;//用户权限privateStringfaceFeature;//人脸特征privateStringfaceInfo;//人脸信息6.3面向对象的设计publicvoidlogin(Stringname,Stringpassword,StringuserType){switch(用户类型)case学生:if(verify(账号,密码)==true){//verify将账号密码与数据库对应信息对比
页面跳转到"学生页面";}else{
页面跳转到错误页面;}break;case教师或楼管或系统管理员:if(verify(账号,密码)==true){//verify将账号密码与数据库对应信息对比
页面跳转到对应角色页面;}else{
页面跳转到错误页面;}}6.3面向对象的设计publicListgetPermission(Stringname,StringuserType){if(userIsExist()==false){//用户是否存在returnnull;}else{permissionList=getUserPermissionByType(name,userType);returnpermissionList;//根据用户和类型返回权限列表}}
publicStringgetFaceFeature(Stringname,StringuserTpye,Stringpermission){if(userIdExit()==false){//用户是否存在returnnull;}elseif(userHasPermission()==false){//用户是否有权限returnnull;}else{StringfaceFeature=getUserFaceFeature(name,userType,permission);returnfaceFeature;//根据用户类型和权限返回人脸特征}}6.3面向对象的设计publicStringgetFaceInfo(Stringname,StringuserTpye,Stringpermission){if(userIdExit()==false){//用户是否存在returnnull;}elseif(userHasPermission()==false){//用户是否有权限returnnull;}else{StringfaceInfo=getUserFaceInfo(name,userType,permission);returnfaceInfo;//根据用户类型和权限返回人脸信息}}
publicvoidsetUserInfo(Useruser){if(userIdExit()==true){//用户是否存在setUserInfo(user);//设置有用信息}}}6.3面向对象的设计表6-16智慧教室系统中的部分控制类设计类名属性基本方法方法说明云课堂CloudClass-cloudId:integer-courseId:integer-startTime:datetime-endTime:datetime+insertCloud():boolean+deleteCloud():boolean+getVideo():Blob+analysisCloud():List添加一条课堂信息删除一条课堂信息获取课堂录像获取统计分析结果人脸考勤FaceAttendance-unsignStudents:List-signStudents:List+getFaceMatch(StringstudentId):boolean+addFaceFeature():boolean+deleteFaceFeature():boolean+matchFace():int+getStudentByFace():Student+saveToAttendance():void返回指定学生是否考勤添加人脸特征删除人脸特征匹配人脸图像根据人脸获取学生信息保存学生考勤信息6.3面向对象的设计续表6-16智慧教室系统中的部分控制类设计类名属性基本方法方法说明用户管理UserManage-userType:integer+addUser(Stringname,Stringinfo,IntegeruserType):boolean+updateUser(Stringuserid,Stringinfo,IntegeruserType):boolean+deleteUser(Integeruserid,IntegeruserType):boolean+searchUser(Integeruserid,IntegeruserType):String+changePassword(Stringusername,Stringpassword,IntegeruserType):boolean+changePermission(Stringname,Stringpermission,IntegeruserType):boolean添加用户更新用户信息删除用户查询用户信息修改用户密码修改用户权限6.3面向对象的设计//matchFace方法:将视频单帧图片的人脸信息与学生信息库的当前课堂应到学生人脸数据进行匹配,得到考勤记录publicintmatchFace(Listfaces,ListsignStudentFaces){foreach(faceinfaces){FaceAttendancefaceAttendance=newFaceAttendance();if(isInUnsignStudents(face,signStudentFaces)){//若该人脸在未签到的学生人脸集合中unsignStudents.remove(face);//从未签到的学生人脸集合中移除Studentstudent=faceAttendance.getStudentByFace(face);//根据人脸获取学生信息signStudents.add(student);//将该学生添加至已签到学生集合中
}}faceAttendance.saveToAttendance(signStudents);//存储到考勤信息库
returnfaceAttendance.count();}6.3面向对象的设计(2)协作图的精化图6-9教师查询考勤记录协作图迭代6.3面向对象的设计(3)顺序图的精化图6-10精化后的人脸考勤用例顺序图6.4用户界面设计
用户界面又称人机界面,是人与计算机之间传递和交流信息的媒介。用户界面设计是一项涉及技术、艺术和心理学等学科交叉融合的工作,最终实现用户对计算机系统的应用。6.4用户界面设计TheoMandel在1997年提出了界面设计的三条黄金规则。
(1)用户操纵控制
允许用户操作控制的原则:
①以不强迫用户进入不必要的或不希望的动作的方式来定义交互
模式。
②提供灵活的交互。
③允许用户交互可以被中断和撤消。
④当用户技能级别增加时,界面设计应该变得更加流畅和高效,并
允许定制交互。
⑤使用户与内部技术细节隔离开来。
⑥设计应允许用户与出现在屏幕上的对象直接交互。6.4.1黄金规则6.4用户界面设计(2)减少用户的记忆负担
减少用户记忆负担的设计原则:
①减少对短期记忆的要求。
②建立有意义的缺省。
③定义直观的快捷方式。
④界面的视觉布局应该基于真实世界的象征。
⑤以不断进展的方式揭示信息。6.4用户界面设计(3)保持界面一致
帮助保持界面一致性的设计原则:
①允许用户将当前任务放入有意义的语境。
②在应用系列内保持一致性。
③如过去的交互模型已建立起了用户期望,除非有迫不得已
的理由,不要改变它。6.4用户界面设计
分析和设计用户界面时要考虑四种不同的模型:软件工程师创建的设计模型、工程师创建的用户模型、终端用户的心理模型(终端用户对未来系统的假想)、系统实现后得到的实现模型(系统映象)。
这四种模型可能相差甚远,界面设计人员的任务就是消除这些差距,导出一致的界面表示。6.4.2用户界面设计过程6.4用户界面设计
用户界面的分析和设计过程是迭代的,包括四个框架性活动:用户、任务和环境分析及建模;界面设计;界面构造;界面确认。
用户界面开发始于一组分析任务:用户分析、任务分析、显示内容分析和环境分析。6.4.2用户界面设计过程6.4用户界面设计(1)用户分析:设计人员要抓住用户的特征,发现用户的需求。(2)任务分析:需要定义用户任务和行为。(3)显示内容分析:界面显示内容是在用户任务分析确认后对不同数据对象进行的描述。(4)环境分析:需要清楚界面必须操作的物理结构和社会结构。6.4用户界面设计界面设计过程的步骤可以概括如下:(1)使用界面分析中获得的信息,通过创建和分析用户场景来定义一组界面对象和作用于对象上的动作,为创建屏幕布局提供基础。(2)定义导致用户界面状态发生变化的事件,并对行为建模。(3)按照最终用户实际看到的那样,描述每个界面状态,并进行屏幕布局。(4)简要说明用户如何从界面提供的信息来获得系统状态的解释。
在这个过程中,用户界面的设计具体内容可能包括:系统启动封面设计、软件框架设计、软件按钮设计、软件面板设计、菜单设计、标签设计、图标设计、滚动条设计、状态栏设计、安装过程设计以及产品包装等。6.4用户界面设计
目前主流的交互方式是WIMP交互界面。WIMP是窗口(Windows)、图标(Icon)、选单(Menu)、指针选取(PointingDevice)这4个英文单词的缩写,表示WIMP交互界面中所依赖的4种元素。6.4.3
GUI设计规则6.4用户界面设计6.4.3
GUI设计规则
图形用户界面设计的基本原则是要遵循用户需求,具体实施的原则每个机构可能有所不同,一般都会要求遵循以下规则:
(1)一致性
(2)通用性
(3)功能性
(4)视觉组织结构
(5)减轻短期记忆负担
(6)预防操作错误,有效反馈
(7)风格创新性,鼓励探索6.5面向对象软件设计优化
为了让这些类的设计在未来能更适应变更并减少变更带来的副作用的传播,在面向对象方法研究中形成了如下基本的设计原则。
(1)单一职责原则(SimpleResponsibilityPrinciple,简称SRP)
就一个类而言,应该仅有一个引起它变化的原因。
(2)开—闭原则(Open-ClosedPrinciple,简称OCP)
一个软件实体应当对扩展开放,对修改关闭。6.5.1软件设计原则6.5面向对象软件设计优化
(3)里氏代换原则(LiskovSubstitutionPrinciple,简称LSP)
一个软件实体如果使用的是一个基类的话,那么一定适用于其
子类。应当尽量从抽象类继承,而不是从具体类继承。
(4)依赖倒置原则(DependenceInversionPrinciple,简称DIP)
抽象不应当依赖于细节,细节应当依赖于抽象。
(5)接口隔离原则(InterfaceSegregationPrinciple,简称ISP)
一个类对另外一个类的依赖是建立在最小的接口上,使用多个
专门的接口比使用单一的总接口要好。6.5.1软件设计原则6.5面向对象软件设计优化
(6)合成/聚合复用原则(Composite/AggregateReuse Principle,简称CARP)
在一个新的对象里面使用一些已有的对象,使之成为新对
象的一部分;新对象通过向这些对象的委派达到复用的目的。
(7)迪米特法则(LawofDemeter,简称LoD)
一个对象应当对其他对象有尽可能少的了解。6.5.1软件设计原则6.5面向对象软件设计优化
软件设计模式是为特定设计环境中重复出现的设计问题提供的一个解决方案,是面向对象软件的设计经验总结。通常一个软件设计模式有四个基本要素:
(1)模式名称(patternname):助记名,用来描述模式的问题、解决方案和效果。
(2)问题(problem):描述了应该在何时使用该模式。
(3)解决方案(solution):描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。
(4)效果(consequences):描述了模式应用的效果及使用模式应权衡的问题。6.5.2软件设计模式6.5面向对象软件设计优化
按照设计模式目的——即反映模式是干什么的,可以将23种设计模式分成三类:
(1)创建性模式(creational):这类模式封装动态产生对象的过程和所使用的类的信息,解决系统在创建对象时,抽象化类的实例化过程。
(2)行为性模式(behavioral):这类模式处理类和对象间的交互方式和任务分布,主要解决算法和对象之间的责任分配问题,描述对象或类以及它们之间的通信模式。
(3)结构性模式(structural):这类模式考虑如何组合类和对象构成较大的结构。使用继承来组合接口或实现新类,或使用对象合成来实现新功能。6.5面向对象软件设计优化
以外观模式(Facade)来举例说明。
外观模式(又称门面模式)提供一个高层次的接口,使得子系统更易于使用。就如同接待员一样,外观模式的门面类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与门面对象交互,而不需要与子系统内部的很多对象交互。图6-11外观模式结构图6.5面向对象软件设计优化
以智慧教室管理子系统的一个例子来说明外观模式的作用。智慧教室管理子系统由用户管理系统、教室管理系统、考勤管理系统和设备管理系统组成。智慧教室管理子系统的操作人员需要经常审核、调配各个子系统的内容。6.5面向对象软件设计优化图6-12不使用外观模式的类图6.5面向对象软件设计优化图6-13使用外观模式的类图总结1.了解软件设计的主要目标。2.掌握有关软件设计的基本概念。3.掌握结构化软件设计的基本概念。4.重点掌握面向对象设计方法。5.掌握软件详细设计方法。6.掌握人机交互界面设计的基本原则7.了解软件设计模式的基本概念第7章
软件实现与测试•掌握软件质量的概念•了解代码规范•了解代码重构•理解软件测试的相关概念和模型•理解测试自动化•掌握几种重要的黑盒和玻璃盒测试方法•了解测试驱动的开发TDD•了解软件集成方式软件实现并不等同于编码。软件实现包括编码、代码审查、单元测试、集成测试、缺陷跟踪和纠错等一系列过程。学习目标高质量软件开发基本方法1代码规范2软件测试3测试驱动开发TDD4集成57.1高质量软件开发的基本方法软件质量是贯穿软件生命周期的一个极为重要的问题。(1)建立软件过程规范
一个软件过程定义了软件开发中采用的方法,还包含该过程、
中应用的技术方法和自动化工具。(2)软件复用
复用(Reuse)简单来说就是指“利用现成的东西”。早期的软件复用主要是代码级复用,后来逐步扩大到需求、设计、代码、文档、领域知识、开发经验、设计决策、体系结构等与软件产品相关的各方面。(3)软件评审
软件评审(Review)是在软件生命周期内所实施的对软件本身的评审,是对软件元素或者项目状态的一种评估,以确定其是否与计划的结果保持一致,并使其得到改进。评审方法已经被业界广泛采用并取得了很好的效果,它被普遍认为是软件开发的最佳实践之一。评审可以比测试更早地发现并消除工作成果中的缺陷,而越早消除缺陷就越能降低开发成本。7.1高质量软件开发的基本方法(4)软件测试
软件测试(SoftwareTesting)是一种实际输出与预期输出之间审核或者比较的过程。测试与评审的主要区别是前者要运行软件而后者不必执行软件。(5)软件质量保证
软件质量保证的目的是提供一种有效的人员组织形式和管理方法,通过客观地检查和监控“过程质量”与“产品质量”,从而实现持续地改进质量。软件质量保证小组在项目开始时就一起参与建立计划、标准和过程。7.1高质量软件开发的基本方法7.2代码规范7.2.1代码规范的重要性每一个高质量代码的背后,一定存在着一份优秀的代码规范。代码规范是针对特定编程语言约定的一系列规则,包括开发约定、编程实践、编程原则和最佳实践等。代码规范的重要性体现在以下几个方面:
(1)促进团队合作
(2)有效减少软件缺陷数量、降低维护成本
(3)有助于代码审查
(4)有助于程序员自身的成长代码规范7.2.2常见的代码规范代码规范的制定往往包含命名规则、格式、控制语句、面向对象编程(OOP)规约、集合处理、并发处理、注释、异常处理、日志、数据库相关规约等多个方面,部分可能的代码规范。
1)命名规范①类名使用UpperCamelCase风格(大驼峰形式)。例如TonyHall、XmlService、TcpUdpDeal,避免使用tonyHall、XMLService、TCPUDPDeal。②方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase风格(小驼峰形式)。例如localInput、getMessage()、outputUserId。7.2代码规范③常量命名全部大写,单词间用下划线隔开。例如MAX_USER_COUNT。④抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类的名称开始,以Test结尾。⑤包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。例如com.baidu.map.util。⑥如果使用到了设计模式,建议在类名中体现出具体模式,有利于代码阅读者快速理解架构设计思想。例如ProductFactory(工厂模式)、DataObserver(观察者模式)。
7.2代码规范2)格式规范①大括号的使用约定。如果是大括号内为空,则写成{}即可,不需要换行;如果是非空代码块则:左大括号前不换行;左大括号后换行;右大括号前换行;右大括号后还有else等代码则不换行;右大括号后为空必须换行。②if/for/while/switch/do等保留字与左右括号之间必须加空格。③任何运算符左右必须加一个空格。运算符包括赋值运算符、逻辑运算符、加减乘除符号等。④代码块缩进4个空格。⑤单行字符数不超过120个,超出需要换行,换行时相对上一行缩进4个空格。⑥方法参数在定义和传入时,多个参数逗号后边必须加空格。7.2代码规范(3)OOP规范(针对Java编程语言)①避免通过一个类的对象引用访问此类的静态变量或静态方法,直接用类名访问即可。②所有的覆写方法,必须加@Override注解。③所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较。④构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,放在init方法中。⑤类成员与方法访问控制从严:a.如果不允许外部直接通过new来创建对象,构造方法必须是private。b.类非static成员变量并且与子类共享,必须是protected。c.类非static成员变量并且仅在本类使用,必须是private。d.类static成员变量如果仅在本类使用,必须是private。e.若是static成员变量,必须考虑是否为final。f.类成员方法只供类内部调用,必须是private。g.类成员方法只对继承类公开,那么限制为protected。7.2代码规范(4)控制语句规范①在一个switch块内,每个case或者通过break/return来终止,或者利用注释说明程序将继续执行到哪一个case为止;在每个switch块内,都必须包含一个default语句并且放在最后,即使该语句后没有代码。②在if/else/for/while/do语句中必须使用大括号,即使只有一行代码,避免使用下面的形式:if(condition)statements。③循环体中的语句要考量性能,以下操作尽量移至循环体外处理,如定义对象、变量、获取数据库连接、不必要的try-catch操作。④当一个条件判断(if、while)比较复杂,请写好注释。⑤尽量少采用取反逻辑运算符。取反逻辑不利于快速理解。例如使用if(x<365)来表达x小于365,避免使用if(!(x>=365))。7.2代码规范(5)注释规范(针对Java编程语言)①类、类属性、类方法的注释必须使用/*内容*/格式。②所有的抽象方法(包括接口中的方法)必须要注释、除了返回值、参数、异常说明外,还必须指出该方法做什么事情,实现什么功能。③方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释使用/**/注释,注意与代码对齐。④所有的枚举类型字段必须要有注释,说明每个数据项的用途。⑤代码修改的同时,注释也要进行相应的修改。⑥谨慎注释掉代码。⑦注释力求精简准确、表达到位,避免过多过滥的注释。7.2代码规范7.2.3代码重构代码重构通常是指在不改变代码对外表现的情况下,修改代码的内部功能特征,从而改善软件质量,使程序的设计模式和架构更趋合理,更容易被理解,提高软件的可扩展性和可维护性。很多人认为重构浪费时间,影响项目进度,其实重构不仅可以让代码更加健壮,而且从长远来看,还可以加快项目进度。7.2代码规范(1)以查询取代临时变量:图7-1以查询取代临时变量7.2代码规范(2)搬移函数或字段:图7-2搬移函数或字段7.2代码规范(3)提炼类:图7-3提炼类7.2代码规范(4)以常量取代字面数值:图7-4以常量取代字面数值7.2代码规范(5)简化嵌套条件表达式:图7-5简化嵌套条件表达式7.2代码规范(6)使用异常替换返回错误码:图7-6使用异常替换返回错误码7.27.3软件测试GlenfordJ·Myers在《软件测试的艺术》中提出了关于软件测试的多个重要观点,对该领域产生了深远的影响:(1)测试是为了发现程序中的错误而执行程序的过程。(2)好的测试方案在于它能发现迄今为止尚未发现的错误。(3)成功的测试是发现了至今为止尚未发现的错误的测试。(4)测试并不仅仅是为了找出错误。(5)没有发现错误的测试也是有价值的。
7.3.1软件测试介绍软件测试为了尽可能发现软件中的错误,提高软件产品的质量,在软件测试的实践中应把握以下基本测试原则:(1)测试用例中的一个必需部分是对预期输出或结果进行定义。(2)程序员应当避免测试自己编写的程序。(3)编写软件的组织不应当测试自己编写的软件。(4)应当彻底检查每个测试的执行结果。7.3软件测试(5)测试用例的编写不仅应当根据有效和预期的输入情况,而且也应当根据无效和未预料到的输入情况。(6)检查程序是否“未做其应该做的”仅是测试的一半,测试的另一半是检查程序是否“做了其不应该做的”。(7)应避免测试用例用后即弃,除非软件本身是一个一次性的软件。(8)计划测试工作时不应默许假定不会发现错误。(9)程序某部分存在更多错误的可能性,与该部分已发现错误的数量成正比。7.3软件测试广义的软件测试必须贯穿在软件生命周期的始终,测试对象应该包括软件设计开发的各个阶段的内容。狭义的软件测试的分类,即开发阶段的测试和程序测试,如下:(1)按照开发阶段划分
①单元测试
②集成测试
③系统测试
④确认测试
⑤验收测试
7.3.2软件测试分类7.3软件测试(2)按照测试实施组织划分
①开发方测试:也叫α测试
②用户测试:也叫β测试
③第三方测试(3)按照测试与需求的关系划分
①功能测试
②非功能测试7.3软件测试(4)按照是否需要运行程序划分
①静态测试
②动态测试(5)按照测试技术划分
①玻璃盒测试
②黑盒测试
③灰盒测试7.3软件测试为了节省人力、时间或硬件资源,提高测试效率,自动化测试往往是十分必要的。但是自动化测试不适用于一些特殊定制型项目、周期很短的项目以及包含有复杂业务规则的项目,或者其涉及物理交互的部分。目前对自动化测试理解还存在如下误区:(1)自动化测试可以完成一切测试工作。(2)测试工具可适用于所有的测试。(3)测试工具能使工作量大幅降低。(4)测试工具能实现百分百的测试覆盖率。(5)自动化测试工具容易使用。
7.3.3自动化测试7.3软件测试自动化测试工具有很多,其大致分类如下:(1)负载压力测试工具(2)功能测试工具(3)玻璃盒测试工具(4)网络测试工具(5)测试管理工具
7.3软件测试测试模型将测试活动进行抽象,明确了测试与开发之间的关系,是软件测试管理的重要依据。(1)V模型
7.3.4软件测试模型单元测试集成测试系统测试验收测试编码详细设计概要设计需求分析图7-7V模型7.3软件测试(2)W模型图7-8W模型开发组工作测试组工作详细设计测试编码实现单元测试集成测试系统测试验收测试概要设计测试需求测试模块集成系统构建系统安装详细设计概要设计需求分析7.3软件测试(3)H模型图7-9H模型7.3软件测试(1)黑盒测试
①等价类划分法等价类划分主要解决如何选择适当的数据子集来代表整个数据集的问题,通过降低测试用例的数量去实现合理的“覆盖”,以此来发现更多的软件缺陷。例如:一个基于整数运算的简单计算器程序。当需要测试它是否能正确运行时,如果程序能够正确地计算“1+1”和“2+3”的和,那么是否还有必要测试“8+9”的和,或者“80000+90000”的和呢?
7.3.5黑盒和玻璃盒测试7.3软件测试②边界值分析法长期的测试经验告诉我们,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入或输出范围的内部。边界值(BoundaryValues)分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。7.3软件测试边界值分析法与等价类划分的区别为:a.边界值分析不是从某等价类中任意选择一个作为代表,而是使这个等价类的每个边界都要作为测试条件。b.边界值分析不仅要考虑输入条件,还要考虑输出空间产生的边界情况。例如程序包含一个输入值,其合法取值是从1到10的数字,那么显然边界值测试会取0和11这两个不合法的数字,以及1和10这两个“刚好”合法的数字,来验证位于输入边界附近的数值会不会被系统接受。7.3软件测试(2)玻璃盒测试玻璃盒测试关注的是测试用例执行的程度或覆盖程序逻辑结构的程度。玻璃盒测试的测试方法有代码检查、静态分析法、逻辑覆盖法、基本路径测试法、符号测试等。逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖。publicvoidRoutine(intA,intB,intX){ if(A>1&&B==0) X=X+B; if(A==2||X>1) X=X*A;}7.3软件测试①语句覆盖最初的逻辑覆盖想法是将程序中的每条语句至少执行一次,即语句覆盖。这虽然是玻璃盒测试中较弱的覆盖标准,但是同样也具备了初步检查出错误的能力。要实现语句覆盖,上述程序只需要一个测试用例,(A=5,B=0,X=8)就可以遍历到每一条语句。②判定覆盖判定覆盖(也称分支覆盖)相对语句覆盖而言是较强一些的逻辑覆盖。判定覆盖要求必须编写足够的测试用例,使得每一个判断都至少有一个为真和为假的输出结果。也就是说,每条判定路径都必须至少遍历一次。在小程序Routine中,满足判定覆盖的两个测试用例可以是(A=3,B=0,X=3)和(A=1,B=0,X=1)。7.37.4测试驱动开发TDD
测试驱动开发(TestDrivenDevelopment,简称TDD)是敏捷开发中的一项核心实践和技术。测试驱动开发的基本思想就是在开发功能代码之前,先编写测试代码,然后只编写使测试通过的功能代码,从而以测试来驱动整个开发过程的进行。这种开发方式与传统开发方式刚好相反。在明确要开发某个功能后,TDD首先要思考如何对这个功能进行测试,并快速编写出针对该功能的测试代码,测试代码只定义这个功能的外部接口,而非具体的实现细节。7.4.1TDD基本概念测试驱动开发TDD7.4.2TDD实施步骤开始成功增加一个测试运行一个测试改变一些代码运行这个测试失败失败成功图7-10TDD开发过程7.4测试驱动开发TDD7.4.3基于单元测试的TDD实例(Java)需求描述:通过一个矩形的长和宽来计算其面积和周长。(1)打开Eclipse。(2)创建RectangleTest类。publicclassRectangleTestextendsjunit.framework.TestCase{}7.4测试驱动开发TDD(3)根据需求描述,在RectangleTest中创建矩形对象,分别添加计算矩形面积和周长的测试方法,以及长和宽分别为2和3的具有正确输入和输出的测试用例。publicclassRectangleTestextendsjunit.framework.TestCase{Rectanglerectl=newRectangle();publicvoidtestArea(){assertEquals(6,rectl.Area(2,3));}publicvoidtestPerimeter(){assertEquals(10,rectl.Perimeter(2,3));}}7.4测试驱动开发TDD(4)运行测试用例,编译失败,错误提示为缺少Rectangle类的定义。于是增加Rectangle类的定义,创建Rectangle.java文件。publicclassRectangle{publicintArea(intlength,intwidth){return0;}publicintPerimeter(intlength,intwidth){return0;}}(5)编译成功,但是运行这个程序,断言显示测试用例失败,因为计算面积和周长的方法的返回值始终为0。7.4测试驱动开发TDD(6)先“傻瓜式”地修改两个函数的返回值,改为return6和return10。重新编译、运行,断言结果为通过。publicclassRectangle{publicintArea(intlength,intwidth){return6;}publicintPerimeter(intlength,intwidth){return10;}}7.4测试驱动开发TDD
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 扬州市职业大学《船舶电站及自动化》2023-2024学年第一学期期末试卷
- 2024年离婚分居夫妻抚养子女合同书版B版
- 2024年教育培训机构合作定金合同范本大全模板3篇
- 2024年度抵押车买卖合同范本(2024年)2篇
- 2024中介个人租房合同范本:商住两用房屋租赁服务协议3篇
- 幼儿园大班美术活动《滴墨印画》教案及说课稿
- 2025二手货车买卖合同
- 2025正规商品买卖合同
- 2025深圳经济特区劳动合同书
- 2024年标准担保公司贷款展期合同范本版
- 最新人教版物理9年级第20章第4节《电动机》市优质课一等奖课件
- 航空气象学-南京信息工程大学中国大学mooc课后章节答案期末考试题库2023年
- 生产车间薪酬管理制度
- 美的空调制造工艺手册
- 大型能源集团公司信息化规划(一)应用系统架构规划课件
- 《三气周瑜》儿童故事绘本ppt课件(图文演讲)
- 2023海南省图书馆公开招聘财政定额补贴人员15人(一)模拟预测(共500题)笔试参考题库附答案详解
- 2022年北京外国语大学博士生英语入学考试试题
- 新《煤矿安全规程》第08讲 《煤矿安全规程》关于爆破事故防治的规定
- 防爆电气设备安全管理规定
- 提高做好群众工作的能力主讲陶通艾
评论
0/150
提交评论