條款18:讓接口更容易被使用,不容易被誤用
1、使用外覆類型,預(yù)防客戶參數(shù)寫入錯誤
Date18(int month, int day, int year);
如上函數(shù)聲明,我們可以通過名稱的命名,來告知每個用戶的變量含義。但,如以下:
Date18 date(12, 8, 2019);
Date18 date(8, 12, 2019);
我們無法從函數(shù)的使用上進行任何的區(qū)分:
Date18 date(13, 8, 2019);
這種狀況的出現(xiàn),可能是由于:
1、客戶端打算寫入 8月13日,但是變量順序反了
2、客戶端本打算寫入 12月8日,但輸入錯誤
這種狀況我們無法知曉,必須通過函數(shù)的定義,去獲取含義。
fix:
Date_fix(MyMonth month, MyDay day, MyYear year);
使用另外的類型 MyMonth、MyDay、MyYear來告知用戶每個位置的變量含義,同時可以在每個外覆類中限制值的范圍,防止用戶出現(xiàn)輸入錯誤的情況。如下:
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ù)的隱式自動轉(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申請內(nèi)存時,預(yù)測一下,上面兩個函數(shù)調(diào)用后回出現(xiàn)什么情況呢。
3、保持接口的一致性,且與內(nèi)置類型的行為兼容
MyList
{
bool isNotEmpty();
}
std::list
{
bool empty();
}
雖然命名清晰,含義容易理解,不過應(yīng)該沒有人想要使用MyList的接口,特別是兩種類同時使用時,后續(xù)維護的開發(fā)人員,怕是要掉光了頭發(fā)