條款18:讓接口更容易被使用,不容易被誤用
1镊掖、使用外覆類型乃戈,預(yù)防客戶參數(shù)寫入錯(cuò)誤
Date18(int month, int day, int year);
如上函數(shù)聲明,我們可以通過名稱的命名堰乔,來告知每個(gè)用戶的變量含義偏化。但,如以下:
Date18 date(12, 8, 2019);
Date18 date(8, 12, 2019);
我們無法從函數(shù)的使用上進(jìn)行任何的區(qū)分:
Date18 date(13, 8, 2019);
這種狀況的出現(xiàn)镐侯,可能是由于:
1侦讨、客戶端打算寫入 8月13日驶冒,但是變量順序反了
2、客戶端本打算寫入 12月8日韵卤,但輸入錯(cuò)誤
這種狀況我們無法知曉骗污,必須通過函數(shù)的定義,去獲取含義沈条。
fix:
Date_fix(MyMonth month, MyDay day, MyYear year);
使用另外的類型 MyMonth需忿、MyDay、MyYear來告知用戶每個(gè)位置的變量含義蜡歹,同時(shí)可以在每個(gè)外覆類中限制值的范圍屋厘,防止用戶出現(xiàn)輸入錯(cuò)誤的情況。如下:
class MyMonth
{
public:
MyMonth Jan()
{
return MyMonth(1);
}
...
private:
MyMonth(int month):
m_month(month)
{
}
int m_month;
}
2月而、使用const汗洒、explicit、shared_ptr來限制接口
const:
a*b = c
以上代碼是任何人都不想遇見的父款,如果在 operator*前添加限制符 const 可以防止以上這種情況的出現(xiàn)溢谤。
explicit:
防止類構(gòu)造函數(shù)的隱式自動(dòng)轉(zhuǎn)換
shared_ptr:
class Investment
{
public:
Investment()
{
std::cout << __FUNCTION__ << std::endl;
}
~Investment()
{
std::cout << __FUNCTION__ << std::endl;
}
};
class Factory
{
public:
std::shared_ptr<Investment> CreateSharedPointer();
Investment* CreatePointer();
};
std::shared_ptr<Investment> Factory::CreateSharedPointer()
{
std::shared_ptr<Investment> res(new Investment);
return res;
}
Investment * Factory::CreatePointer()
{
return new Investment;
}
在用戶不知道delete申請(qǐng)內(nèi)存時(shí),預(yù)測(cè)一下憨攒,上面兩個(gè)函數(shù)調(diào)用后回出現(xiàn)什么情況呢世杀。
3、保持接口的一致性肝集,且與內(nèi)置類型的行為兼容
MyList
{
bool isNotEmpty();
}
std::list
{
bool empty();
}
雖然命名清晰瞻坝,含義容易理解,不過應(yīng)該沒有人想要使用MyList的接口杏瞻,特別是兩種類同時(shí)使用時(shí)湿镀,后續(xù)維護(hù)的開發(fā)人員,怕是要掉光了頭發(fā)