稳健性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); }}