ARTS-No.4

Algorithm

1108. IP 地址无效化

  • 解法一:

    直接调用 Java String 的 replaceAll() 方法, 因为该方法内部实现使用了正则匹配, 所以执行效率不高.

    1
    2
    3
    4
    5
    class Solution {
    public String defangIPaddr(String address) {
    return address == null ? null : address.replaceAll("\\.", "[\\.]");
    }
    }

    执行用时: 3ms, 内存消耗: 34.4MB.

  • 解法二:

    把 String 转换为 StringBuilder, 手动替换.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Solution {
    public String defangIPaddr(String address) {
    if (address == null) {
    return null;
    }

    StringBuilder sb = new StringBuilder(address);
    for (int index = sb.indexOf("."); index > -1; index = sb.indexOf(".", index + 2)) {
    sb.replace(index, index + 1, "[.]");
    }

    return sb.toString();
    }
    }

    执行用时: 1ms, 内存消耗: 34MB.

  • 解法三:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class Solution {
    public String defangIPaddr(String address) {
    if (address == null) {
    return null;
    }

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < address.length(); i++) {
    char c = address.charAt(i);
    if (c == '.') {
    sb.append("[.]");
    } else {
    sb.append(c);
    }
    }

    return sb.toString();
    }
    }

    执行用时: 0ms, 内存消耗: 34.1MB.

Review

SOLID Principles: Explanation and examples

SOLID 是由 Robert C.Martin 提出, 由 Michael Feathers 定义的面向对象编程的让程序更易于理解, 维护和扩展 5 个基本原则的首字母缩写. 这 5 个原则分别是:

S - Single responsibility principle

单一职责原则: 一个类或者一个模块只应负责一项职责, 只能因为一个动机被改变.

O - Open/closed principle

开放封闭原则: 包括模块, 类, 方法等在内的实体应该对扩展开放, 对修改闭合.

L - Liskov substitution principle

里氏替换原则: 父类的实例应该随时可以被子类的实例替换而不会引起程序错误.

I - Interface segregation principle

接口隔离原则: 任何一个客户不应被强迫依赖一个它不会使用的方法. 或者说, 不要通过添加新方法向现有接口添加新功能.

D - Dependency inversion principle

依赖倒置原则: 依赖倒置原则是程序解耦的一种方法, 依赖倒置原则要求:

  • 高层模块不应该依赖于低层模块, 它们都应该依赖于抽象层;
  • 抽象不应该依赖细节, 细节应该依赖抽象.

通过这 5 个原则, 可以让我们的程序变得可重用, 可维护, 可扩展并且易于测试.

重述

之前对 SOLID 原则的认识只在 “听过” 的程度, 直接阅读英文文档可能造成理解偏差, 所以又参考了几篇中文文章, 对其中的原则简单重述.

单一职责原则

一个类只应承担一种责任. 换句话说: 让一个类只做一件事. 如果需要承担更多的工作, 那么分解这个类.

开放封闭原则

实体应该对扩展是开放的, 对修改是封闭的. 即: 可扩展, 不可修改.

里氏替换原则

一个对象在其出现的任何地方, 都可以用子类实例做替换, 并且不会导致程序的错误. 换句话说: 子类应该可以在任何地方替换父类且程序功能不受影响.

接口隔离原则

客户不应被强迫依赖它不使用的方法. 即, 一个类实现的接口中, 不应该包含它不需要的方法. 将接口拆分成更小和更具体的接口, 有助于解耦, 从而更容易重构和更改.

依赖倒置原则

  • 高层次的模块不应依赖低层次的模块, 他们都应该依赖于抽象;
  • 抽象不应依赖于具体实现, 具体实现应依赖抽象.

参考文献

  • 面向对象的SOLID原则

Tip

这周发现了 IDEA 的又一款神级一键部署插件: Cloud Tookit , 简单配置之后, 便可以开启一键部署之旅. 中小型应用福音, 强烈建议尝试!!!

Share

本周的review主题来自郑晔老师的《10x程序员工作法》系列课程, 课程中老师有提到:

设计模式是“术”,设计原则是“道”。
如果说设计模式是“术”,设计原则才是“道”。设计模式并不能帮你建立起知识体系,而设计原则可以。
道和术,是每个程序员都要有的功夫,在“术”上下过功夫,才会知道“道”的价值,“道”可以帮你建立更完整的知识体系,不必在“术”的低层次上不断徘徊。

不禁想起之前看过的一篇文章: 请停止学习框架. 文章叙述了类似的观点, 如果学习框架是学习 “术”. 那么基础知识就是 “道”. “术” 可能会过期, 但”道”不会.

回想我们的学习生涯, 如果缺乏 “术” 的应用, 往往很难理解 “道” 的精髓; 如果缺乏 “道” 的支撑, 很难发挥 “术” 的极致. 道术结合, 才能更加稳健地成长.

Seven wechat
扫码关注, 一起进步.
0%