稳健性Robustness

认知

背景

public 的方法就是对外公开的

谁都可以调用, 而且可能会不按照你预期调用

什么是

健壮性 / 鲁棒性 / 稳定性 / 稳健性

有能力处理运行时错误, 处理错误的输入

不管怎么运行都不崩溃

可能破坏稳健性的诱因

类型错误

add(value:int)

增加一个新的结点在链表末端, 值为 value

错误情况
1!
list.add("10");
分析

Java 的编译器 会在编译时 检测问题

如果有, 就飘红

范围错误

get(index:int)

返回第 index 个元素的值

错误情况
1 2
list.get(7);list.get(-1);
分析

如果 list 只有 3 个元素

Java 编译器不会帮你检查

需要自己进行验证, 保证数值范围合理

边界情况

add(value:int)

增加一个新的结点在链表末端, 值为 value

错误情况
1 2 3 4 5 6 7 8
public class LinkedList { ... public void add(int value) { Node node = new Node(value); getLast().setNext(node); } ...}
分析

如果当前 list 没有结点...

边界情况下, 处理代码可能有所不同

需要自己进行边界检测, 保证边界情况运行正常

处理

特殊情况分析

类型错误

编译器帮你处理

范围错误

需要处理

边界情况

需要处理

特殊情况排查方法

先写一般情况的代码

分析特殊情况

分析现有代码能否接住特殊情况

不能,就要写 if 分支

早推出Early Exits

使用前
1 2 3 4 5 6 7 8 9 10 11 12 13 14
public void insert(int index, int value) { if (index >= 0 && index <= size) { if (index == 0) { LinkedListNode node = new LinkedListNode(value); node.setNextNode(headNode); headNode = node; } else { LinkedListNode previousNode = getNode(index - 1); LinkedListNode node = new LinkedListNode(value); node.setNextNode(previousNode.getNextNode()); previousNode.setNextNode(node); } }}
使用后
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
public void insert(int index, int value) { // 早退出 if (index < 0 || index > size) { return; } if (index == 0) { LinkedListNode node = new LinkedListNode(value); node.setNextNode(headNode); headNode = node; } else { LinkedListNode previousNode = getNode(index - 1); LinkedListNode node = new LinkedListNode(value); node.setNextNode(previousNode.getNextNode()); previousNode.setNextNode(node); }}

ZZAX 微信公众

文档一更新,立刻告诉你