今天看到这个文章,觉得没有很nice。
我们太喜欢流程控制了,在程序中写了太多的if else
也许我们对于逻辑非常的清晰,但是对于阅读你代码的人来说就是一场灾难。
很多人都说使用多态来避免过多的if else嵌套,但是有时候你会觉得新写一个类似乎有点小题大做,尤其在整个代码已经庞大的时候。
还有人说,可以把if else语句转换为switch语句,这样也可以适当的避免多层的if嵌套。
auto pa = CreateA(); status = doStuffByA(pa); auto pb = CreateBbyA(pa); status = doStuffByB(pb);
讯享网
就像上面这段代码,正常的逻辑很简单,但是如果考虑到错误处理的话,代码就变得异常麻烦了。
下面这段代码单纯的依靠if-else处理问题,可以看到代码嵌套很严重,而且在很多地方都需要调用DestoryA(pa);,都是重复的逻辑。
讯享网bool Init(){ A* pa = nullptr; B* pb = nullptr; pa = CreateA(); if (pa) { if (doStuffByA(pa)) { pb = CreateBbyA(pa); if (pb) { if (doStuffByB(pb)) { } else { DestoryB(pb); DestoryA(pa); return false; } } else { DestoryA(pa); return false; } } else { DestoryA(pa); return false; } } else{ return false; } return true; }
C++11下,我们有了利器unique_ptr
bool Init4() { auto deleterA = [&](A* p){ if (p) DestoryA(p); }; std::unique_ptr<A, decltype(deleterA)> pa(CreateA(),deleterA); if (!pa){ return false; } if (doStuffByA(pa.get())){ return false; } auto deleterB = [&](B* p){ if (p) DestoryB(p); }; std::unique_ptr<B, decltype(deleterB)> pb(CreateBbyA(pa.get()), deleterB); if (!pb){ return false; } if (doStuffByB(pb.get())){ return false; } pa.release(); pb.release(); return true; }
上面的代码也是出自连接:http://www.jianshu.com/p/9898abc55677
有了前面的基础,读懂很容易吧:
pa pb均为具有自定义删除器的智能指针;
定义删除器用到了lambda表达式;
使用了unique_ptr的get()方法来 Returns the stored pointer.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/58788.html