C++

type 与 RTTI

时常,我们在程序中经常出现这样的switch或者if-else分支:
if (pobj->IsKindOf(Circle))
else if (pobj->IsKindOf(Rectangle))
等。其中上面的IsKindOf也可能是我们自定义的GetType(),或者是C++标准中的dynamic_cast。

不管怎么样,这是十分不好的设计/风格。
原因很简单,要添加一个新的类型,所有这些条件判断的地方都需要做更改;反之,使用多态只需要添加一个SubClass(当然,也可以在类层次上作一些调整)。

因此,MFC的CObject::IsKindOf() 明确的指出Do not use this function extensively because it defeats the C++ polymorphism feature. Use virtual functions instead.

如何应对这个问题呢,
MartinFlower在《重构》中明确的指出了几条细则,包括:
Replace Type Code with Class;
Replace Type Code with State/Strategy;
Replace Type Code with Subclasses;
Replace Conditional with Polymorphism

既然如此,为什么还需要IsKindOf,dynamic_cast这些玩意呢。

在BS的《C++语言的设计与演化》中的《强制》一章“为什么提供一种危险‘特征’”一节中,我们可以找到讲RTTI作为标准的一些理由。这里就不一一罗列。
(“危险”两个词用的好,o(∩_∩)o)

每一个有用的特征都可以被误用。。。

STL之争

STL向来是一个有争议的话题。

最初接触STL的时候,给人眼前一亮的是,STL实现了数据结构和算法的分离,这也是STL设计的核心思想。

在实现上,STL源代码也是能够给人一些启发的。比如sort算法的实现(这应该不是STL的开创),sort主要采用快速排序,对于初步有序的短系列,采用插入排序,对于快速排序的极端情况,还可能使用堆排序。 Continue Reading