《design by contract》中除了介紹了Eiffel 語言偿短,引入了前置條件,后置條件降传,不變量外勾怒。提出了基本操作声旺,基本查詢腮猖,擴展操作赞枕,擴展查詢的概念。
《effective c++》中也提到應(yīng)該把擴展查詢的成員函數(shù)替換為非成員函數(shù)谍椅。理由是為了較低的編譯依賴性古话,較好的可延伸性陪踩,以及較高的封裝性悉抵。
其實,Scott Meyers就是說把擴展查詢放到類的外部去傻谁,作為一個utility 函數(shù)或類來使用审磁。
我能理解他說的話岂座,區(qū)別基本查詢和擴展查詢的確可以純化類的接口,把把我們從大量的類方法記憶中解放出來钾恢。但我不愿意把原先對于一個類的使用變成了一個類加多個utility 方法或再加一個utility 類鸳址。至少我需要記憶的更多了,而且IDE 的智能提示功能似乎也用不上了疹瘦。
最好巡球,能得了便宜又可以賣乖琢锋。
那把utility 直接放到類里吴超,聲明成nested class鸯乃,雖然沒有較低的編譯依賴性,但的確可以知道并選擇使用擴展查詢了鸟悴。當(dāng)然细诸,這種方法肯定不是Scott Meyers 建議的陋守。
class Act
{
public:
Act():_(*this){}
void clearText();
void clearIcon();
class Util{
public:
Util(Act& a):owner(a){}
void clearAll(){
owner.clearText();
owner.clearIcon();
}
private:
Act& owner;
} _;
};
其中clearAll 是擴展操作,調(diào)用了基本操作clearText() and clearIcon().
這樣猩系,對Act 的直接操作都是基本操作和基本查詢:act.clearText();
如果使用擴展查詢則使用: act._.clearAll();
最好的是中燥,IDE自動提示功能可以用了。呵呵拿霉。
沒有技術(shù)含量的文章咱扣,純粹自娛自樂。