類的私有變量有何意義

面向?qū)ο笳Z言類的語法幾乎都有私有成員,為什么需要私有成員呢?最近在寫一個(gè)類的時(shí)候严沥,發(fā)現(xiàn)其他類在用到這個(gè)類的時(shí)候,基本都是要讀取它的屬性拷沸,一般我們會(huì)被教導(dǎo)說成員變量都設(shè)置為私有色查,通過getter和setter來獲取和修改它們,但是當(dāng)類的屬性比較多時(shí)撞芍,太多的存取器會(huì)讓這個(gè)類看起來非常龐大秧了,直接將類的屬性設(shè)置為公有,直接讀取它不就好了嗎序无,多省事验毡,為什么很多的書都會(huì)建議你將數(shù)據(jù)成員設(shè)置為私有呢?

首先帝嗡,當(dāng)類的屬性比較多時(shí)晶通,一般這個(gè)類設(shè)計(jì)得不好,可以進(jìn)一步拆分成更小的類哟玷。按照《代碼整潔之道》的說法狮辽,類和函數(shù)都要盡量短小,短小的類一般會(huì)更加內(nèi)聚巢寡,內(nèi)聚的類意味著成員變量在大多數(shù)成員函數(shù)中被使用到喉脖。可以將聯(lián)系緊密的成員變量抽離出來抑月,新建一個(gè)類來使用它們树叽。短小的類,其職責(zé)也更加明確爪幻,當(dāng)別人閱讀你的代碼的時(shí)候菱皆,通過閱讀類的名稱,基本上就能知道這個(gè)類的功能挨稿。

其次仇轻,如果類的屬性比較多,且經(jīng)常需要給其它類直接讀取修改奶甘,而且不好拆分篷店,怎么辦?這種類的對(duì)象更類似C語言中的結(jié)構(gòu)體臭家,或者JavaScript中的json疲陕,你只是想構(gòu)造一種結(jié)構(gòu)體來存儲(chǔ)一坨數(shù)據(jù),作為參數(shù)傳遞給其它函數(shù)或者類钉赁,并允許直接修改它們蹄殃。在C++語言中,可以將這種類聲明為struct類型你踩,并不要給他們?cè)O(shè)置成員函數(shù)诅岩,明確表示它們是一種結(jié)構(gòu)體讳苦。其它語言中可以嘗試使用Map之類數(shù)據(jù)結(jié)構(gòu)來代替,明確表達(dá)出它們是某種數(shù)據(jù)集合的含義吩谦。最喜歡TypeScript語言了鸳谜,TypeScript語言的interface關(guān)鍵字,可以直接聲明某種數(shù)據(jù)集合的類型式廷,非常方便咐扭。

除此之外,對(duì)于類的某些屬性滑废,我們沒有必要刻意把他們作為私有成員去處理蝗肪。有些類的屬性,可以預(yù)見在未來很長(zhǎng)一段時(shí)間都是穩(wěn)定的策严。比如說Image類穗慕,用來表示一張圖片,圖片有寬高屬性妻导,用cols和rows來表示。在使用Image類來表示一張圖像的時(shí)候怀各,我們沒有必要通過getRows或者getCols接口來訪問它們倔韭,rows和cols就是這個(gè)圖像非常基本的一個(gè)屬性瓢对。當(dāng)然它們最好是只讀類型的寿酌,不能直接修改,但是可以訪問硕蛹,一張?zhí)囟▓D片的寬高屬性是不變的醇疼。直接通過rows和cols訪問,語意也更加明確法焰。

class Image {
    public:
        Image(int r,int c):rows(r),cols(c){}
        const int rows;
        const int cols;
}

但是如果你的老板說秧荆,我要知道rows,cols屬性被調(diào)用了多少次,你就得加一個(gè)count屬性埃仪,在每個(gè)讀取rows的地方對(duì)count屬性自增1乙濒,就非常讓人難受。如果通過類的getRows函數(shù)來獲取rows卵蛉,就可以在函數(shù)中對(duì)count+1颁股,如下所示:

