编写计算机软件的人很多,我们通常都把这些活动称为软件开发。但是软件的种类是不同的,每种软件都有自身的复杂性和挑战性。本人一直工作在电信行业,电信行业的软件非常复杂,对并发、大数据量、性能、高可靠性要求很高,这些都对软件的设计和开发提出了严峻的挑战。
1.1 应用软件结构
通常,应用软件的总体结构,可以分为两大部分:应用层和平台层,具体如下:
图
1
‑
1
应用软件总体结构
平台层提供基础框架和大量可重用组件,这些组件以一定的接口方式暴露出来,供应用层来调用。平台层通常不提供与具体业务相关的逻辑处理,而是提供:
1)
业务无关的框架
/
功能组件:比如日志、安全、线程池、连接池、告警监控等
2)
多种业务之间可共用的机制:如工作流、事件通知机制等,这部分也与具体的业务无关。
应用层提供具体应用相关的逻辑处理部分,包括页面、应用逻辑、应用数据等。
平台层和应用层,是个逻辑划分的概念,实际软件实现中,平台层和应用层都可以由多个层来实现,也可以合并到一个程序中,这要视项目的规模和具体需求而定。
从上图可以看出,构建一个高度可重用的平台层,可以使应用开发只需集中精力关注业务逻辑,业务无关的功能组件和机制都由平台层提供,可以直接使用,这样极大简化了应用开发,缩短了软件交付周期,保障了软件质量。
而构建一个高度可重用的平台层,最核心的挑战就是设计和开发高度可重用的组件,提取应用的共性需求,简化接口,真正做到应用开发时可以直接拿来就用,而且非常好用。
1.2 组件定义
那么,到底什么是组件呢?框架又是什么意思?类是组件吗?控件又指什么?元件、构件这些概念又如何理解?
这些概念,都没有一个统一的标准答案,因此在软件开发过程中,这些术语经常被混淆,作者根据自己的工作体会,对这些概念解释如下:
1)
对象:面向对象语言
(Object-Oriented Language)
是一类以对象作为基本程序结构单位的程序设计语言,指用于描述的设计是以对象为核心,而对象是程序运行时刻的基本成分。对象都具有状态和行为。对象,也被翻译为实例、物件。
2)
类:面向对象的概念。类是一种对包括数据成员、函数成员和嵌套类型进行封装的数据结构。在程序运行期间,由类创建成对象的过程,叫类的实例化。因此,对象是个运行期的术语,类是个编译期的术语。类本身就是可重用的直接实现手段。
3)
组件:类本身是个细粒度的可重用实现,为了解决功能或机制层面更大粒度重用的问题,又引入了组件的概念。组件的英文是
Component
,其逻辑结构如下:
组件对外暴露一个或多个接口,供外界调用。组件内部由多个类来协同实现指定的功能。对于复杂的组件,会包括很多的类,还可能包含配置文件、界面、依赖的库文件等,组件也可以包含或者使用其它的组件,构成更大的组件。
一些特定范畴的组件,由软件厂家或者国际权威组织制定并颁布了组件规范,如
COM
、
ActiveX
、
EJB
、
JavaBean
等。本书讨论的组件,指一般意义的自定义组件,不包括这些规范化的组件。
4)
控件:控件的英文是
Control
,控件就是具有用户界面的组件。要说的具体一点,就得回顾早期
Windows
的历史根源,当时控件指任何子窗口:按钮、列表框、编辑框或者某个对话框中的静态文本。从概念上讲,这些窗口――控件――类似用来操作收音机或小电器的旋钮和按钮。随着控件数量的增加(组合框、日期时间控件等等),控件逐渐成为子窗口的代名词,无论是用在对话框中还是用在其它种类的主窗口中。没过多久
BASIC
程序员开始编写他们自己专用的控件,自然而然地人们便想到共享这些控件。共享代码的方法之一是通过磁盘拷贝,但那样显然效率低下。必须要有一种机制使开发者建立的控件能够在其它程序员的应用中轻而易举地插入,这便是
VBA
控件,
OLE
控件,
OCX
和最后
ActiveX
控件产生的动机。因此,控件是组件的一个主要样本(并且历史上曾驱动着组件的开发),控件又不仅仅是唯一的一种组件。
5)
元件:元件是个电子行业的术语,是电子元件的简称。也有一些软件借用这个术语,指特定的可重用控件。
6)
构件:构件是系统中实际存在的可更换部分,它实现特定的功能,符合一套接口标准并实现一组接口。构件代表系统中的一部分物理实施,包括软件代码(源代码、二进制代码或可执行代码)或其等价物(如脚本或命令文件)。
通常认为,构件是特定软件开发环境中、满足指定规范的软件部分,其涵盖了设计、开发、物理实施等范畴。
7)
框架:框架的英文是
Framework
,框架是一个应用程序的半成品。框架提供了可在应用程序之间共享的可复用的公共结构。开发者把框架融入他们自己的应用程序,并加以扩展,以满足他们特定的需要。框架和工具包的不同之处在于,框架提供了一致的结构,而不仅仅是一组工具类。
(
摘自《
JUnit in action
中文版》
)
。
8)
子系统:子系统是个设计中使用的术语,英文是
SubSystem
。在软件总体架构中,按照功能划分子系统。通常一个子系统包含一个或多个进程。
9)
模块:模块是个设计中使用的术语,英文是
Module
。模块指一个子系统内部,按照软件结构分解的功能部分。模块会包含多个类、使用多个组件,也会与框架交互。
一个真正的软件系统,会涉及到以上的多个概念,典型的软件系统静态结构图如下:
上图展示了一个软件系统,包括
2
个子系统,子系统
1
和子系统
2
。子系统
1
调用子系统
2
。
子系统
1
包含
2
个模块:模块
1
和模块
2
。模块
1
由两个类
(Class 1
和
Class 2)
和一个组件
(
组件
1)
构成,模块
2
由两个类(
Class3
和
Class4
)和两个组件(组件
2
和组件
3
)构成,模块
2
提供一个接口给模块
1
调用。模块
1
和模块
2
都使用了框架
1
。
子系统
2
包含
2
个模块:模块
3
和模块
4
。模块
3
由两个类(
Class5
和
Class6
)和一个组件(组件
4
)构成,模块
4
由一个类(
Class7
)和一个组件(组件
5
)构成。模块
4
提供一个接口给模块
3
调用。模块
3
和模块
4
都使用了框架
2
。
本文出自 “expert” 博客,转载请与作者联系!