條款18:讓接口更容易被使用,不容易被誤用

條款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ā)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容