二、关键性原则及总体架构
2.1 关键性原则
在软件开发技术的发展过程中,出现了很多优秀的思想与模式。这些思想和
模式凝结了无数程序设计人员的实践经验,是软件开发领域的精华。其中的很多思想,对分层架构设计也有着重要的指导作用,下面将列出一些在本课题研究中起着重要作用的指导思想和所设计的架构应遵循的原则。
2.1.1 分层架构逐渐调用原则及单向调用原则
现在约定将N层架构的各层依次编号为1、2、?、K、?、N-1、N,其中
层的编号越大,则越处在上层。那么,我们设计的架构应该满足以下两个原则: 1.第K(1 其中第一个原则,保证了依赖的逐层性,及整个架构的依赖是逐层向下的,而不能跨层依赖。第一个原则,则保证了依赖的单向性,及只能上层依赖底层,而不能底层反过来依赖上层。 2.1.2 单一职责原则 就一个类而言,应该仅有一个引起它变化的原因。软件设计真正要做的许多 内容,就是发现职责并把那些职责相互分离。如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责,一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生是,设计会遭受到意想不到的破坏[2]。 2.1.3 开放-封闭原则 开放-封闭原则,是说软件实体(类、模块、函数等等)应该可以扩展(Open for extension),但是不可修改(Closed for modification)。开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,然而。对于应用程序中的每个部分都刻意地进行抽象和抽象本身一样重要[2]。 具体到N层架构中,可以描述为:当K-1层有了一个新的具体实现时,它 应该可以在不修改K层的情况下,与K层无缝连接,顺利交互。 2.1.4 依赖倒转原则 依赖到转原则,A.高层模块不应该依赖底层模块。两个都应该依赖抽象; B.抽象不应该依赖细节,细节应该依赖抽象[2]。如果不管高层模块还是底层模块都依赖于抽象,具体一点就是借口或抽象类,只要接口是稳定的,那么任何一个的更改都不用担心其他收到影响,这就使得无论高层模块还是底层模块都可以很容易地被复用[6]。 2.1.5 迪米特原则 迪米特法则(LoD)也叫最少知识原则,如果两个类不必彼此直接通信,呢 么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用[3]。迪米特法则其根本思想是强调了类之间的松耦合。类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。也就是说,信息的隐藏促进了软件的复用。[6] 例如,在外观模式中,为子系统中的一组接口提供一个一致的界面,此模式 定义了一个高层接口,这个接口使得这一子系统更加容易使用[1]。外观模式完美地体现了迪米特法则的思想。而企业软件中的三层或N层架构,层与层之间地分离其实就是外观模式的体现。 2.2 总体架构 2.2.1层次划分 目前,典型的分层架构是三层架构,即自底向上依次是数据访问层、业务逻 辑层和表示层。 这种经典架构经历了时间的考验和实践的多次检验,被认为是合理、有效的分层设计,所以,在本课题中,将沿袭这种经典架构,使用数据访问层、业务逻辑层和表示层的三层架构体系。 2.2.2 职责划分 在典型的三层架构中,对层次各自的职责划分并没有一个统一的规范,综合 现有的成功实践和.NET平台的特殊性,在本课题中将三层架构的职责划分如下: 数据访问层——负责与数据源的交互,即数据的插入、删除、修改以及从数 据库中读出数据等操作。对数据的正确性和可用性不负责,对数据的用途不了解,不负担任何业务逻辑。 业务逻辑层——负责系统领域业务的处理,负责逻辑性数据的生成、处理及 转换。对流入的逻辑性数据的正确性及有效性负责,对流出的逻辑性数据及用户性数据不负责,对数据的呈现样式不负责。 表示层——负责接收用户的输入、将输出呈现给用户以及访问安全性验证。 对流入的数据的正确性和有效性负责,对呈现样式负责,对呈现友好的错误信息负责。 2.2.3 模块划分及交互设计 综合以上分析,可在宏观上将整个系统分为一下几个模块: 实体类模块——一组实体类的集合,负责整个系统中数据的封装及传递。 数据访问层接口族——一组接口的集合,表示数据访问层的接口。 数据访问层模块——一组类的集合,完成数据访问层的具体功能,实现数据 访问层接口族。 业务逻辑层模块——一组类的集合,完成业务逻辑层的具体功能,实现业务 逻辑层接口族。 表示层模块——程序及可视元素的集合,负责完成表示层的具体功能。 辅助类模块——完成辅助性功能。 各个模块的划分及交互性如图2.1所示:(其中单向箭头表示实泛化,双向 箭头表示依赖及调用) 表示层 业务逻辑层 IDAL 数据访问层 数据源 实体类 辅助类 三、关键性构件及各层次实现 3.1 实体的识别及数据库设计 3.1.1识别实体 根据对网上购物系统的需求分析,可以识别出一下几个实体: ", 用户(Users):代表使用网上购物系统的用户,包括注册会员、管理员。 ", 图书(Books):代表库存的图书。 ", 图书分类(Categories):代表库存图书的种类。 ", 图书出版社(Publishers):代表图书出版社。 ", 订单(Orders):代表使用网上购物系统的用户的订单。 ", 图书订单(OrderBook):代表使用网上购物系统的用户的订单的详细信息。 ", 关键字搜索(SearchKeyword) 逻辑结构设计 附件表(Attachment)(可存入非主要字段) 字段名 附件ID 图书ID 附件或附加信息类型 字段 Id BookId AttaType 类型 长度 int int int 允许空 否 否 否 说明 主键 所在的图书ID 如0(默认)表示图片,1表示编辑推荐内容 3.1.2 数据库设计 附件或附加信息 AttaValue Nvarchar(MAX) 否 附件或附加信息信息 图书表(Books) 字段名 图书ID 字段 Id 类型 长度 int 允许空 否 说明 主键,与Attachment表的BookId构成主外键 Publishers表的外键 图书字数 Image的URL Categories表的外键 0代表否,1代表是 图书标题 作者 出版社ID 出版日期 标准书号 字数 单价 折扣 Title Author PublisherId PublishDate ISBN WordsCount UnitPrice Discount nvarchar(200) nvarchar(200) int datetime nvarchar(50) int money float 否 否 否 否 否 否 否 是 是 是 是 是 是 否 是 是 内容简介 ContentDescription nvarchar(MAX) 作者简介 AuthorDescription nvarchar(MAX) 是否存在编辑推荐 是否存在图片 图书目录 图书分类ID 点击数 是否推荐 图书分类表Categoriges 字段名 分类ID 字段 Id 类型长度 int EditorComment Images TOC CategoryId Clicks IsEditorComment nvarchar(MAX) nvarchar(50) nvarchar(MAX) int int int 允许空 否 说明 主键与Users表的