任务7. 3 网上书店项目的编码实现
图7.2用例
②用例(Use Case)
用例就是外部可见的系统功能,是对系统提供服务的描述。用例在用例图中用椭圆来表示,椭圆中间或下方的文字指定用例名称,一般可以用简单的带有动作性的和描述性的词作为用例名称,如图7.2所示。
③子系统(Subsystem)
子系统用来表示系统的某一部分联系紧密的功能,将这部分功能作为子系统,用方框圈定出来,并在方框顶部附上子系统的名称,如图7.3所示。
图7.3 ATM取款机子系统
④关系
用例图中的关系分为关联、泛化、包含、扩展关系,关系是用箭头符号表示的,箭头头部表示启动关系的主动方,尾部表示关系的被动方。它们的使用场合和具体符号如图7.4所示。
图7.4关系类型和图示符号
A.关联(Association)
表示参与者与用例之间的通信,任何一方都可发送或接收消息,箭头指向消息接收方,如图7.5所示。
图7.5关联关系
B.泛化(Inheritance)
泛化即是通常理解用例图中用例或参与者之间的继承关系,子元素将继承父元素的所有结构、行为和关系,父元素通常是抽象的,箭头指向父元素,如图7.6所示。
图7.6泛化关系
C.包含(Include)
包含关系用于将一个较复杂的用例分解成更小的用例,箭头指向被分解出的小用例,如图7.7所示。
图7.7包含关系
D.扩展(Extend)
扩展关系指用例功能的延伸,相当于为基础用例提供一个附加功能,箭头指向基础用例,如图7.8所示。
图7.8扩展关系
3)用例示例
如图7.9所示为用户资料维护子系统。
图7.9用户资料维护子系统的用例图
【任务实施】
(1)需求描述
1)前台功能
A.用户注册:浏览者必须首先注册,成为网上书店系统的注册用户。
B.用户登录:注册用户登录后,才能执行购书(加入购物车、下订单等)操作。
C.用户资料修改:注册会员登录后,可以对自己的注册资料进行修改。
D.图书信息分类显示:按图书所属的分类,并按时间先后顺序,分页显示图书信息列表。
E.图书信息搜索:输入书号、书名、作者等关键字可以快速地在站内搜索相关的图书。
F.加入购物车:在初步决定购买某种图书时,首先将其加入购物车中汇总。
G.操作购物车:显示用户当前所选购的图书明细,并能进一步进行筛选,如删除和修改数量。
H.生成订单:注册用户在查看购物车后,确认购买时会生成包含用户此次购买信息的订单。
I.查看订单状态:注册用户可以根据订单号查看订单到货状态,分为3种状态:已下单、已送货、已付款。说明:本系统只支持货到付款,不支持第三方支付。
2)后台功能
A.管理员登录:管理员只有登录后台才能执行其权限范围内的管理功能。
B.管理员管理:管理员分为两级权限,即超级管理员和普通管理员,只有超级管理员才能对管理员信息进行管理(增加和删除)。
C.注册用户管理:超级管理员对注册用户信息进行审核和删除,普通管理员无此权限。
D.图书信息管理:管理员进行新书注册,修改图书信息、删除图书信息等操作。
E.图书分类管理:管理员进行新增图书分类,修改图书分类,删除图书分类操作。
F.订单管理:管理员处理用户订单,执行改变订单状态,撤销订单等操作。
G.查询统计:查询统计注册用户信息,查询统计图书信息,查询统计订单及订单明细信息等。
(2)用例图
根据网上书店项目的需求描述,从参与者的视角得到如图7.10所示的用例图。
图7.10网上书店项目的用例图分析
(3)业务流程图
网上书店的主要业务逻辑就是购书,因此,购书流程就是网上书店的主要业务流程。通过分析需求描述,得出的业务流程图如图7.11所示。
图7.11网上书店项目的主要业务流程图分析
【教学评价】
评价标准见表7.1。
表7.1任务7.1评价标准
任务7. 2 网上书店项目的系统设计
【任务描述】
系统设计就是根据需求分析阶段所确定的系统的逻辑模型、功能要求,在现有条件下,设计出能在当前软硬件环境下实施的方案,即将系统的逻辑模型转化为物理模型。系统设计阶段的主要任务是设计软件系统的模块层次结构,设计数据库的结构以及设计模块的控制流程,其目的是明确软件系统“如何做”。这个阶段又分为概要设计和详细设计两个子阶段:概要设计解决软件系统的模块划分和模块的层次机构以及数据库设计;详细设计解决每个模块的控制流程、内部算法和数据结构的设计。系统设计阶段结束时,要交付设计说明书。
本任务将对“网上书店”项目进行模块划分和数据库设计,并设计模块的控制流程(输入、处理、输出)。
【知识准备】
E-R模型简介
E-R模型(实体-关系模型)由美籍华裔计算机科学家陈品山(Peter Chen)发明,是一种面向问题的概念性数据模型,它用简单的图形方式描述数据,因此该模型也被直接称为E-R图。E-R模型不涉及数据如何在数据库系统中实现,主要用于帮助用户进行数据库设计。
1)E-R模型构成
E-R模型中有如下3种基本成分:实体、联系、属性。
①实体:表示现实或思维中的对象,在E-R图中用矩形框表示,框内输入实体名。
②联系:表示实体之间存在的关联性,在E-R图中用菱形框表示,框内输入联系名。
③属性:表示实体或联系的静态特性,在E-R图中用椭圆形框表示:框内输入属性名,对于标识性的主属性,则在属性名下加下划线。
在E-R图中,实体与属性、实体与联系、联系与属性之间要用直线连接,并在直线上标注连接类型。连接类型指连接两端的元素的数量对比关系,包括3种类型:1对1、1对多、多对多。对于1对1连接,需要在连线两端分别标注1;对于1对多连接,需要在连线两端标注1或N,而且数字“1”要在数量对比为1的一方;对于多对多连接,需要在连线两端标注N或M。
2)E-R图示例
如图7.12所示为一个学生选课的E-R图示例。
3)E-R模型的分析步骤
①根据需求描述,确定应用中所有的实体,构成实体集合。
②根据需求描述,确定实体集中各实体应包含的属性。
③根据需求描述,确定实体集中各实体之间的联系。
④确定实体集中各实体的关键字,用下划线进行标注。
⑤确定连接的类型,在连线两端进行标注。实际应用中,连接线主要用于将联系连接到它两端的实体(表示实体间存在某种联系),标注则分别放在联系两端与实体的连接线上。
图7.12学生选课的E-R模型分析
4)E-R模型向关系模型的转换
E-R模型向关系模型的转换规则归纳如下:
①将每个实体类型转换成一个关系模式,实体的属性即为关系模式的属性,实体标志符即为关系模式的键。
②若实体间联系是1∶1。可以在两个实体类型转换成的两个关系模式中任意一个关系模式的属性中加入另一个关系模式的键和联系类型的属性。
③若实体间联系是1∶N。则可在N端实体类型转换成的关系模式中加入1端实体类型的键和联系类型的属性。
④若实体间联系是M∶N。则将联系类型转换成关系模式,其属性为两端实体类型的键加上联系类型的属性,而键为两端实体键的组合。
例:对于学生选课的E-R图,通过应用转换规则得到的关系模型为:
说明:课程号为课程关系的主键,学号为学生关系的主键,同时,学号和课程号又作为选课关系的外键。
【任务实施】
(1)模块层次结构图
根据需求分析阶段的概念模型(需求说明、用例图等),对网上书店项目进行模块划分,形成如图7.13所示的模块层次结构图。
图7.13网上书店项目模块层次结构图
(2)E-R图
按“知识准备”部分介绍过的E-R模型的分析方法,参考目前通过分析与设计得到的阶段性概念模型,提取网上书店项目中的实体、联系和主要属性,并经过一些对实体、关系的调整(撤销、归并),得到如下的E-R模型。
图7.14网上书店项目的E-R模型分析
从图中可以看出,“管理员”是一个独立的实体,主要用于后台管理,不会和购书的主要业务流程发生联系;订单并不是一个实体,而是表示一种多对多的购买关系,这种多对多的关系在向关系模型映射时有多种方法,在“知识准备”部分介绍了一种方法,本任务在数据库设计时将会使用另一种方法。
(3)数据库设计
将网上书店的E-R模型转换成关系模型,关系模型是一种逻辑模型,需要将其具体化后转换成物理模型,即得到能在关系数据库上实现的表结构。需要注意的是,可将多对多的购书关系转换成了两张表:订单表和订单明细表,订单和订单明细之间是一对多的关系,一个订单能包含多项明细。对比“知识准备”部分的E-R模型向关系模型的第4条转换规则——将多对多的关系转换成关系模式下的一个关系,上述转换的好处是可以避免数据冗余,最终得到的网上书店系统的表结构见表7.2—表7.7。
表7.2图书信息表(BookInfo)
表7.3图书类别表(BookClass)
表7.4后台管理员表(BookAdmin)
表7.5用户信息表(BookUser)
续表
表7.6购书订单表(BookOrder)
表7.7订单明细表(OrderDetail)
(4)模块控制流程设计
考虑到如果将网上书店项目的所有模块的控制流程全部写出来,内容太多,篇幅太长。并且,在前面项目中已经将网上书店的一些典型模块作为任务进行过实现,读者已经对这些模块的控制流程比较清楚。因此,本任务只对前面项目没有涉及的“分类管理”和“订单管理”模块进行控制流程设计,其目的是让读者了解模块控制流程的设计过程。
1)分类管理模块
①分类导航子模块
②分类信息管理子模块
2)订单管理模块
①生成订单子模块
②查看订单状态子模块
③订单信息管理子模块
【教学评价】
评价标准见表7.8。
表7.8任务7.2评价标准
任务7. 3 网上书店项目的编码实现
【任务描述】
编码就是将设计阶段的逻辑模型转换成计算机能够执行的程序,即物理模型。其主要任务是通过编程实现目标系统的功能、模块、接口和界面。同时兼顾目标系统对数据结构、性能、算法等方面的要求。
设计阶段和编码阶段也没有清晰的分界线,程序员往往在编码的同时会不自觉地做一些设计性的工作,如规定变量的数据类型和给变量命名,如选择某种适合的循环结构等。相对而言,设计阶段的工作越具体、越细致则编码阶段的工作越简单、越“傻瓜”;反之,如果在设计阶段时系统设计的粒度太大或抽象程度太高,那么在编码阶段,则需要完成更多的设计性工作。
相对于软件开发的其他阶段,编码阶段所能选用的工具最为强大和成熟,一般可分为两大类:开发语言和开发平台(IDE)。目前,业内存在多种主流的语言和平台的组合,适用于对不同类型的软件系统进行编码实现。开发语言和平台的应用,使编码阶段的工作量大为降低,效率大为提高。在本任务中,将使用大家所熟悉的C#语言和VS 2008平台(.NET Framework 3.5)组合,编码实现任务7.2所设计的分类管理模块和订单管理模块。
【任务实施】
(1)数据库操作辅助类Dbhelper的实现
见前面项目中的ADO.NET部分,此处略。
(2)分类管理模块的编码实现
1)分类导航子模块
①拖放一个DataList控件到首页左侧作为导航菜单,ID设置为“dlNavigate”,进入编辑模板状态,在项模板中放置一个LinkButton,将其Text属性与数据源字段绑定,绑定表达式为Eval("ClassName");将其CommandArgument属性与数据源字段绑定,绑定表达式为Eval("ClassId")。为DataList的ItemCommand生成事件处理方法。需要说明的是,用于显示图书信息的DataList控件的ID为dlBookInfo,关于该控件的模板编辑、数据绑定、分页和执行命令是属于图书信息管理模块的内容。
②代码文件中该子模块所对应的事件处理方法和代码如下,在这些事件处理方法中,还可能存在其他模块的代码,在此未列出。
③运行效果如图7.15所示。
图7.15分类导航子模块运行效果
2)分类信息管理子模块
①生成图书分类信息管理后台页面,界面设计效果如图7.16所示。对于接收用户输入的文本框,一般要对其进行非空验证,请自行实现该页面。
图7.16分类信息管理子模块布局
②代码文件中该子模块所对应的事件处理方法和代码如下:
(3)订单管理模块的编码实现
1)生成订单模块
①在“购物车”页面,为“下订单”按钮生成事件处理方法,相关代码如下:
②订单重要信息显示页面的界面设计如下,这里使用Labe1显示用户名、订单号、地址、邮编、用户姓名等关键信息。
图7.17订单重要信息显示页面设计
相关代码如下:
③运行效果如图7.18所示。
图7.18购物车页面运行效果(含下订单功能)
2)查看订单状态模块
①新建查看订单状态页面,界面设计如图7.20所示,请自行实现。
图7.19订单重要信息显示页面运行效果
图7.20查看订单状态页面设计
②代码文件中,该子模块的相关代码如下:
③运行效果如图7.21所示。
图7.21查看订单状态页面运行效果
3)订单信息管理模块
①新建订单信息管理页面,界面设计如图7.22所示,请自行实现。
图7.22订单信息管理页面设计
在实现该界面时,将使用模板列显示“订单状态”的信息,并对“订单状态”列的绑定表达式进行了转换,使该列显示为“下单”“发货”和“收款”而不是数据库中的数字,绑定表达式使用了二重条件运算符进行组合:
而且,在编辑状态下,用户使用下拉列表框,既可用来显示订单状态信息,又可供用户改选其他订单状态,具体做法如下:在“订单状态”模板列的编辑模板状态下,选择编辑项模板,在模板编辑区放入一个DropDownList控件,为DropDownList的Items集合添加3个选项,Text属性分别为“下单”“发货”和“收款”,Value属性分别为0、1、2。对该控件的SelectedValue属性进行绑定,绑定表达式为:Eval("OrderStatus")。
②对应代码文件中,该页面的相关代码如下:
③单击“查看详情”按钮,跳转到订单明细页面,其界面设计如图7.23所示,请自行实现。
图7.23订单明细显示界面设计
④在对应的代码文件中,该页面的相关代码如下:
⑤该模块的运行效果如图7.24—图7.26所示。
图7.24订单信息管理页面运行效果
图7.25订单信息管理页面编辑状态下运行效果
图7.26订单明细信息显示页面运行效果
【教学评价】
评价标准见表7.9。
表7.9任务7.3评价标准
【归纳总结】
①软件开发过程是灵活的,有时需要多次迭代,有时可能会跳过某些阶段;而且,软件开发各阶段的界限也并不清晰,各阶段的规范也是指导性的规定。因此,读者在学习软件开发流程中不要太过拘泥于形式,关键是要理解软件开发流程背后的思想,这是一个从抽象到具体,从整体到局部的自顶向下,逐步分解,逐步求精的开发过程。
②分析和设计阶段的辅助工具能帮助开发者加深对目标系统的理解,能帮助开发者厘清思路,去伪存真,查漏补缺,还有利于开发者之间的交流。但是,工具并不是万能的,更不能替代开发者的思想,工具背后体现的正是开发者的分析和设计能力。因此,若想更好地使用工具,必须不断地增强自身对于软件系统的分析和设计能力。
③目前主流的开发语言和平台的组合有很多,某种语言和平台的组合一定对于某类型的软件开发具有优势。而开发者的精力有限,不可能精通所有的软件开发和所有的语言、平台,只能定位于某种类型的软件开发,在某种语言和平台组合上深入下去。
【练习与实训】
实训1考虑网上书店项目的分析和设计还有哪些遗漏和不合理的地方,并进行补充和完善。
实训2对图书信息管理的各子模块进行控制流程设计和界面设计,并编码实现。
实训3对用户信息管理的各子模块进行控制流程设计和界面设计,并编码实现。
实训4对购物车管理的各子模块进行控制流程设计和界面设计,并编码实现。