一个好的系统应该具备可扩展性、灵活扩展性。

一个系统越复杂,就越应该让他易维护,而实现可复用性是实现可维护性的一种手段。

可维护性

什么是可维护性?

可维护性指的是系统被修改能力和可修复能力。

细化来说:

  • 被修改能力指的是系统随需求、环境、容量等需求变化带来的修改适应。

  • 可修复能力指的是在系统发生故障时,可以快速排查问题并修复问题的能力,并且低成本方式实现流程的正常运行的可能。

总结来说,可维护性体现在以下几个特性:

  • 易分析:系统发生故障时,可以快速定位并分析出原因;

  • 易改变:面对新需求时,拥有快速实现需求的能力,体现在代码、组件、文档等方面;

  • 易测试:系统的变更可以快速被验证;

  • 稳定性:兼容新变更的基础之上,不影响原有系统运行的能力;

那如何度量系统的可维护性呢?

一、可理解性

通过阅读代码或设计文档快速了解系统架构、功能、运行逻辑的难易程度。

一个可理解性高的系统具备以下特征:

  • 模块化:系统各个模块结构良好、功能完整;

  • 程序代码清晰;

  • 编程风格一致:(代码风格、设计风格一致);

  • 完整性:(对数据数据有完整性检查);

  • 有意义的数据命名和函数命名;

二、可靠性

可靠性表明一个系统在给定的时间段内正确执行的概率。

可以用MTTF作为可靠性的预测指标。

三、可测试性

可测试性表明可以用测试的方法来验证程序正确性的难易度。

系统的可测试性取决于系统的可理解性、复杂性、设计的合理性、测试用例的覆盖度等。

四、可修改性

可修改性描述了橙心可以被正确修改的难易程度。

一个可修改的程序应该是可理解的、通用的、简单的、灵活的。通用性是指程序适用于各种功能变化而无需修改。灵活性指的是容易的对系统进行修改。

系统的可维护性不但和架构师采用的分析设计方法和技术熟练程度有关,还和项目管理技术有密切的联系,所以可以建立如下规范:

  1. 开发人员有统一的约束规范;

  2. 从需求--业务分析--架构设计--编码实现--测试发布--线上运营是否采用了统一的文档结构和文档形式;

  3. 是否有完整的代码说明文档;

  4. 是否有持续更新保存规范化的测试用例信息;

复用性

复用是架构思维中非常重要的一种思维,是面向对象的核心。所以我们会做很多业务能力组件化、组件能力服务化、共享平台、业务中台、公共服务下沉等动作,本质上都是为了提升系统能力或业务能力的复用。

实现好的的复用性,需要我们做很多取舍的设计,很多人只考虑了代码的复用性而忽略了更高层次的复用,当然代码的复用是最基本的,但为了提高复用的价值,应该从更高层次看待复用性。

复用性的好处

  1. 有较高的生产效率

  2. 有较高的系统质量

  3. 可以提高系统的可维护性

复用分类

复用可以分为代码复用、算法复用、数据结构复用、设计复用、分析复用、组件复用、服务复用、系统复用、功能复用等。

代码复用是最常用的复用方式,代码复用一般可以通过共享通用类、函数集合来实现,即便是最差的情况下,代码复用也可以通过拷贝和修改源代码来实现。

代码复用的最大好处是可以减少你的代码量,无形中降低了维护成本。当然更高层面或更大量代码的复用,可以通过构建大量代码组件库实现。

做好代码复用,可以遵守以下原则。

面向接口编程,是面向对象设计的第一个基本原则。

面向接口编程是要我们先把业务逻辑线抽象出来作为接口,具体业务实现可以通过对该接口的实现来完成。

当客户需求变化时,只需要编写改业务逻辑的实现类,或修改配置文件即可,而不需要现成代码,减少了系统的侵入。

组合大于继承

组合大于继承是面向对象的第二个基本原则。

继承是在程序开发过程中通过重构得到的,而不是程序设计之初就采用多重继承去实现代码扩展性。这也是继承常常导致代码难以维护的一个主要原因。

其实组合大于继承这个思想不仅仅是代码编写、面向对象的思想,在很多中台框架层面同样有类似的设计思想,比如中台系统下不同业务个性化逻辑的实现本质上就是原子功能的再组合实现的。

当然继承也并不是一无是处,如果想用好某些特性,我们就需要考虑他的优缺点,以便在合适的时候选择不同的方案。

