文章目录

  • 前言
  • 牢固性(Immobility)
    • 原文
    • 我的理解
  • 粘滞性(Viscosity)
    • 原文
    • 我的理解

前言

最近读Robert C. Martin(Bob大叔)的书《敏捷软件开发》,准备围绕这本书开一个专题来写点读书总结。本文是这个专题的第二篇。

设计模式有六大原则:单一原则;里氏替换原则;依赖倒置原则;接口隔离原则;迪米特原则;开闭原则。软件腐化可以理解为是设计模式六大原则的对立面。

当软件出现以下七种特征之一时,就说明软件正在腐化:僵化性(Rigidity)、脆弱性(Fragility)、牢固性(Immobility)、粘滞性(Viscosity)、不必要的复杂性(Needless Complexity)、不必要的重复(Needless Repetition)、晦涩性(Opacity)。


牢固性(Immobility)

原文

设计中包含了对其他系统有用的部分,但是要把这些部分从系统中分离出来需要的努力和风险是巨大的。

我的理解

牢固性(Immobility)在实际做项目做开发时还是很常见的,这里我就不具体举例说明了。

大致列举几种我认为最常见的导致牢固性(Immobility)的场景:代码注释不足、代码中经常针对特殊情况开小灶(做特殊处理)、代码写的比较反人类(比如各种“与”、“或”、“非”逻辑运算的复杂排列组合)。


粘滞性(Viscosity)

原文

当面临一个改动时,开发人员常常会发现会有多种改动的方法。其中,一些会保持设计;而另外一些会 破坏设计(也就是生硬的手法) 。当那些可以保持系统设计的方法比那些生硬手法更难应用时,就表明设计具有高的粘滞性。做错误的事情是容易的,但是做正确的事情却很难。

我的理解

说起粘滞性(Viscosity),我们公司目前的项目在架构设计方面就遇到一个和粘滞性(Viscosity)有关的问题,下面我就
以此为例来聊聊。这个例子稍微有点复杂,得耐心一点看下去。

粗略的架构图:

为了便于后续描述,先详细介绍一下系统的总体架构思路:系统采用微服务架构的思想来进行业务拆分,分了四大系统(即四套WebAPI接口,也可以理解为四个服务):底层的核心数据系统(管理公用的核心数据)、底层的单点登录系统(管理用户相关数据)、上层的业务子系统1、上层的业务子系统2。核心数据系统负责共享核心数据,单点登录系统负责统一和共享各个业务系统的用户数据,而所有的实际业务都在业务子系统1或者业务子系统2里完成。这四大系统之间通过Web API(即Http接口)的形式来完成依赖(见图中虚线)。

有这样一个场景:在业务子系统1中有一个业务a(见图中标蓝字体),这个业务a需要同时拼接:业务子系统a自身的业务表a,单点登录系统里的用户表,核心数据系统里的核心数据表A。

正常情况下,我们在业务子系统1中会先通过Web API去访问单点登录系统里的用户表和核心数据系统里的核心数据表A,然后再从业务子系统1自身的数据库中获取业务表a,以完成拼接,整个拼接的过程在业务子系统a的业务代码中完成。这种拼接方式是符合这张架构图的设计初衷的——业务子系统1与单点登录系统或者核心数据系统的依赖关系全部都收敛在业务子系统1的业务代码中。

但是,上述的情况在实际操作中会出现两个难以解决的问题:1、在 业务子系统1的业务代码里完成表的拼接所需要编写的代码量很大,尤其是有时候涉及到分组(group by)代码会特别难以编写;2、在业务子系统1的业务代码里完成表的拼接需要借助Web API去依赖单点登录系统和核心数据系统,这样写出来的代码运行效率极其低下,因为每一次都需要把单点登录系统的用户表里的大块数据和核心数据系统的核心数据表A的大块数据全部取过来,加载到业务子系统1的业务代码的内存中进行下一步的拼接、分组、排序、筛选等操作。

于是,有同事想出来一个 破坏设计(也就是生硬的手法) 但是能解决上述两个问题的办法:

鉴于我们四大系统的各个数据库在实际部署时,都部署在同一台服务器,而且由同一个账号下的用户统一管理(数据库权限分配这一点本身是存在很大问题隐患的)。我们可以在业务子系统1的数据库下创建存储过程(数据库级别的业务代码),在这个存储过程里直接访问单点登录系统里的用户表和核心数据系统里的核心数据表A,以及自身的业务表a,完成拼接。(见下图)


这样一来,只需要在业务子系统1的业务代码里去调用该存储过程即可,所有业务逻辑都在存储过程里实现。这样做,既减少了工作量,又不用担心效率问题。但是这样做破坏了设计:业务子系统1对单点登录系统和核心数据系统的依赖不再仅仅是通过WebAPI,依赖关系不再收敛于 业务子系统1的业务代码 中了,这为后续系统的维护和扩展埋下很深的隐患。

在上述这个例子里,做错误的事情(破坏原有设计的事情)是容易的,做正确的事情(符合设计的事情)很难。原有的架构设计看似优美而且合理,但是落实的时候,由于业务代码拼接表时语法的有限性(相对于数据库自带SQL语法),以及在现有条件下Http通信效率不好等问题,原有架构设计就体现出很严重的粘滞性(Viscosity)。


