Algorithm
1108. IP 地址无效化
解法一:
直接调用 Java String 的 replaceAll() 方法, 因为该方法内部实现使用了正则匹配, 所以执行效率不高.
1
2
3
4
5class 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
14class 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
19class 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程序员工作法》系列课程, 课程中老师有提到:
设计模式是“术”,设计原则是“道”。
如果说设计模式是“术”,设计原则才是“道”。设计模式并不能帮你建立起知识体系,而设计原则可以。
道和术,是每个程序员都要有的功夫,在“术”上下过功夫,才会知道“道”的价值,“道”可以帮你建立更完整的知识体系,不必在“术”的低层次上不断徘徊。
不禁想起之前看过的一篇文章: 请停止学习框架. 文章叙述了类似的观点, 如果学习框架是学习 “术”. 那么基础知识就是 “道”. “术” 可能会过期, 但”道”不会.
回想我们的学习生涯, 如果缺乏 “术” 的应用, 往往很难理解 “道” 的精髓; 如果缺乏 “道” 的支撑, 很难发挥 “术” 的极致. 道术结合, 才能更加稳健地成长.