继承的优缺点

优点:

  1. 继承直观,关系在编译时静态定义;

  2. 被复用的实现易于修改,sub实现可以覆盖super实现;

缺点:

  1. 无法在运行时变更从super继承来的实现;

  2. sub的部分实现通常定义在super里面;

  3. sub直面super的实现细节,破坏了封装;

  4. super的实现的任何变更,都会强制sub的实现变更,因为他们联系在一起了;

  5. 如果新问题不能通过继承实现,则必须重写super或继承来实现;

用好继承的一个方法是对协议层抽象,也就是通过继承尽量解决那些标准化的。

组合的优缺点

优点:

  1. 不会破坏封装,因为只通过接口来访问对象;

  2. 减少依赖关系,因为是通过接口来定义的;

  3. 可以在运行时将任意对象替换为其他同类型对象;

  4. 可以保持类的封装以专注于单一任务;

  5. 类和他的层次结构保持整洁,不至于过度膨胀而无法管理;

缺点:

  1. 涉及对象多;

  2. 系统行为将依赖不同对象关系,而不是定义于单个类中;

  3. 现成的组件总是不太够用,从而导致不停的定义新的对象;

变与不变的分离

变与不变的分离是面向对象设计的第三个原则。

如果使用继承达到复用的目的,可以在抽象基类中定义好不可变的部分,而由其子类实现可变的部分,不可变部分不需要重复定义,且便于维护。

如果使用组合达到复用的目的,可以定义好不变的部分,可变的部分可以由不同的组件实现,根据需求在运行时动态配置。

经过拆分,我们可以将更多的时间关注到可变的部分,对于组合技术而言,每个组件只需完成较小的功能,相互之间耦合松散,复用率高,通过组合,可以获得新功能。

控制代码长度

太长的方法难以理解,如果太长了,我们需要进行重新设计。方法重构有以下三个原则:

  1. 三十秒原则:如果程序员不能在30s内说明白函数的why、what、how的话,就说明需要维护;

  2. 单一职能原则:如果发现一个方法不止做一件事情,那么就需要拆出来;

  3. 一屏原则:如果一个函数的代码长度超过一个屏幕,就应该拆成多个小的函数,代码尽量短,只做一件事情;

减少case、if语句

避免代码中过多使用switch/case、if/else语句,代码的可读性差,同时违背了面向对象的原则。

减少参数个数

大量参数传递的方法通常难阅读。可以将所有的参数封装到一个对象中完成参数的传递,封装是面向对象的基本要求之一,每个对象功能尽量简单也是面向对象的基本原则。

通过抽象类实现多重继承

在一些场景下,提供一个抽象基类有利于做特性扩展,一个类可以实现多个接口,从而实现了“多重继承”,为设计提高了灵活性。

减少对变量的直接访问

不要把类的属性直接暴露给其他类,而应该通过访问方法去保护他们,如果属性名字修改,只需要修改他的访问方法,而不是修改所有相关代码。

拆分过大的类

如果一个类有太多方法(超过50个),那么他可能做的事情太多了,应该试着将它们的功能拆分到不同的类中。

作用不同的对象应该拆分

有同样数据结构,但不同作用的对象应该拆分,比如do、po、vo等。

设计复用

设计复用可以涵盖从用例设计、标准文档、领域模型、过程指导全研发周期。

设计复用提升了项目间的一致性,减少了各个项目的管理成本。

为了引入不必要的复杂度,需要设计一个复用的底线,就是当你需要时去使用它,比如从现有系统的设计结果中提取一些可复用的设计组件,将这些用于新的系统设计中。

分析复用

分析复用听起来比较抽象,它是针对业务领域中某些设计或者问题抽象出来的组件,受技术影响较小,所以复用价值更大。

比如领域驱动思想,在很多系统中分析时一致的。

适当的使用复用,可以提高可维护性,比如一些组件的复用。

其实复用是一种态度,在设计系统架构时,就应该考虑后续的架构应该以怎样的方式在其他场合被复用。另一种方式可以主动分享你的工作成果,这样大家才能知道他,才可以复用他。