class Image {
    private:
        int rows;
        int cols;
        int countRows{0};
        int countCols{0};
    public:
        Image(int r,int c):rows(r),cols(c){}
        int getRows(){ countRows++; return rows; }
        int getCols(){ countCols++; return cols; }
        int getCounts() { return countRows + countCols; }
}

這樣子,我們就沒有必要在每個(gè)地方都countRows++傻丝,countCols++甘有,因?yàn)槟愕男枨笞兞耍xrows和cols就不能直接讀葡缰,要進(jìn)行一定的處理亏掀,這就是給私有變量設(shè)置存取器的好處忱反。同時(shí)在對(duì)私有成員進(jìn)行賦值時(shí),我們也可以對(duì)其進(jìn)行校驗(yàn)等工作幌氮。

但是缭受,我前面說了,rows和cols是非常穩(wěn)定的屬性该互,是一張?zhí)囟▓D片非趁渍撸基本的屬性,沒有哪個(gè)智障想知道rows和cols被調(diào)用了多少次吧宇智,或者對(duì)這兩個(gè)屬性有什么想法蔓搞,所以你直接將rows和cols設(shè)置為公有成員,沒什么不好随橘。

最后喂分,我覺得private被設(shè)計(jì)出來的初衷,就是為了封裝吧机蔗。暴露出來的接口應(yīng)該是穩(wěn)定的蒲祈,而類中的變量隨著需求的變動(dòng)有可能會(huì)增刪改,如果你沒有將這些變量設(shè)置為私有萝嘁,別人寫代碼的時(shí)候直接拿來用了梆掸,某天你把這個(gè)數(shù)據(jù)成員刪掉,人家的代碼就跑不動(dòng)了牙言,而你可能會(huì)覺得別人本來就不該直接用這個(gè)屬性酸钦。就像電腦一樣,使用電腦的人不需要知道什么是CPU咱枉、硬盤等卑硫,鼠標(biāo)鍵盤會(huì)用就好了。CPU什么的就像類的私有變量蚕断,你不想被別人亂動(dòng)欢伏,就把它封裝到機(jī)箱里,只暴露顯示器基括、鍵盤和鼠標(biāo)等給用戶調(diào)用颜懊。假如未來電腦不需要使用內(nèi)存條,也與你無關(guān)风皿,你依舊會(huì)使用電腦河爹。

說了這么多,最后還是這個(gè)結(jié)論桐款,平時(shí)養(yǎng)成好習(xí)慣咸这,在設(shè)計(jì)類時(shí)public變量越少越好!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末魔眨,一起剝皮案震驚了整個(gè)濱河市媳维,隨后出現(xiàn)的幾起案子酿雪,更是在濱河造成了極大的恐慌,老刑警劉巖侄刽,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件指黎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡州丹,警方通過查閱死者的電腦和手機(jī)醋安,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墓毒,“玉大人吓揪,你說我怎么就攤上這事∷疲” “怎么了柠辞?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)主胧。 經(jīng)常有香客問我叭首,道長(zhǎng),這世上最難降的妖魔是什么踪栋? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任放棒,我火速辦了婚禮,結(jié)果婚禮上己英,老公的妹妹穿的比我還像新娘。我一直安慰自己吴旋,他們只是感情好损肛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荣瑟,像睡著了一般治拿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笆焰,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天劫谅,我揣著相機(jī)與錄音,去河邊找鬼嚷掠。 笑死捏检,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的不皆。 我是一名探鬼主播贯城,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼霹娄!你這毒婦竟也來了能犯?” 一聲冷哼從身側(cè)響起鲫骗,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踩晶,沒想到半個(gè)月后执泰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渡蜻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年术吝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晴楔。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡顿苇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出税弃,到底是詐尸還是另有隱情纪岁,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布则果,位于F島的核電站幔翰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏西壮。R本人自食惡果不足惜遗增,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望款青。 院中可真熱鬧做修,春花似錦、人聲如沸抡草。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽康震。三九已至燎含,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腿短,已是汗流浹背屏箍。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留橘忱,地道東北人赴魁。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鹦付,于是被迫代替她去往敵國(guó)和親尚粘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容