首页 > 其他分享 >DDD之理解复杂度、尊重复杂度、掌控复杂度

DDD之理解复杂度、尊重复杂度、掌控复杂度

时间:2024-11-29 22:32:28浏览次数:10  
标签:关系 掌控 复杂度 元素 系统 软件 我们 DDD

DDD之理解复杂度、尊重复杂度、掌控复杂度

本文书接上回《懂了这个道理,人月神话不再是神话!》,关注公众号(老肖想当外语大佬)获取信息:

最新文章更新;

DDD框架源码(.NET、Java双平台);

加群畅聊,建模分析、技术交流;

视频和直播在B站。

关注公众号一定要星标,以及时获得最新推送。

背景

关于“复杂度”我在系列开篇《关于领域驱动设计,大家都理解错了》中就有所剖析,然而在与大家交流的过程中发现,很多对于软件设计决策的分析,最底层的观点冲突来自与对“复杂度”理解的冲突,大家的结论都是构建在它上面的,因此,在这里全面地展示我对于“复杂度”的理解,以期与大家能够在更深的层次上识别共识,明晰分歧。

软件成本与复杂度

我们在设计软件系统的过程中,有一个贯穿始终的约束条件,就是“软件成本”,时间成本、人力成本等等资源,都是有限的,衡量一支团队的效率,同样也可以用“软件成本”来作为计算依据,而软件成本,我认为最核心的因素就是软件的“复杂度”,如果“复杂度”是一个有刻度的尺子,那么我认为,复杂度越高,软件成本越高。而我的软件设计决策的所有依据,都构建在这个起点。如果我们期望降低软件成本,那么就意味着,我们需要降低软件的复杂度,那么理解复杂度就是我们的必经之路。

理解复杂度

要理解复杂度,我们不得不先回答一个问题:如何判断“复杂”和“简单”?我们先来看几个例子,下面两个系统,你觉得哪个更复杂?我想大部分人一定会选“系统2”,因为显然它的元素数量更多。

如果我们的系统元素之间存在一些关系,那么下面两个系统呢?是不是感觉“系统3”更复杂?

基于上面的例子,我们更极端地设想一下,假如你有一个系统A,有100个独立的模块,这些模块之间没有相互联系,另外一个系统B,有10个模块,这些模块之间相互会有影响。我们假设这里的一个个“模块”本身复杂度相同,那么你认为系统A和系统B哪个更复杂?对我而言,我会坚定地认为系统B更复杂。

基于上面的例子,我得出了两个判断:

系统复杂度与元素的数量和元素的关系有关;

元素的关系对系统复杂度的影响远远大于元素的数量所产生的影响;

基于上述的观点,我们就可以根据元素数量、元素关系这两个要素来衡量“复杂度”,也就是说我们可以有一个判断复杂度的标尺,这个标尺有两个重要参数:元素数量、元素关系。

我们知道,不可衡量则不可改进,而有了这个标尺,也意味着我们可以做衡量,可以对决策方案的优劣取舍做判断,这就是我们能够持续改进的起点。

尊重复杂度

经典的复杂度守恒定律表示,“复杂度不可被消除,只可被转移”,我深以为然,回到软件设计领域,我们的复杂度具体在哪里呢?我认为我们的软件系统复杂度的根源,来自于需求本身的复杂度,它决定了最终解决方案复杂度。

既然复杂度无法被消除,那我们是不是可以推导得出,解决方案的复杂度,最小等于需求的复杂度?那么我们在设计方案的过程中,要做的,就是尽可能避免引入额外的复杂度。这个过程,系统元素数量和元素关系成为我们关注的要点,而且元素关系是其中的重中之重。

在我们分析需求,给出解决方案的过程中,复杂度由两方面组成,一个是业务逻辑本身的复杂度,一个是引入的技术复杂度,其中业务逻辑是来自需求,不能打折扣,因此这部分的复杂度是无法被消除的,这也就是为什么我所说的“尊重复杂度”,尊重业务固有复杂度,不要尝试消除它,我们能做的,仅仅是将它的复杂度尽可能封闭在一个个“收纳箱”里,这些收纳箱,就是我们常说的“领域”。

而对于“技术复杂度”,我们要做的就是避免过度设计,避免引入额外的复杂技术,避免牛刀杀鸡,尽可能采取与需求匹配的技术解决方案。

如果你了解“熵”的概念,也许会发现,我们在讨论复杂度逻辑,与“熵增定律”不谋而合,而软件系统的复杂度也是随着我们一步步迭代走向更加复杂和混乱的,我们能做的就是尽可能维持复杂度的增速尽可能地低,使得系统复杂度尽可能在我们所能掌控的范围内。

因此,尊重复杂度,也是对自然规律的尊重。

掌控复杂度

那么,在我们设计和实现软件系统的过程中,该怎么做呢?既然我们知道复杂度与元素数量和元素关系有关,而元素关系又是复杂度的核心来源,那么意味着我们设计的策略可以是:

