Ethan's Blog


  • Home

  • Archives

  • Tags

  • Search

学习指导手册

Posted on 2020-11-01

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

复杂度分析

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

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

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

Dependency Inversion Principle (DIP)

Posted on 2020-10-26

控制反转(IoC)

控制反转的英文翻译是 Inversion of Control,缩写为 IoC。我们先通过一个例子来看一下,什么是控制反转:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class UserServiceTest {
public static boolean doTest() {
//...
}

public static void main(String[] args) {
// 这部分逻辑可以放到框架中
if (doTest()) {
System.out.println("Test succeed.");
}
else {
System.out.println("Test failed.");
}
}
}

在上面的代码中,所有的流程都由程序员来控制。如果我们抽象出一个下面这样一个框架,我们再来看,如何利用框架来实现同样的功能。具体的代码实现如下所示:

Read more »

Interface Segregation Principle (ISP)

Posted on 2020-10-11

如何理解 ISP

接口隔离原则的英文翻译是“ Interface Segregation Principle”,缩写为 ISP。Robert Martin 在 SOLID 原则中是这样定义它的:

Clients should not be forced to depend upon interfaces that they do not use.

直译成中文的话就是:客户端不应该被强迫依赖它不需要的接口。其中的“客户端”,可以理解为接口的调用者或者使用者。

实际上,“接口”这个名词可以用在很多场合中。生活中我们可以用它来指插座接口等。在软件开发中,我们既可以把它看作一组抽象的约定,也可以具体指系统与系统之间的 API 接口,还可以特指面向对象编程语言中的接口等。

前面我提到,理解接口隔离原则的关键,就是理解其中的接口二字。在这条原则中,我们可以把“接口”理解为下面三种东西:

  • 一组 API 接口集合;
  • 单个 API 接口或函数;
  • OOP 中的接口概念;
Read more »

Liskov Substitution Principle (LSP)

Posted on 2020-09-28

如何理解 LSP

里式替换原则的英文翻译是:Liskov Substitution Principle,缩写为 LSP。这个原则最早是在 1986 年由 Barbara Liskov 提出,他是这么描述这条原则的:

If S is a subtype of T, then objects of type T may be replaced with objects of type S, without breaking the program.

在 1996 年,Robert Martin 在他的 SOLID 原则中,重新描述了这个原则,英文原话是这样的:

Functions that use pointers of references to base classes must be able to use objects of derived classes without knowing it.

我们综合两者的描述,将这条原则用中文描述出来,是这样的:子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为(behavior)不变及正确性不被破坏。

这么说还是比较抽象,我们通过一个例子来解释一下。如下代码中,父类 Transporter 使用 org.apache.http 库中的 HttpClient 类来传输网络数据。子类 SecurityTransporter 继承父类 Transporter,增加了额外的功能,支持传输 appId 和 appToken 安全认证信息:

Read more »

Open Closed Principle (OCP)

Posted on 2020-09-18

如何理解 OCP

开闭原则的英文全称是 Open Closed Principle,简写为 OCP。它的英文描述是:

Software entities (modules, classes, functions, etc.) should be open for extension, but closed for modification.

我们把它翻译成中文就是:软件实体(模块、类、方法等)应该“对扩展开放、对修改关闭”。

这个描述比较简略,如果我们详细表述一下,那就是,添加一个新的功能应该是,在已有代码基础上扩展代码(新增模块、类、方法等),而非修改已有代码(修改模块、类、方法等)。

这是一段 API 接口监控告警的代码。其中,AlertRule 存储告警规则,可以自由设置。Notification 是告警通知类,支持邮件、短信、微信、手机等多种通知渠道。NotificationEmergencyLevel 表示通知的紧急程度,包括 SEVERE(严重)、URGENCY(紧急)、NORMAL(普通)、TRIVIAL(无关紧要),不同的紧急程度对应不同的发送渠道:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Alert 
{
private AlertRule rule;
private Notification notification;

public Alert(AlertRule rule, Notification notification)
{
this.rule = rule;
this.notification = notification;
}

public void check(String api, long requestCount, long errorCount, long durationOfSeconds)
{
long tps = requestCount / durationOfSeconds;
if (tps > rule.getMatchedRule(api).getMaxTps())
{
notification.notify(NotificationEmergencyLevel.URGENCY, "...");
}
if (errorCount > rule.getMatchedRule(api).getMaxErrorCount())
{
notification.notify(NotificationEmergencyLevel.SEVERE, "...");
}
}
}
Read more »
1…383940…55
necusjz

necusjz

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