一、系统与子系统
系统:根据维基百科定义,系统泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元件不能单独完成的工作的群体。
子系统:子系统是由一群有关联的个体所组成的系统,通常是更大系统中的一部分。
系统和子系统的概念相对比较容易理解,比如微信是个系统,聊天、朋友圈、公众号就是它比较重要的三个子系统。
二、架构和框架
软件架构:根据维基百科定义,架构是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。
软件框架:根据维基百科定义,框架通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要求之基础功能的软件产品。框架的功能类似于基础设施,与具体的软件应用无关,但是提供并实现最为基础的软件架构和体系。软件开发者通常依据特定的框架实现更为复杂的商业运用和业务逻辑。这样的软件应用可以在支持同一种框架的软件系统中运行。简而言之,框架就是制定一套规范或者规则,大家在该规范或者规则下工作。
架构和框架的概念比较相似,且两者通常都有比较强的关联。框架强调的是规范以及与之相对应实现的基础软件产品。架构强调的是整体结构,各组件或者模块的相互关系,是系统的顶层设计。
比如,我们经常说我们采用Spring MVC框架进行开发,是基于MVC架构的。前者指的是具体的软件产品,后者指的是系统的整体结构。
架构通常又可以分为功能架构和技术架构。功能架构是从系统功能的角度来描述系统的整体结构,类似于建筑中的建筑设计,所以建筑图就是从功能方面来描述一个建筑,如一楼商场及其布局,二楼餐饮及其布局等。技术架构是从技术的角度来描述系统的整体结构,类似建筑中的结构设计,如钢筋、承重梁及其相互关系。(题外话:软件工程脱胎于建筑工程,所以软件工程中很多过程都能从建筑工程中找到对应的过程)
如一个图书管理系统,功能架构图示意如下:
技术架构图示意如下:
三、模块和组件
软件模块:根据维基百科定义,软件模块是一套一致而互相有紧密关连的软件组织,包含了程序和数据结构两个部分。是现代软件开发往往利用模块作合成的单位。模块的接口表达了由该模块提供的功能和调用它时所需的元素。模块是可能分开地被编写的单位,能允许广泛人员同时协作、编写及研究不同的模块。
软件组件:根据维基百科定义,软件组件为定义为自包含的、可编程的、可重用的、与语言无关的软件单元。软件组件可以很容易被用于组装应用程序中。
上面的定义比较拗口,其实模块和组件都是系统的组成部分,只不过它们是从不同的角度来拆分系统。模块是从功能的角度来拆分,组件是从物理或者说实现的技术角度来拆分。划分模块的主要目的是职责分离,划分组件的主要目的是单元复用。
以图书管理系统来说,读者信息管理、书籍信息管理这些都是模块。缓存组件、搜索引擎等就是组件。
另外一个容易混淆的概念就是子系统和模块。子系统是独立运行的,模块是子系统的逻辑组成部分。模块在一定条件下,变成独立运行,就转化为子系统。举一个不一定非常恰当的例子,比如在某个大型的商业广场,如果厕所和商场一起,那么厕所就是商场的一个模块。如果厕所与商场分离,是独立的公共厕所,那么厕所就算是商业广场的子系统。
四、总结
框架强调的是规范以及与之相对应实现的基础软件产品。架构强调的是整体结构,各组件或者模块的相互关系,是系统的顶层设计。
系统和子系统都是泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元件不能单独完成的工作的群体。两者差别就是大小的关系。
模块和组件都是系统的组成部分,模块是从功能的角度来拆分,组件是从物理或者说实现的技术角度来拆分。划分模块的主要目的是职责分离,划分组件的主要目的是单元复用。
子系统是独立运行的,模块是子系统的逻辑组成部分。模块在一定条件下,变成独立运行,就转化为子系统。