软件腐化的七个特征之牢固性和粘滞性(设计模式原则的反面) (《敏捷软件开发》读书总结第二篇)相关推荐

  1. 软件腐化的七个特征之僵化性和脆弱性(设计模式原则的反面) (《敏捷软件开发》读书总结第一篇)

    文章目录 前言 僵化性(Rigidity) 原文 我的理解 脆弱性(Fragility) 原文 我的理解 前言 最近读Robert C. Martin(Bob大叔)的书<敏捷软件开发>,准 ...

  2. 影像组学视频学习笔记(34)-使用3D Slicer软件提取影像组学特征、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/afcd06221ea4 来源:简书,已获授权转载 RadiomicsWorld.com "影像组学世界" ...

  3. 3D溜溜网站用的是php吗_浩辰3D软件中全面的阵列特征你会用吗?快来看看吧

    现如今越来越多的设计师为了提高了设计效率开始使用3D软件来绘图,比如浩辰3D软件,SolidWorks等.那么在3D软件中如何使用阵列功能呢?下面给大家详细介绍一下浩辰3D软件中提供的阵列特征的使用教 ...

  4. 数据科学和人工智能技术笔记 七、特征工程

    七.特征工程 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 稀疏特征矩阵上的降维 # 加载库 from sklearn.preprocessing import St ...

  5. 应用ArcGIS和COORD软件进行坐标七参数转换的方法

    应用ArcGIS和COORD软件进行坐标七参数转换的方法 一.数据参数注意事项 1. 我们使用的测绘数据,例如: X 2835697.754 X为纬度 (7位数) Y 613544.641 Y为经度 ...

  6. 软件管理的“七个女妖”-不要相信她们

    <人件>中总结了软件管理中七个不真实期望,请不要相信这些期望,它们被比喻为七个女妖: (1)有使你的生产力剧增的新诀窍,你已经错过了: (2)其他经理的成效是正100%.200%或者更多: ...

  7. 程序员生存定律--细论软件这个行当的根本特征

    程序员生存定律这系列的目录在这里:程序员生存定律--目录 喜欢从头瞄的,可以移步. ---------------------------------------------------------- ...

  8. 图扑软件荣获第七届“创客中国”中小企业创新创业大赛优胜奖!

    2022 年 11 月 17 日,由工业和信息化部.财政部共同主办的第七届"创客中国"中小企业创新创业大赛全国总决赛在浙江杭州落下帷幕. 本次<第七届"创客中国&q ...

  9. 利用COORD软件进行坐标七参数转换

    参考致谢:微信公众号 GIS前言 问题:同一个点的经纬度坐标在不同地理坐标系下是否相同? 答案:目前国土资源部门要求矿权登记采取西安80坐标系登记,以前都是采用的北京54坐标系,本以为两个坐标系同一点 ...

最新文章

  1. 在Cuda上部署量化模型
  2. 谷歌、亚马逊的顶级GPU被质疑太贵了!这种CPU算法竟然快15倍
  3. LINUX在逻辑卷基础加盘操作步骤
  4. cd linux盒上盖子不休眠,CDLinux 自动休眠功能的关闭方法
  5. python gui tkinter_python学习之GUI(Tkinter)
  6. Arcgis for javascript不同的状态下自定义鼠标样式
  7. 我们分析了全美Top Business Analyst 和 Data Science专业,最后给你总结了这几点
  8. 疑问:当流量被封禁之后(论资本之力):防流量被恶意盗挖(抛砖篇)
  9. Guice Aop 与 Hasor Aop 原理及其实现
  10. UVA11760 Brother Arif, Please feed us!【bitset】
  11. 从底层来看函数的调用和返回
  12. Life is not fair, get used to it.
  13. csdn博客登录不上-why?
  14. 三分钟入门电力系统之----------三道防线
  15. 删除镜像文件,显示操作无法完成,因为文件已经在system中打开。解决办法
  16. python ttf font weight_使用FontCreator将ttf字体制作多字重字体并打包为Magisk字体模块...
  17. android源生获取经纬度,Android获取GPS经纬度
  18. c++ 崩溃 正则表达式regex_C++正则表达式regex初探及踩的坑
  19. 微信聊天,对方回复“哦”怎么办?学会这3个技巧,永不尬聊
  20. 【关于python中整除与取余】

热门文章

  1. 我爱你,没有什么目的:情感日志
  2. 斯坦福NLP名课带学详解 | CS224n 第19讲 - AI安全偏见与公平(NLP通关指南·完结)
  3. 读aroundall的回复有感
  4. js 递归算法将扁平数据处理成树状数据
  5. 基于DTW相似度的Affinity Propagation(AP)聚类
  6. Neuraldecipher-逆向工程:从扩展连接性指纹(ECFPs)到其分子结构
  7. jar包 加密 ----xjar (亲测可用)
  8. Office中的Word无法关联内嵌EndNote
  9. 2011年最差的CES(消费电子展)
  10. hdu 5045 Contest--2014acm上海赛区网络赛