最近,我遇到了一些exception safety相关的问题,虽然,我使用的语言是C++,但我发现这个问题对Java和C#同样存在:在一个类方法的内部会陆续修改若干个外部对象以及自身的成员变量,如果在中间某个地方抛出异常,就需要把已经改变的状态恢复到一致性状态。有点儿类似于数据库里面的事务概念,但数据库的事务直接由数据库支持,程序员使用起来更简单。
后来在网上查找了一些资料,一个实用的建议是:把所有可能抛出异常但无副作用的处理放在前面,把有副作用但不会抛异常的处理放在最后。这让我联想到command pattern:把核心的那个类方法重构为无副作用的,不是直接修改状态而是输出一系列的command;如果成功,再执行这些返回的command(假设执行command本身不会有异常)。
这个例子里面,我体会到了command pattern以数据表达逻辑的好处,command pattern有点儿FP的味道!