Ethan's Blog


  • Home

  • Archives

  • Tags

  • Search

迪米特法则 (LoD)

Posted on 2020-11-07

何为“高内聚、松耦合”?

“高内聚、松耦合”是一个非常重要的设计思想,能够有效地提高代码的可读性和可维护性,缩小功能改动导致的代码改动范围。实际上,“高内聚、松耦合”是一个比较通用的设计思想,可以用来指导不同粒度代码的设计与开发,比如系统、模块、类,甚至是函数,也可以应用到不同的开发场景中,比如微服务、框架、组件、类库等。

为了方便我讲解,接下来我以“类”作为这个设计思想的应用对象来展开讲解,其他应用场景你可以自行类比。在这个设计思想中,高内聚用来指导类本身的设计,松耦合用来指导类与类之间依赖关系的设计。不过,这两者并非完全独立不相干。高内聚有助于松耦合,松耦合又需要高内聚的支持。

高内聚

所谓高内聚,就是指相近的功能应该放到同一个类中,不相近的功能不要放到同一个类中。相近的功能往往会被同时修改,放到同一个类中,修改会比较集中,代码容易维护。

松耦合

所谓松耦合是说,在代码中,类与类之间的依赖关系简单清晰。即使两个类有依赖关系,一个类的代码改动不会或者很少导致依赖类的代码改动。

内聚和耦合的关系

高内聚有助于松耦合,同理,低内聚也会导致紧耦合。关于这一点,我画了一张对比图来解释。图中左边部分的代码结构是“高内聚、松耦合”;右边部分正好相反,是“低内聚、紧耦合”:

Read more »

DRY 原则

Posted on 2020-11-03

DRY 原则的英文描述为:

Don’t Repeat Yourself.

中文直译为:不要重复自己。今天,我们主要讲三种典型的代码重复情况,它们分别是:实现逻辑重复、功能语义重复和代码执行重复。这三种代码重复,有的看似违反 DRY,实际上并不违反;有的看似不违反,实际上却违反了。

实现逻辑重复

我们先来看下面这样一段代码是否违反了 DRY 原则:

Read more »

KISS vs. YAGNI

Posted on 2020-11-03

如何理解 KISS 原则

KISS 原则的英文描述:

Keep It Simple and Stupid.

翻译成中文就是:尽量保持简单。KISS 原则算是一个万金油类型的设计原则,可以应用在很多场景中。它不仅经常用来指导软件开发,还经常用来指导更加广泛的系统设计、产品设计等,比如,冰箱、建筑、iPhone 手机的设计等等。

代码的可读性和可维护性是衡量代码质量非常重要的两个标准。而 KISS 原则就是保持代码可读和可维护的重要手段。代码足够简单,也就意味着很容易读懂,bug 比较难隐藏。即便出现 bug,修复起来也比较简单。

代码行数越少就越“简单”吗?

下面这三段代码可以实现同样一个功能:检查输入的字符串 ipAddress 是否是合法的 IP 地址。

Read more »

复杂度分析

Posted on 2020-11-01

其实,只要讲到数据结构与算法,就一定离不开时间、空间复杂度分析。而且,我个人认为,复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半。

为什么需要复杂度分析?

首先,我可以肯定地说,你这种评估算法执行效率的方法是正确的。很多数据结构和算法书籍还给这种方法起了一个名字,叫事后统计法。但是,这种统计方法有非常大的局限性。

测试结果非常依赖测试环境

测试环境中硬件的不同会对测试结果有很大的影响。比如,我们拿同样一段代码,分别用 Intel Core i9 处理器和 Intel Core i3 处理器来运行,不用说,i9 处理器要比 i3 处理器执行的速度快很多。还有,比如原本在这台机器上 a 代码执行的速度比 b 代码要快,等我们换到另一台机器上时,可能会有截然相反的结果。

测试结果受数据规模的影响很大

后面我们会讲排序算法,我们先拿它举个例子。对同一个排序算法,待排序数据的有序度不一样,排序的执行时间就会有很大的差别。极端情况下,如果数据已经是有序的,那排序算法不需要做任何操作,执行时间就会非常短。除此之外,如果测试数据规模太小,测试结果可能无法真实地反映算法的性能。比如,对于小规模的数据排序,插入排序可能反倒会比快速排序要快!

我们需要一个不用具体的测试数据来测试,就可以粗略地估计算法的执行效率的方法。

Read more »

学习指导手册

Posted on 2020-11-01

现在,针对每个知识点,我再给你逐一解释一下。我这里先说明一下,下面标记的难易程度、是否重点、掌握程度,都只是针对初学者来说的,如果你已经有一定基础,可以根据自己的情况,安排自己的学习。

复杂度分析

尽管在专栏中,我只用了两节课的内容,来讲复杂度分析这个知识点。但是,我想说的是,它真的非常重要。你必须要牢牢掌握这两节,基本上要做到,简单代码能很快分析出时间、空间复杂度;对于复杂点的代码,比如递归代码,你也要掌握专栏中讲到的两种分析方法:递推公式和递归树。

对于初学者来说,光看入门篇的两节复杂度分析文章,可能还不足以完全掌握复杂度分析。不过,在后续讲解每种数据结构和算法的时候,我都有详细分析它们的时间、空间复杂度。所以,你可以在学习专栏中其他章节的时候,再不停地、有意识地去训练自己的复杂度分析能力。

  • 难易程度:Medium;
  • 是否重点:10 分;
  • 掌握程度:在不看我的分析的情况下,能自行分析专栏中大部分数据结构和算法的时间、空间复杂度;
Read more »
1…373839…54
necusjz

necusjz

270 posts
16 tags
© 2016 - 2026 necusjz
Powered by Hexo
Theme - NexT.Mist