架构思维-高业务复杂度系统建设思路相关推荐

  1. 领导驾驶舱=管理驾驶舱?领导驾驶舱系统建设思路

    近期特别盛行领导驾驶舱,那么领导驾驶舱是什么,跟管理驾驶舱有什么异同吗 ?其实领导驾驶舱系统也称作"管理驾驶舱"系统,不同的叫法而已. 领导驾驶舱是以成型的指标体系及管理方法促进科 ...

  2. 以业务管理信息化系统建设推动施工企业数字化转型

    建筑业从追求建造速度到提升建筑质量,从传统建造方式逐步向建筑工业化转型.面对数字化时代的考验,建筑央企积极探索BIM技术.装配式.人工智能.大数据等数字化技术与建筑业的融合发展. 施工企业的数字化应该 ...

  3. 用户属性标签系统建设思路以及结构

    一:用户属性标签系统建设流程步骤: 二:用户属性标签系统架构图:

  4. 我国域名***日均58起 高安全DNS防御系统建设刻不容缓

    日前,国家互联网应急中心发布的<2013年中国互联网网络安全报告>显示,作为互联网运行的关键基础设施,我国域名系统面临安全漏洞和拒绝服务***等多种威胁,是影响网络稳定运行的薄弱环节.中心 ...

  5. 业财一体化系统建设思路

    一.业财一体化的定义 业财一体化,即业财融合.业财一体化改善的是财务数据的状况,把财务数据与业务数据融合在一起.当前企业的财务数据存在以下几个问题: 1.数据不及时.每个月结完账后,才能把这个月的财务 ...

  6. 一套基于 SpringBoot 的完整高并发电商系统,拿去面试简直不要太好用!

    如何反驳"99% 的 Java 程序员都是 Spring 程序员"这句话? 答案是不能. 互联网发展至今,站在巨人肩膀上编程像一日三餐一样寻常.Spring Boot 的确凭一己之 ...

  7. 美团外卖自动化业务运维系统 - Alfred

    1背景 美团外卖业务在互联网行业是非常独特的,不仅流程复杂--从用户下单.商家接单到配送员接单.交付,而且压力和流量在午.晚高峰时段非常集中.同时,外卖业务的增长非常迅猛,自2013年11月上线到最近 ...

  8. 金融机构的反洗钱(AML)合规工作和系统建设

    声明 个人原创, 转载需注明来源 https://www.cnblogs.com/milton/p/16252061.html 反洗钱 AML 从国家机器的角度, 集体非法活动, 无论是金融还是非金融 ...

  9. 系统架构设计——高可扩展性架构

    高可扩展性架构: 国内某大型互联网企业经常因为对同行的产品进行微创新,然后推出自己的产品而遭人诟病,不讨论这种做法是否合适,我们分析这些产品,发现大多数都比原创产品有更好的用户体验.这些产品常常后来居 ...

最新文章

  1. SQL SERVER数据库中的数据类型 转
  2. python解释器是什么-python解释器都有什么
  3. 通信电子线路期末复习第二章下
  4. STM32F4 HAL库开发 -- NVIC 中断优先级管理
  5. Linux 下修改hosts文件
  6. antd的 input有下拉_antd select下拉添加全选的按钮
  7. JUnit+EclEmma进行覆盖测试
  8. Java ClassLoader
  9. 够用的 Python 写日志的知识——标准日志模块logging简介
  10. Hadoop核心生态
  11. java 日志框架 详解_springboot日志详解
  12. python网易云收费_python网易云音乐抓取
  13. 大数据处理的基本流程:数据抽取与集成+数据分析+数据解释
  14. php中的opendir函数,php中opendir函数的用法详解
  15. js中操作cookie
  16. 关于企业微信二次开发
  17. SpringSecurity自定义多Provider时提示No AuthenticationProvider found for问题的解决方案与原理(四)
  18. appium之toast处理
  19. 计算机网络怎么连接两台机器,两台电脑怎么连接局域网,小编教你两台电脑怎么连接局域网...
  20. JQuery常见命令查找网站

热门文章

  1. UVA10652 Board Wrapping(求凸包、计算凸多边形面积)
  2. P1102 A-B 数对(二分,映射)难度⭐
  3. B-监狱逃脱(BFS)
  4. 计算机一级b类试题及答案,计算机一级b类试题及答案
  5. pta 整型关键字的平方探测法散列
  6. quartz 分布式_6大分布式定时任务对比
  7. java 终极超类,Java问答:终极父类(3),java问答
  8. 100例shell脚本之八远程管理获得hosts ip以及推送公钥到hosts
  9. 聊聊sentinel的SystemSlot
  10. 从 Gzip 压缩 SVG 说起 — 论如何减小资源文件的大小