四川大学软件学院课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《四川大学软件学院课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 四川大学 软件 学院 课件
- 资源描述:
-
1、第6讲 设计工程补充:关于学习方法心有疑随札记就人问求确义节选自:弟子规.余力学文回顾:非功能性需求o非功能线性需求(质量属性):n可承载性:系统或用例的可承载性表述了在给定时间内系统能够被使用的次数。n安全:数据/信息安全。n紧急程度:用例的紧急程度。n使用与响应的频率:理解使用频率有助于设计人员明白需要花费多大的努力来进行代码优化。n可用性:可用性是人界界面设计关注的内容,直接关系到系统的有效部署和可接受性方面的问题。n可靠性:可靠性包括了有效性、从错误中恢复的能力和精确性。n可维护性:软件的可维护性是指维护人员为纠正软件系统出现的错误或缺陷,以及为满足新的要求而理解、修改和完善软件系统的
2、难易程度。n可扩展性:软件环境的变化(可能是业务环境,运行环境)导致软件要进行改动才能满足人们对它的要求,这种系统本身适应变化的能力就是可扩展性。n主要内容o 6.1 设计工程n6.1.1为什么要设计?n6.1.2软件设计是建模活动的最后一个软件工程活动 o 6.2 设计模型的元素-体系结构元素o 6.3设计模型的元素-构件级设计o 6.4设计模型的元素-用户界面设计o 6.5设计模式o 6.6小结o 6.7习题与思考题 6.1.1设计工程:为什么要设计?o 本节内容 n 6.1.1.1取决于“需求模型的特点”n 6.1.1.2“用代码来表达设计”难以展现体系结构的全貌n 6.1.1.3设计之
3、所以重要在于它允许在软件实现前评估软件的质量6.1.1设计工程:为什么要设计?o 6.1.1为什么要设计?n 6.1.1.1取决于“需求模型的特点”n 6.1.1.2“用代码来表达设计”难以展现体系结构的全貌n 6.1.1.3设计之所以重要在于它允许在软件实现前评估软件的质量6.1.1设计工程:为什么要设计?6.1.1.1取决于“需求模型的特点”o 问题陈述:绘制一个迷宫,迷宫由多个房间组成,每个房间由4面组成,当你在一个房间试图进入一扇门,门开着,则进入另一个房间;否则,就碰壁。6.1.1设计工程:为什么要设计?6.1.1.1取决于“需求模型的特点”MazeAddRoom()RoomNo()
4、RoomEnter()SetSide()GetSide()roomNumberWallEnter()DoorEnter()isOpen1*10.40.44 class Room public:Room(int roomNo);void Enter();void SetSide(Direction,?private:int _roomNumber;Wall _wall4;Door _door4;其中,用枚举类型Direction来指定房间的东南西北:enum Direction North,South,East,West 6.1.1设计工程:为什么要设计?6.1.1.1取决于“需求模型的特点”c
5、lass Room public:Room(int roomNo);void Enter();void SetSide(Direction,Side*);Side*GetSide(Direction)const;private:int _roomNumber;Side*_sides4;MazeAddRoom()RoomNo()RoomEnter()SetSide()GetSide()roomNumberSideEnter()DoorEnter()isOpen1*14WallEnter()6.1.1设计工程:为什么要设计?6.1.1.1取决于“需求模型的特点”MazeAddRoom()RoomN
6、o()RoomEnter()SetSide()GetSide()roomNumberSideEnter()DoorEnter()isOpen1*14WallEnter()MazeAddRoom()RoomNo()RoomEnter()SetSide()GetSide()roomNumberMapSiteEnter()DoorEnter()isOpen1*WallEnter()14MazeGameCreateMaze()MazeAddRoom()RoomNo()RoomEnter()SetSide()GetSide()roomNumberMapSiteEnter()DoorEnter()isOp
7、en1*WallEnter()14RoomDoorMazeGameCreateMaze()WallMazeo 创建一个有2个房间的迷宫6.1.1设计工程:为什么要设计?6.1.1.1取决于“需求模型的特点”Class MapSite/抽象类 public:/纯虚函数 virtual void Enter()=0;Class Room:public MapSite public:Room(int roomNo);MapSite*GetSide(Direction)const;void SetSide(Direction,MapSite*);virtual void Enter();private
8、:MapSite*_sides4;int _roomNumber;enum Direction North,South,East,West);Class Wall:public MapSite public:Wall();virtual void Enter();Class Door:public MapSite public:Door(Room*=0,Room*=0);virtual void Enter();Room*OtherSideFrom(Room*);private:Room*_room1;Room*_room2;bool _isOpen;Room1Room2int main()M
9、azeGame game;game.CreateMaze();return 0;Class Maze public:Maze();void AddRoom(Room*);Room*RoomNo(int)const;private:/Class MazeGame public:MazeGame();Maze*CreateMaze();private:/int main()MazeGame game;game.CreateMaze();return 0;Room1Room2int main()MazeGame game;game.CreateMaze();return 0;Room1Room2Ma
10、ze*MazeGame:CreateMaze()Maze*aMaze=new Maze;Room*r1=new Room(1);Room*r2=new Room(2);Door*theDoor=new Door(r1,r2);aMaze-AddRoom(r1);aMaze-AddRoom(r2);r1-SetSide(North,new Wall);r1-SetSide(East,theDoor);r1-SetSide(South,new Wall);r1-SetSide(West,new Wall);r2-SetSide(North,new Wall);r2-SetSide(East,new
11、 Wall);r2-SetSide(South,new Wall);r2-SetSide(West,theDoor);return aMaze;Class MapSite/抽象类 public:/纯虚函数 virtual void Enter()=0;Class Room:public MapSite public:Room(int roomNo);MapSite*GetSide(Direction)const;void SetSide(Direction,MapSite*);virtual void Enter();private:MapSite*_sides4;int _roomNumbe
12、r;enum Direction North,South,East,West);Class Wall:public MapSite public:Wall();virtual void Enter();Class Door:public MapSite public:Door(Room*=0,Room*=0);virtual void Enter();Room*OtherSideFrom(Room*);private:Room*_room1;Room*_room2;bool _isOpen;Class Maze public:Maze();void AddRoom(Room*);Room*Ro
13、omNo(int)const;private:/;Class MazeGame public:MazeGame();Maze*CreateMaze();private:/;6.1.1设计工程:为什么要设计?6.1.1.1取决于“需求模型的特点”o 硬编码问题导致重写CreateMaze()函数。RoomRoomWithABombEnchantedRoomDoorDoorNeedingSpellMazeGameCreateMaze()CreateEnchantMaze()CreateBombedMaze()WallBombedWallMaze6.1.1设计工程:为什么要设计?6.1.1.1取决于
14、“需求模型的特点”o 解决办法:抽象工厂模式的结构。AbstractFactoryCreateProductA()CreateProductA()ConcreteFactory1CreateProductA()CreateProductA()ConcreteFactory2CreateProductA()CreateProductA()AbstractProductAProductA2ProductA1AbstractProductBProductB2ProductB1Client6.1.1设计工程:为什么要设计?6.1.1.1取决于“需求模型的特点”MazeFactoryCreateMaze
15、()CreateRoom()CreateDoor()CreateWall()EnchantMazeFactoryCreateRoom()CreateDoor()BoombedMazeFactoryCreateRoom()CreateWall()RoomRoomWithABombEnchantedRoomDoorDoorNeedingSpellMazeGameCreateMaze(f:MazeFactory)WallBombedWallMazeo利用“抽象工厂模式”解决重用问题。MazeAddRoom()RoomNo()RoomEnter()SetSide()GetSide()roomNumbe
16、rMapSiteEnter()DoorEnter()isOpen1*WallEnter()146.1.1设计工程:为什么要设计?6.1.1.1取决于“需求模型的特点”int main()MazeGame game;BombeMazefactory factory;game.CreateMaze(factory);return 0;class Mazefactory public:Mazefactory();/继承与多态性:虚拟函数,可重载 virtual Maze*CreateMaze()const return new Maze;virtual Room*CreateRoom(int n)c
17、onst return new Room(n);virtual Wall*CreateWall()const return new Wall;virtual Maze*CreateDoor(Room*r1,Room*r2)const return new Door(r1,r2);Class MapSite/抽象类 public:/纯虚函数 virtual void Enter()=0;Class Room:public MapSite public:Room(int roomNo);MapSite*GetSide(Direction)const;void SetSide(Direction,M
18、apSite*);virtual void Enter();private:MapSite*_sides4;int _roomNumber;enum Direction North,South,East,West);Class Wall:public MapSite public:Wall();virtual void Enter();Class Door:public MapSite public:Door(Room*=0,Room*=0);virtual void Enter();Room*OtherSideFrom(Room*);private:Room*_room1;Room*_roo
19、m2;bool _isOpen;Class Maze public:Maze();void AddRoom(Room*);Room*RoomNo(int)const;private:/;Class MazeGame public:MazeGame();Maze*CreateMaze(MazeFactory&);private:/;class EnchantedMazeFactory:Mazefactory public:EnchantedMazefactory();/继承与多态性:虚拟函数非纯虚函数,可继承可重载 virtual Room*CreateRoom(int n)const retu
20、rn new EnchantedMazeRoom(n,CastSpell();virtual Maze*CreateDoor(Room*r1,Room*r2)const return new DoorNeedingSpell(r1,r2);protected:Spell*CastSpell()const;class BombedMazeFactory:Mazefactory public:EnchantedMazefactory();/继承与多态性:虚拟函数非纯虚函数,可继承可重载 virtual Room*CreateRoom(int n)const return new RoomWithA
21、Bomb(n);virtual Maze*CreateWall()const return new BombedWall();Maze*MazeGame:CreateMaze(MazeFactory&factory)Maze*aMaze=factory.Createmaze();Room*r1=factory.CreateRoom(1);Room*r2=factory.CreateRoom(2);Door*theDoor=factory.Create Door(r1,r2);aMaze-AddRoom(r1);aMaze-AddRoom(r2);r1-SetSide(North,factory
22、.CreateWall);r1-SetSide(East,theDoor);r1-SetSide(South,factory.Create Wall);r1-SetSide(West,factory.CreateWall);r2-SetSide(North,factory.CreateWall);r2-SetSide(East,factory.CreateWall);r2-SetSide(South,factory.CreateWall);r2-SetSide(West,theDoor);return aMaze;Room1Room2class RoomWithABomb:Room;class
23、 EnchantedMazeRoom:Room;class DoorNeedingSpell:Door;class BombedWall:Wall;6.1.1设计工程:为什么要设计?6.1.1.1取决于“需求模型的特点”o比较int main()MazeGame game;game.CreateMaze();return 0;Room1Room2Maze*MazeGame:CreateMaze()Maze*aMaze=new Maze;Room*r1=new Room(1);Room*r2=new Room(2);Door*theDoor=new Door(r1,r2);aMaze-AddRo
24、om(r1);aMaze-AddRoom(r2);r1-SetSide(North,new Wall);r1-SetSide(East,theDoor);r1-SetSide(South,new Wall);r1-SetSide(West,new Wall);r2-SetSide(North,new Wall);r2-SetSide(East,new Wall);r2-SetSide(South,new Wall);r2-SetSide(West,theDoor);return aMaze;int main()MazeGame game;BombeMazefactory factory;gam
25、e.CreateMaze(factory);return 0;Maze*MazeGame:CreateMaze(MazeFactory&factory)Maze*aMaze=factory.Createmaze();Room*r1=factory.CreateRoom(1);Room*r2=factory.CreateRoom(2);Door*theDoor=factory.Create Door(r1,r2);aMaze-AddRoom(r1);aMaze-AddRoom(r2);r1-SetSide(North,factory.CreateWall);r1-SetSide(East,the
展开阅读全文