尽可能避免引入元素关系;

实在不行,用元素数量来置换元素关系,也是划算的;

这些策略,体现在具体的软件系统建模中,具像化出来就是:

保持模型(聚合)之间的边界不被打破;

如果一个需求现有模型无法满足,就考虑创建一个新的模型,而不是把原有的多个模型耦合在一起;

要掌控关系,我们需要具体到代码层面,识别什么是关系,我认为有下面特征的代码都属于关系:

聚合类型之间的相互引用;

一个类型,同

时对多个聚合类型产生操作或影响;

基于上述认知,我们就得出一些代码原则:

标签:关系,掌控,复杂度,元素,系统,软件,我们,DDD
From: https://blog.csdn.net/weixin_55010563/article/details/144017639

相关文章

  • 算法渐进时间复杂度的比较
    算法渐进时间复杂度的比较与可接受范围在学习数据结构的第一章节中,我们经常会遇到一个关于算法渐进时间复杂度的比较结论:这个结论描述了不同时间复杂度函数在(N)趋于无穷大时的增长速率。本文将探讨这些时间复杂度的可接受范围,并解释哪些复杂度在实际应用中是可以接受的。......
  • 第一章——时间复杂度理解
    第一章——算法的时间复杂度1.知道什么是时间复杂度如何看算法的好坏,我们需要评价运行过程中所占用的计算资源计算资源包括时间和空间,我们现在主要考虑占用时间资源时间资源简单说就是计算机处理的时间计算机处理包括两大类(计算和储存)这里我们先把程序设计语言中的语句分类......
  • 算法时间复杂度和空间复杂度计算方法(O(1)、O(n)、O(logn)、O(n^2)、O(n^3 )、O(n!))分
    文章目录时间复杂度与空间复杂度计算方法一、时间复杂度概述1.1时间复杂度的定义1.2常见的时间复杂度-**常数复杂度O(......
  • 配置文件(Configuration Files)在不同的应用场景和技术体系中有多种形式。常见的配置文
    配置文件(ConfigurationFiles)在不同的应用场景和技术体系中有多种形式。常见的配置文件类型可以根据其格式、用途和配置的复杂度进行分类。下面列出了几种常见的配置文件类型:1. INI文件格式:简单的键值对格式,通常包括多个节(Sections)。用途:广泛用于小型应用的配置,如桌面软件、......
  • 1-11一些时间复杂度的证明
    时间复杂度的证明1.大O原理如图所示,大O原理,只取最高的复杂度2.加法原理想要证明这个首先,根据大O定义:F(N)<=C1f(N)G(N)<=C2g(N)再把两者合并起来:F(N)+G(N)<=C1f(N)+C2g(N)设C3=max(C1,C2)则F(N)+G(N)<=C3(f(N)+g(N))所以O(f)+O(g)<=O(f+g)具体证明如图:......
  • 算法的时间复杂度与空间复杂度分析
    一、算法的概念1.算法的定义书上定义:算法是指解决方案的准确且完整的描述,是一系列解决问题的清晰指令。简易说法:算法是解决问题的方法与步骤2.算法的五个重要特性有限性:每个算法都要执行有限步之后结束确定性:每一个步骤要有确切的含义,不能出现二义性可行性:每一条运算能......
  • DDD之理解复杂度、尊重复杂度、掌控复杂度
    本文书接上回《懂了这个道理,人月神话不再是神话!》,关注公众号(老肖想当外语大佬)获取信息:最新文章更新;DDD框架源码(.NET、Java双平台);加群畅聊,建模分析、技术交流;视频和直播在B站。关注公众号一定要星标,以及时获得最新推送。背景关于“复杂度”我在系列开篇《关于领域......
  • 【数据结构】时间和空间复杂度
    时间和空间复杂度1.如何衡量一个算法的好坏2.算法效率3.时间复杂度3.1时间复杂度的概念3.2大O的渐进表示法3.3推导大O阶方法3.4常见时间复杂度计算举例3.空间复杂度【本节目标】算法效率时间复杂度空间复杂度1.如何衡量一个算法的好坏下面求斐波那契数......
  • 深入浅出学算法001-计算复杂度
    题目描述算法复杂度一般分为:时间复杂度、空间复杂度、编程复杂度。这三个复杂度本身是矛盾体,不能一味地追求降低某一复杂度,否则会带来其他复杂度的增加。在权衡各方面的情况下,降低时间复杂度成为本课程学习的重点之一。请计算下面几个程序段的复杂程度,分别用1、logn、n、nl......
  • 算法复杂度
    文章目录一、算法复杂度的概念二、时间复杂度1.大O的渐进表示法三、空间复杂度提示:以下是本篇文章正文内容,下面案例可供参考一、算法复杂度的概念算法在编写成可执⾏程序后,运⾏时需要耗费时间资源和空间(内存)资源。因此衡量⼀个算法的好坏,⼀般是从时间和空间两......