溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++怎么實(shí)現(xiàn)最小限度暴露成員

發(fā)布時(shí)間:2021-11-25 14:05:09 來源:億速云 閱讀:138 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“C++怎么實(shí)現(xiàn)最小限度暴露成員”,在日常操作中,相信很多人在C++怎么實(shí)現(xiàn)最小限度暴露成員問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”C++怎么實(shí)現(xiàn)最小限度暴露成員”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

C.9:最小限度暴露成員

Reason(原因)

Encapsulation. Information hiding. Minimize the chance of unintended access. This simplifies maintenance.

封裝性。信息隱藏。將非故意訪問的可能性降至最低。簡(jiǎn)化維護(hù)。

譯者注:這是封裝最直接的好處。

Example(示例)

template<typename T, typename U>struct pair {    T a;    U b;    // ...};

無論我們?cè)谧⑨尩奈恢米鍪裁矗琾air的任何用戶都可以隨意、獨(dú)立的修改數(shù)據(jù)成員a和b。在大規(guī)模代碼中,我們無法簡(jiǎn)單地發(fā)現(xiàn)是哪段代碼對(duì)pair的成員做了什么。如果這就是我們想要的當(dāng)然沒問題,但是如果我們想要加強(qiáng)成員間聯(lián)系,就需要將它們變更為私有成員并通過構(gòu)造函數(shù)和成員函數(shù)強(qiáng)化這種聯(lián)系(不變式)。例如:

class Distance {public:    // ...    double meters() const { return magnitude*unit; }    void set_unit(double u)    {            // ... check that u is a factor of 10 ...            // ... change magnitude appropriately ...            unit = u;    }    // ...private:    double magnitude;    double unit;    // 1 is meters, 1000 is kilometers, 0.001 is millimeters, etc.};
Note(注意)

If the set of direct users of a set of variables cannot be easily determined, the type or usage of that set cannot be (easily) changed/improved. For public and protected data, that's usually the case.

如果無法簡(jiǎn)單地決定一組變量的直接用戶,這組變量的類型和用法就無法(簡(jiǎn)單地)變更和改善。公有或保護(hù)成員,基本上屬于這種情況。

Example(示例)

A class can provide two interfaces to its users. One for derived classes (protected) and one for general users (public). For example, a derived class might be allowed to skip a run-time check because it has already guaranteed correctness:

一個(gè)類可以向用戶提供兩類接口。一類面向派生類(保護(hù)成員),一個(gè)面向普通用戶(公有成員)。例如,由于已經(jīng)保證了正確性,某個(gè)派生類可能會(huì)允許省略某項(xiàng)運(yùn)行時(shí)檢查。

class Foo {public:    int bar(int x) { check(x); return do_bar(x); }    // ...protected:    int do_bar(int x); // do some operation on the data    // ...private:    // ... data ...};
class Dir : public Foo {    //...    int mem(int x, int y){        /* ... do something ... */        return do_bar(x + y); // OK: derived class can bypass check    }};
void user(Foo& x){    int r1 = x.bar(1);      // OK, will check    int r2 = x.do_bar(2);   // error: would bypass check    // ...}
Note(注意)

protected data is a bad idea.

保護(hù)型數(shù)據(jù)是個(gè)壞主意。

Note(注意)

Prefer the order public members before protected members before private members see.

較好的順序是公有成員在保護(hù)成員之前,保護(hù)成員又在私有成員之前。

譯者注:還有一個(gè)類似的規(guī)則是:如果成員之間有調(diào)用關(guān)系,那么調(diào)用者在前,被調(diào)用者在后。

Enforcement(實(shí)施建議)

  • Flag protected data.

    在發(fā)現(xiàn)保護(hù)型數(shù)據(jù)時(shí)進(jìn)行提示。

  • Flag mixtures of public and private data

       在發(fā)現(xiàn)公有和私有數(shù)據(jù)混雜在一起時(shí)進(jìn)行提示。

到此,關(guān)于“C++怎么實(shí)現(xiàn)最小限度暴露成員”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI