软件体系结构是指为软件系统提供高级抽象的结构、行为和属性的定义。它描述了系统的组织结构、元素之间的相互作用以及设计决策的原则,是系统级复用的基础。
软件体系结构在软件研发生命周期中起到重要的作用,主要体现在以下三个方面:
分层式体系结构是最常见的架构设计方法,通过将系统划分为多个层次,并定义层间的接口和协议,实现了设计简化、系统机构清晰、复用能力和产品维护能力的提高。
分层式体系结构通常包括表现层(展示层)、中间层(业务层)、数据访问层(持久层)和数据层。其中,组件在每个层次中负责各自层次的逻辑,实现了关注分离的原则。
虽然分层式体系结构是通用的架构模式,但需要注意避免出现污水池反模式,即每层缺乏业务逻辑的情况。此外,分层架构可能会导致应用变得庞大,带来复杂的分布模式、健壮性下降、可靠性和性能问题以及代码规模膨胀等潜在问题。
注意:MVVM模式最好使用官方的架构组件ViewModel、LiveData等实现。
XML(可扩展标记语言)是一种类似于HTML的标记语言,用于定义数据的结构和数据类型。尽管XML被公认为优秀的数据描述语言并成为广泛采用的标准,但在表现层技术中,HTML仍然是主要角色。由于Web应用程序对特定浏览器的局限和性能问题,基于窗体的胖客户端应用程序正在重新流行。许多开发厂商提出了同时支持胖客户端和Web表现形式的产品开发。因此,有人提出使用一个标准的GUI描述形式,并根据其描述转换成不同的表现形式。这就要求描述语言具有很好的通用性和扩展性,而XML恰好是理想的载体。对于大多数应用系统,GUI主要由GUI控件组成,而XML可以很好地支持控件之间的层次结构。同时,XML标记由架构或文档的作者定义,并且是无限制的,因此架构开发人员可以约定控件的属性,例如按钮、控件容器、位置等。通过使用XML来描述整个GUI,可以简化GUI的开发和维护。从设计模式的角度来看,XML表现层解析机制采用了策略模式,通过装载GUI对应的XML配置文件并根据特定的表现技术解析XML,得到GUI视图实例对象。这样,GUI开发人员只需要维护一套XML文件即可。
应用程序通常需要使用代码来管理用户界面,例如窗体之间的导航。然而,将这些代码写在用户界面的代码中会导致代码复杂、难以复用、维护和扩展。同时,如果应用程序需要在不同平台上运行,控制逻辑和状态无法复用。
大多数应用程序需要维护一个状态,通常存储在窗体中,代码需要访问窗体来恢复状态。这样做会变得困难且不优雅,同时也会影响用户界面的可重用性和可扩展性。
当用户使用应用系统时,可能会启动一个任务,一段时间后返回继续。如果在此期间用户关闭了应用程序,他们将失去当前的状态,必须从头开始任务。因此,在设计程序时,需要分别考虑工作流、导航和与商业服务的交互等不同组成部分,以获取和呈现数据给用户。
UIP(UserInterface Process Application Block)是微软社区开发的众多Application Block之一,也是开源的。UIP提供了一个扩展的框架,用于简化用户界面与商业逻辑代码的分离方法,可以用它来编写复杂的用户界面导航和工作流处理,并且可以在不同场景中重用,并随着应用的增长进行扩展。
使用UIP框架的应用程序将表现层分为以下几层:
UIP组件的主要功能是管理通过用户界面组件的信息流,管理UIP中各个事件之间的事务,修改用户过程的流程以响应异常,将概念上的用户交互流程与实现或涉及的设备分离,保持内部的事务关联状态,通常持有一个或多个与用户交互的事务实体。因此,这些组件还可以从用户界面组件收集数据,执行服务器的批量更新或跟踪UIP中的任务进程的管理。
基于XML的界面管理技术可以实现灵活的界面配置、界面动态生成和界面定制。其思路是使用XML生成配置文件和界面所需的元数据,根据不同需求生成界面元素和软件界面。
基于XML界面管理技术包括界面配置、界面动态生成和界面定制三个部分。界面配置是对用户界面的静态定义,通过读取配置文件的初始值来配置界面。界面定制是在软件运行过程中对界面元素进行动态修改,用户可以根据需求和使用习惯修改界面元素的属性。系统通过DOM API读取XML配置文件的表示层信息,通过数据存取类读取数据库中的数据层信息,运行时动态生成界面。界面配置和定制模块可以在软件运行前后修改配置文件和更改界面内容。
基于XML的界面管理技术实现了用户界面描述信息与功能实现代码的分离,可以根据不同的用户需求进行界面配置和定制,并且能够适应一定程度上的数据库结构改变。只需要稍微修改XML文件,就可以实现系统的移植。
业务逻辑组件分为接口和实现类两部分。接口定义了业务逻辑组件必须实现的方法,是系统运行的核心。每个模块都设计一个业务逻辑组件,通过多个DAO组件实现对外提供业务逻辑服务。为了解耦,控制器使用业务逻辑组件的接口进行编程。
业务逻辑组件的实现类以DAO组件为基础,并接收Spring容器注入的DAO组件。复杂的业务逻辑可能需要访问多个对象的数据,可以在实现类的方法中调用多个DAO接口,将具体实现委派给DAO完成。
业务逻辑组件的配置需要使用Spring的反向控制(IoC)或依赖注入(DI)机制,即在applicationContext.xml中配置FacadeManager组件,并为其配置所需的DAO组件。
在配置文件中,采用继承业务逻辑组件的事务代理,将原有的业务逻辑组件作为嵌套bean配置,避免直接调用没有事务特性的业务逻辑组件。
系统实现了后台业务逻辑,并提供统一的Facade接口,前台Web层仅依赖该接口。这样,Web层与后台业务层的耦合度低,方便在不同的Web框架中切换。
工作流是指业务流程的部分或全部自动化,在此过程中,文档、信息或任务按照一定的过程规则流转,实现组织成员间的协调工作以达到业务的整体目标。工作流管理联盟制定了工作流参考模型和五个接口,包括过程定义导入/导出接口、客户端应用程序接口、应用程序调用接口、工作流机协作接口和管理和监视接口。用工作流的思想组织业务逻辑可将应用逻辑与过程逻辑分离,在不修改具体功能的情况下,通过修改过程模型改变系统功能,完成对生产经营部分过程或全过程的集成管理,实现最大效能。
业务逻辑层实体具有以下特点:
将业务逻辑层实体表示为XML的优点:
将业务逻辑层实体表示为通用DataSet的优点:
将业务逻辑层实体表示为有类型的DataSet的优点:
业务框架是系统功能的核心组件,位于系统架构中间层。采用容器形式实现,便于开发、代码重用和管理。在业务容器中,采用Domain Model—Service—Control思想来实现业务逻辑。Domain Model是业务相关属性的领域层业务对象,Service是应用程序不同功能单元,通过定义中立接口联系起来,Control作为服务控制器,决定Service之间的执行顺序及相互关系。通过隔离服务和服务控制,实现高度的可重用性和灵活性。
在应用程序设计中,数据库的访问需要良好的封装性和可维护性。为了做到数据库无关,可以采用工厂设计模式。在实际开发中,先定义一个操作数据库的接口,然后根据数据库不同,由类工厂决定实例化哪个类。通过创建一个Factory类,根据数据库类型返回适当的数据库操纵类,实现自动数据库切换的管理。客户端调用时,只需要修改PersistenceProperty的值,程序不会受到影响,实现了良好的封装性。
ORM(对象关系映射)是一种将关系型数据库和对象之间进行映射的技术。通过使用ORM,开发者可以像操作对象一样操作数据库,而不需要编写复杂的SQL语句。ORM可以减少代码的重复性,降低学习和开发成本,并且提高开发效率。
Hibernate是一个开源的ORM框架,它提供了轻量级的对象封装,使Java程序员可以使用面向对象的方式来操作数据库。Hibernate不仅提供了对象到数据表的映射,还提供了数据查询和恢复机制。相比于手动操作数据库,Hibernate可以大大减少工作量,并且可以利用代理模式简化数据提取的代码编写量。Hibernate可以与多种Web服务器和应用服务器集成,并支持各种流行的数据库服务器。
Hibernate是一个功能强大的ORM框架,可以有效地将数据库数据映射到业务对象中。它使开发人员能够专注于业务逻辑而不必关注繁琐的数据库操作。通过自动生成持久层,Hibernate提供了更合理的模块划分和开发方式。
XML Schema是用于描述XML文档结构和限制的语言,它使用命名空间、具有丰富的内嵌数据类型和数据结构定义功能。与传统的DTD机制相比,它更加强大并逐渐代替DTD成为XML体系中正式的类型语言。XML Schema由基本组件、组件和帮助组件组成,详细说明了每个组件的语义和在XML中的表示。XML Schema规范由Primer、Structures和Datatypes三部分组成,其中Datatypes定义了可用于XML Schema和其他XML规范中的数据类型。与DTD不同,XML Schema提供了丰富的数据类型和继承性,使得软件开发和维护更加高效。同时,XML Schema与XML Namespace紧密联系,简化了多个命名空间定义多个Schema的XML文档的创建和验证。
事务是现代数据库理论中的核心概念之一,表示一组处理步骤。事务必须遵循ACID原则,即原子性、一致性、隔离性和持久性。J2EE应用服务器支持JDBC事务、JTA事务和容器管理事务。在JDBC事务中,可以将多个SQL语句组合成一个事务,并使用commit()方法提交事务。在JTA事务中,可以通过UserTransaction接口开始、提交或回滚事务。处理事务时应尽量短且避免嵌套使用不同类型的事务。
在基于JDBC的数据库应用开发中,数据库连接的管理是决定性能的重要因素。为了解决连接频繁分配和释放的问题,可以使用连接池来提供高效的连接分配和使用策略。连接池在系统初始化时就建立,并存放预分配好的连接。客户请求连接时,先检查连接池是否有空闲连接,如果有则分配给客户,并标记为已分配。如果没有空闲连接,则在已分配连接中寻找可复用的连接。当客户释放连接时,根据是否被复用进行不同处理,未被使用者复用的连接放回连接池而不关闭,实现了连接的有效复用。
正确识别类和类之间的关系是数据模型的关键。建模是一项艺术,不存在唯一正确的数据模型,但可以存在好的数据模型。好的数据模型应该考虑项目整个生命周期的成本,并能适应系统可能发生的变化。因此,将重点放在降低开发费用上是错误的。
Web的迅速发展使得 Web数据变得更加复杂和多样化,传统数据库技术难以存储和管理所有不同的 Web 数据。XML正在成为Internet上数据描述和交换的标准,并且将来会代替 HTML而成为 Web 上保存数据的主要格式。 XML文档分为两类,一类是数据文档,用于存储和传输 Web 数据;另一类是以文档为中心的文档,常用于在网页上发布描述性信息、产品性能介绍和 E-mail信息等。目前提出了两种 XML文档的存储方式:基于文件的存储方式和数据库存储方式。 XML数据库是一组XML文档的集合,并且是持久的和可操作的;有专门的DBMS管理;文档都是有效的,文档的集合可能基于多个模式文件。
物联网分为三个层次:感知层、网络层和应用层。感知层用于识别物体和采集信息,包括各种传感器和识读设备;网络层用于传输和处理数据,将感知层获取的信息进行传递和预处理;应用层结合行业需求实现广泛智能化,提供丰富的特定服务。物联网是深度信息化的重要体现,软件开发和智能控制技术将会为用户提供丰富多彩的物联网应用。
PetShop是一个基于.Net企业系统开发能力的范例,展示了设计和开发理念。它采用B/S系统架构,其中表示层使用ASP.Net设计。随着版本的更新,其分层结构逐渐完善,最新版本是基于.Net 2.0的PetShop 4.0。
在早期版本中,没有明显的数据访问层设计,导致业务逻辑层和数据访问的职责混乱。但随着PetShop 3.0的发布,将数据访问逻辑独立出来作为单独的一层,解决了这个问题。
PetShop 4.0延续了3.0的架构,引入了缓存和异步处理机制,并利用了ASP.Net 2.0的新功能MemberShip。
整个系统架构中,数据访问层采用面向接口编程的思想,抽象出IDAL模块,使得数据访问层有利于数据库迁移。业务逻辑层通过接口模块IDAL调用数据访问层,实现了松散耦合的层与层之间的关系。
PetShop的表示层和业务逻辑层之间的调用关系相对较高耦合。同时,表示层还引入了辅助模块,如Messaging模块用于异步插入订单的功能,CacheDependency提供缓存功能。
总的来说,PetShop的设计和开发理念在系统架构、分层结构和面向接口编程等方面有很多值得借鉴的地方。
电子小票物联网架构是基于感知层、网络层和应用层的三层模型。感知层包括取代传统小票打印机的智能硬件,通过Wi-Fi/GPRS传输购物小票信息到云平台。网络层支持数据传输、处理和存储,并提供服务支持。应用层是电子小票服务系统与顾客和商家的接口,包括实时推送、历史查询和数据管理等功能。
电子小票服务系统由小票智能硬件、商家收银机、电子小票云平台、微信公众平台、消费者智能手机和商家PC终端构成。小票智能硬件通过控制器、TFTLCD显示屏、Flash存储和无线模块实现数据显示和上传。商家收银机不需改变原有系统,只需安装驱动程序即可使用智能硬件作为打印机。云平台通过微信公众平台将电子小票实时推送给消费者微信应用。