软件模块和领域概念

技术上我们经常强调模块化、组件化,但是能真正实现软件模块化,需要通过对业务领域有一定程度的理解才能达到。

我们可能有专业培训组件和模块技术的课程(OSGi等),但这类课程并不会告诉我们所在的领域上具体情况应该如何划分模块,大概辨别和划分模块的能力是理所当然。但事实上并非如此。

用一个例子说明:假如一个网站需要添加一个广告功能。大概有以下可能性:

  • 如果该网站本来是没有模块化的,直接就往代码里做修改。而后果会是代码越来越庞大
  • 如果该网站已经划分了不同的模块,我们会看看新的功能是否属于哪个曾经定义过的模块,然后新的代码会在这个模块里添加
  • 如果新功能不属于任何曾经定义过的模块,我们会建立一个新的模块。

最后两点的关键在[属于]如何界定。

新的广告功能[属于]内容管理(CMS)的一部分吗?毕竟广告也会有内容的特性(有文字,图片,超链接等等)。

广告功能也可以自成一个模块,因为广告的点击率直接影响网站收益,跟网站内容的点击性质不一样,处理的结果也可能不一样。

另外有可能广告功能是市场部管辖的范围,广告的效果经过分析后可能会到业务部和财务部做核算。从业务流我们也可以认为这个广告功能属于市场部的一个系统功能。

在Eric Evans的Domain Driven Design提倡领域设计的重要性,当中Bounded Context提到模型边界问题。而Sam Newman在Building Microservices书中也提到微服务最好也依据Bounded Context来划分。

通常我会依据以下关系来做模块划分:

  • 领域对象的拥有者和使用者
  • 根据企业的自然边界(部门)分析
  • 是否存在一种虚拟抽象的关系,把两个看起来没有关系的领域关联起来,而这个虚拟抽象的东西可能就是一种共享的高维度的模块

另外有两个重要的技术概念也需要参与分析:低耦合性,高一致性

  • 低耦合 = 改变一个模块的代码,不导致需要修改依赖这模块的其他模块的代码
  • 高一致性 = 同一个领域的对象,尽可能放在一起并一起发布

还有一个简单的检查,就是通过换位思考,站在一个领域的角度上,判断这个领域词汇应该在什么模块出现、和不应该在什么模块出现。

时间: 2024-10-11 21:55:56

软件模块和领域概念的相关文章

软件模块划分原理

在软件高层设计中,如何分解模块是首要考虑的问题.目前业界公认模块划分要按照“高内聚,低耦合”的原则来进行,那么如何划分才能满足“高内聚,低耦合”呢?下面来对模块分解原理方面进行一些探索,有考虑不周和不成熟之处还请大家不吝指正. 模块是按功能来分解的吗? 许多人可能有过经验,面对一堆功能性需求,多个不同的需求可能要放到同一个模块里,而某个需求又需要分解到多个模块里去实现. 比如一个词典软件(类似金山词霸的软件),通常有查询词典的功能需求和添加用户词库的功能需求,显然不可能简单地为这两个功能各分解一

一种对软件模块进行单元测试的方法

      [文章摘要] 在软件的开发阶段,单元测试是确保代码质量的重要方法.因此,掌握基本的单元测试方法是对一个软件开发人员的基本要求. 本文基于作者的实际项目经历,介绍了一种采用得比较多的单元测试方法.         一.软件模块概述 在实际的软件系统中,各个模块之间的关系可以用错综复杂来形容.根据模块之间有无消息交互,可以将软件模块划分为以下四类. 第一类:独立模块.即该模块不接收其它模块发过来的消息,同时也不向其它模块发消息. 第二类:被动的单向消息模块.即该模块只接收其它模块发过来的

TPM:dTPM(硬件)和fTPM(固件模拟的软件模块)

转:Bitlocker.TPM和系统安全 自从微软在Windows Vista首次引入Bitlocker以来,它已经越来越多的出现在我们的周围.尤其是企业用户,Bitlocker的保护已经变得不可缺少.本文将深入讨论它的原理和如何提高它的安全性. 什么是Bitlocker? BitLocker 驱动加密是集成在Windows Server 2008和Windows Vista及以后版本中的一个新的安全特性,它通过紧密集成在Windows操作系统中的方案,来帮助降低数据偷窃或丢失导致的泄露,被盗,

Nginx软件模块说明

Nginx软件模块说明 Nginx常用模块 注:以下只是列举Nginx常用模块,需要详细了解更多模块可以登录Nginx官方网站查看 功能模块 模块说明 ngx_http_core_module 包含一些核心的http参数配置,对应Nginx的配置为http区块部分 ngx_http_access_module 访问控制模块,用来控制网站用户对Nginx的访问 ngx_http_gzip_module 压缩模块,对返回的数据压缩,属于性能优化模块 ngx_http_proxy_module pro

软件开发的一些概念

10. 关系数据库 (Relational Databases) 关系数据库因为在大规模 Web 服务上缺乏可扩充性而颇受微词,然而,关系数据库仍然是近20年来计算机技术中最伟大的成就.关系数据库对处理订单,公司数据方面有着出色的表现. 关系数据库的核心是以记录表示数据,记录存放在数据库表,数据库使用查询语言(SQL)对数据进行搜索与查询,同时,数据库对各个数据表进行关联. 数据库的标准化技术(normalization)讲的是使用正确的方式对数据进行分存以降低冗余,并加快存取速度. 9. 安全

无心插柳,看我如何进入滑雪场管理软件这个小领域

著意栽花花不开,等闲插柳柳成荫 原本计划年底2个月坚持两个月把自己的产品梦实现,但是由于中间出现的一些变化,再次把计划打乱了.这时一个代理兄弟接了一个滑雪场的软件定制项目,正好自己的半成品需要实际项目的验证,于是就接下来.但是没想到的是这个行业水好深啊. 一些公司在这个小领域已经深耕数年,这次不但要替换这家客户原来使用的北京金飞鹰(行业领头羊)的老软件,还是定制开发.注定要被虐得体无完肤了.结构就是驻场开发了20多天业务模型搭建完成,试上线10多天才稳定下来.现在客户评价比老软件方便,用户体验比

Linux负载均衡软件LVS之一(概念篇)

一. LVS简介LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org.现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能.使用LVS技术要达到的目标是:通过LVS提

软件性能测试的基本概念和计算公式(转发)

一.软件性能的关注点 对一个软件做性能测试时需要关注那些性能呢? 我们想想在软件设计.部署.使用.维护中一共有哪些角色的参与,然后再考虑这些角色各自关注的性能点是什么,作为一个软件性能测试工程师,我们又该关注什么? 首先,开发软件的目的是为了让用户使用,我们先站在用户的角度分析一下,用户需要关注哪些性能. 对于用户来说,当点击一个按钮.链接或发出一条指令开始,到系统把结果已用户感知的形式展现出来为止,这个过程所消耗的时间是用户对这个软件性能的直观印象.也就是我们所说的响应时间,当相应时间较小时,

(转)Linux负载均衡软件LVS之一(概念篇)

一. LVS简介LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org.现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能.使用LVS技术要达到的目标是:通过LVS提