青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Shuffy

不斷的學(xué)習(xí),不斷的思考,才能不斷的進(jìn)步.Let's do better together!
posts - 102, comments - 43, trackbacks - 0, articles - 19

【轉(zhuǎn)】http://m.shnenglu.com/tiandejian/archive/2007/06/06/ec_22.html
第22條:
   
盡量將數(shù)據(jù)成員聲明為私有的

好吧,直截了當(dāng)?shù)恼f(shuō),在這一條中:我們首先要分析為什么數(shù)據(jù)成員不應(yīng)該是公有的,與此同時(shí),繼續(xù)分析為什么數(shù)據(jù)成員也不能是 protected 的。然后就引出本條款的結(jié)論:數(shù)據(jù)成員必須是私有的。

那么,數(shù)據(jù)成員為什么不能 public ?

讓我們從討論語(yǔ)義的一致性問(wèn)題開(kāi)始(另請(qǐng)參見(jiàn)第 18 條)。如果數(shù)據(jù)成員不是公有的,那么客戶端程序員要想訪問(wèn)對(duì)象就只剩下成員函數(shù)一種方法。如果公有接口中所有的東西都是函數(shù),那么客戶端程序員在期望訪問(wèn)類成員時(shí),由于一切都是函數(shù),所以就可以任意使用,而不用擔(dān)心是否需要使用括號(hào)。在整個(gè)過(guò)程中,這樣做可以讓你節(jié)省大量躊躇不定的時(shí)間。

但是也許你會(huì)發(fā)現(xiàn),并沒(méi)有強(qiáng)制規(guī)定來(lái)要求語(yǔ)義的一致性。那么你是否會(huì)發(fā)現(xiàn):使用函數(shù)可以讓你更精確地控制數(shù)據(jù)成員的訪問(wèn)權(quán)?如果把一個(gè)數(shù)據(jù)成員定義為 public 的,那么每個(gè)人對(duì)其都擁有“只讀”的訪問(wèn)權(quán),但是如果你使用函數(shù)來(lái)為數(shù)據(jù)成員賦值,或者獲取數(shù)據(jù)成員的值,那么你可以將其實(shí)現(xiàn)為“禁止訪問(wèn)”、“只讀”以及“可讀可寫(xiě)”幾種級(jí)別的訪問(wèn)權(quán);嘿,如果需要,你甚至可以將其實(shí)現(xiàn)為“只寫(xiě)”的訪問(wèn)權(quán):

class AccessLevels {

public:

 ...

 int getReadOnly() const        { return readOnly; }

 void setReadWrite(int value)   { readWrite = value; }

 int getReadWrite() const       { return readWrite; }

 void setWriteOnly(int value)   { writeOnly = value; }

 

private:

 int noAccess;                  // 禁止訪問(wèn)此 int

 int readOnly;                  // int 值擁有只讀級(jí)別訪問(wèn)權(quán)

 int readWrite;                 // int 值擁有可讀可寫(xiě)級(jí)別訪問(wèn)權(quán)

 int writeOnly;                 // int 值擁有只寫(xiě)級(jí)別訪問(wèn)權(quán)

};

很有必要將訪問(wèn)權(quán)管理得如此有條不紊,因?yàn)樵S多數(shù)據(jù)成員本應(yīng)該被隱藏起來(lái)。并不是每個(gè)數(shù)據(jù)成員都需要一個(gè)賦值器和一個(gè)取值器。

還不是十分肯定?那么現(xiàn)在是時(shí)候使出殺手锏了:“封裝”。如果你通過(guò)程序?qū)崿F(xiàn)了對(duì)一個(gè)數(shù)據(jù)成員的訪問(wèn),那么你就可以使用一次計(jì)算來(lái)代替這個(gè)數(shù)據(jù)成員,使用這一個(gè)類的人完全不會(huì)有所察覺(jué)。

請(qǐng)看下邊的示例,假設(shè)你正在為一種自動(dòng)裝置編寫(xiě)一個(gè)應(yīng)用程序,這一裝置可以監(jiān)視通過(guò)汽車的行駛速度,當(dāng)一輛汽車通過(guò)時(shí),這一應(yīng)用程序就會(huì)計(jì)算出它的速度,然后將這一數(shù)值保存到一個(gè)小型數(shù)據(jù)庫(kù)中,其中保存著曾通過(guò)所有車輛的速度數(shù)據(jù):

class SpeedDataCollection {

 ...

public:

 void addValue(int speed);      // 添加新的數(shù)據(jù)值

 

 double averageSoFar() const;   // 返回速度的平均值

 

 ...

};

現(xiàn)在請(qǐng)注意成員函數(shù) averageSoFar 的具體實(shí)現(xiàn)問(wèn)題。一種實(shí)現(xiàn)方法是:為類添加一個(gè)數(shù)據(jù)成員,讓它保存速度的平均值,隨數(shù)據(jù)庫(kù)的改動(dòng)更新這一成員的數(shù)值。當(dāng)調(diào)用 averageSoFar 時(shí),它僅僅返回這一數(shù)據(jù)成員的值。另一種做法是:在每次調(diào)用 averageSoFar 時(shí)都計(jì)算出這一平均值,此時(shí)需要檢查數(shù)據(jù)庫(kù)中所有的數(shù)據(jù)值。

因?yàn)榈谝环N手段(保存即時(shí)更新的平均值)中,你需要為保存即時(shí)更新平均值、累計(jì)總和以及數(shù)據(jù)的個(gè)數(shù)這幾種數(shù)據(jù)成員分配空間,因此這一方法使得 SpeedDataCollection 對(duì)象都變得更大一些。然而, averageSoFar 卻十分的高效。可以把它寫(xiě)成一個(gè)內(nèi)聯(lián)函數(shù)(參見(jiàn)第 30 條),所做的僅僅是返回這一即時(shí)更新的。相反的是,在需要時(shí)進(jìn)行計(jì)算會(huì)使 averageSoFar 變慢,但是 SpeedDataCollection 對(duì)象的體積更小。

二者孰優(yōu)孰劣,誰(shuí)又能斷定呢?在一個(gè)內(nèi)存較為局促的機(jī)器(比如移動(dòng)嵌入式設(shè)備)上,并且該應(yīng)用程序不會(huì)頻繁的調(diào)用平均值,那么在需要時(shí)計(jì)算的方案就更為優(yōu)秀。相反地,在平均值需要頻繁使用,速度是程序的關(guān)鍵,內(nèi)存不是問(wèn)題的情況下,則更應(yīng)采用保存一個(gè)即時(shí)平均值的方案。最重要的一點(diǎn)是,在通過(guò)成員函數(shù)訪問(wèn)平均值時(shí)(也就是“封裝”),你可以交替使用這兩種實(shí)現(xiàn)方案(當(dāng)然,你可能還會(huì)想到其它重要的問(wèn)題),客戶端程序員頂多要做的一件事就是重新編譯一下代碼。(即使這一點(diǎn)所帶來(lái)的不方便也可以排除。參見(jiàn)第 31 條中介紹的技術(shù)。)

將數(shù)據(jù)成員隱藏在函數(shù)接口的背后可以使得任意種類的實(shí)現(xiàn)方法更加靈活多變。比如說(shuō),這樣做可以非常容易地做到下面幾件事情:提醒其它對(duì)象自己的數(shù)據(jù)成員是在被讀還是寫(xiě),驗(yàn)證類的恒定性和函數(shù)運(yùn)算的狀態(tài),在多線程系統(tǒng)下進(jìn)行同步操作,等等。如果讓 Delphi C# 的程序員使用 C++ ,他們會(huì)發(fā)現(xiàn) C++ 這一特性與這些語(yǔ)言中的“屬性”很相像,只是 C++ 中需要一對(duì)括號(hào)。

封裝是 C++ 的一個(gè)博大精深的特性。如果你對(duì)客戶端程序員隱藏了數(shù)據(jù)成員的話(也就是將數(shù)據(jù)成員封裝起來(lái)),你就可以確保類永遠(yuǎn)保持一致性,這是因?yàn)橹挥谐蓡T函數(shù)可以影響到數(shù)據(jù)成員,你保留了在以后改變具體實(shí)現(xiàn)方法的權(quán)利。如果你不將這些方法隱藏起來(lái),那么你很快就會(huì)發(fā)現(xiàn),即使你擁有類的源代碼,你也只能在很小的范圍內(nèi)修改其中公用的部分,因?yàn)檫@樣做會(huì)破壞許多客戶端代碼。公用就意味著未封裝,同時(shí)從實(shí)用角度講,未封裝就意味著無(wú)法更改,較為廣泛應(yīng)用的類更甚之。然而廣泛應(yīng)用的類最需要使用封裝,因?yàn)樗鼈兛梢詮?#8220;具體實(shí)現(xiàn)可以不斷改良”這一點(diǎn)上獲得最大程度的收益。

上面的分析對(duì)于 protected 數(shù)據(jù)成員也適用。盡管二者乍看上去有一定的區(qū)別,實(shí)際上它們是完全一致的。在使用 public 數(shù)據(jù)成員時(shí),我們分析了語(yǔ)意一致性問(wèn)題和訪問(wèn)權(quán)條理性問(wèn)題,這一分析過(guò)程對(duì)于使用 protected 數(shù)據(jù)同樣適用。但還有一個(gè)問(wèn)題——封裝。 protected 數(shù)據(jù)成員不是比 public 的更具有封裝性嗎?從實(shí)用角度講,你會(huì)得到一個(gè)令人吃驚的答案:不是。

23 條中將介紹這一問(wèn)題: C++ 中封裝程度與代碼的健壯程度(這段代碼相關(guān)部分被修改時(shí),抵御自身遭到破壞的能力)成正比。所以我們可以得出下面的結(jié)論:數(shù)據(jù)成員的封裝程度與代碼的健壯程度也是成正比的。代碼遭到的破壞可能是:將某個(gè)數(shù)據(jù)成員從類中移除。(可能你期望使用一次計(jì)算來(lái)代替,就像上文中的 average 一樣。)

請(qǐng)考慮這個(gè)問(wèn)題:假設(shè)我們有一個(gè) public 數(shù)據(jù)成員,然后我們把它刪除了,那么將有多少的代碼將遭到破壞呢?我們說(shuō),所有使用它的客戶端代碼。這將是一個(gè)。公有數(shù)據(jù)成員就是這樣完全沒(méi)有封裝性的。但是繼續(xù)考慮:我們有一個(gè) protected 數(shù)據(jù)成員,然后我們把它刪除了,此時(shí)將破壞多少代碼?我們說(shuō),所有使用它的派生類,這同樣是一個(gè)無(wú)法預(yù)知巨大數(shù)字。由于在這兩種情況下,如果數(shù)據(jù)成員被更改了,那么將會(huì)為客戶端程序員帶來(lái)無(wú)法估量的損失,因此可以說(shuō) protected 數(shù)據(jù)成員與 public 的一樣沒(méi)有封裝性。這是違背直覺(jué)的,但是有經(jīng)驗(yàn)的類實(shí)現(xiàn)者會(huì)告訴你,這是千真萬(wàn)確的。一旦你聲明了一個(gè) public protected 的數(shù)據(jù)成員,然后客戶端程序員開(kāi)始使用它,你就很難再對(duì)這一數(shù)據(jù)成員做出修改。因?yàn)檫@樣做會(huì)帶來(lái)太多的代碼重寫(xiě)、重新測(cè)試重新編寫(xiě)文檔和重新翻譯等等工作。按封裝的理念來(lái)說(shuō),對(duì)于數(shù)據(jù)成員僅僅存在兩個(gè)層次的訪問(wèn)權(quán),那就是: private (可以提供封裝性)和其它的一切(不提供封裝性)。

銘記在心

要將數(shù)據(jù)成員聲明為私有的。這樣可以讓客戶端訪問(wèn)數(shù)據(jù)時(shí)擁有一致的語(yǔ)義,提供有條不紊的訪問(wèn)控制,強(qiáng)制類符合一致性,為類作者提供更高的靈活性。

protected 并不會(huì)帶來(lái)比 public 更高的封裝性。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久亚洲捆绑美女| 亚洲免费观看高清完整版在线观看| 韩国一区二区三区在线观看| 国产精品揄拍一区二区| 国产精品视频一二三| 国产精品视频久久| 国内自拍亚洲| 亚洲国产精品一区在线观看不卡 | 黄色成人av在线| 国内成+人亚洲+欧美+综合在线| 国产午夜精品一区二区三区视频| 国产一区二区三区久久悠悠色av | 欧美大片免费观看| 亚洲精品系列| 亚洲一区精品在线| 欧美一级在线亚洲天堂| 久久综合一区二区三区| 亚洲免费视频成人| 美日韩精品视频| 亚洲私拍自拍| 你懂的网址国产 欧美| 欧美视频一区二区三区在线观看 | 国产精品二区二区三区| 在线播放日韩欧美| 中文在线一区| 榴莲视频成人在线观看| 一本色道久久88亚洲综合88| 午夜日韩电影| 欧美国产日韩一区二区| 国产一区在线免费观看| 99国产精品久久久| 欧美jizzhd精品欧美喷水 | 欧美精品在线一区| 国内精品伊人久久久久av一坑| 亚洲精品一区二区三区99| 久久av在线| 制服丝袜激情欧洲亚洲| 狼狼综合久久久久综合网| 国产精品亚洲网站| 这里只有精品在线播放| 欧美成人精品在线播放| 香蕉成人伊视频在线观看| 欧美激情视频一区二区三区在线播放 | 亚洲综合电影一区二区三区| 免费视频亚洲| 久久精品噜噜噜成人av农村| 国产精品一二三| 一区电影在线观看| 欧美凹凸一区二区三区视频| 午夜精品免费视频| 国产精品国产三级国产a| 亚洲欧洲一区| 欧美成人小视频| 久久资源在线| 在线不卡亚洲| 美日韩精品视频| 欧美激情精品久久久久久黑人 | 亚洲欧美在线视频观看| 亚洲国产欧美一区二区三区丁香婷| 欧美影视一区| 国产精品视频1区| 午夜精品福利视频| 亚洲一区图片| 国产欧美日韩综合一区在线观看| 亚洲欧美资源在线| 午夜日韩在线| 韩国成人福利片在线播放| 久久久久国产精品午夜一区| 性色av香蕉一区二区| 狠狠色丁香婷婷综合影院| 久久久人人人| 欧美成人免费全部观看天天性色| 最新日韩在线| 日韩西西人体444www| 国产精品久久久久999| 欧美在线中文字幕| 欧美一区二区三区精品电影| 在线观看国产精品网站| 欧美激情久久久| 欧美日韩色综合| 久久gogo国模啪啪人体图| 看欧美日韩国产| 一区二区三区精品在线| 亚洲一区二区三区高清 | 午夜精品成人在线视频| 一区二区三区在线视频观看| 亚洲福利av| 国产精品黄色| 免费在线观看成人av| 欧美日韩亚洲一区二区三区| 欧美一区二区三区视频| 久久久噜噜噜久久中文字免| 国产精品99久久久久久白浆小说| 午夜精品一区二区三区在线| 亚洲人成网站色ww在线| 亚洲欧美国产精品专区久久| 亚洲国产精品视频一区| 亚洲一区日韩| aa亚洲婷婷| 久久婷婷国产综合国色天香| 99视频精品免费观看| 欧美一区精品| 亚洲视频在线观看视频| 久久精品一区二区| 亚洲欧美在线另类| 欧美激情aaaa| 久久久久久久久久久成人| 欧美午夜精品久久久久免费视| 久久精品91久久香蕉加勒比| 欧美日韩美女在线| 蜜臀av性久久久久蜜臀aⅴ四虎 | 欧美人成在线| 久久精品在线播放| 欧美日韩一区免费| 欧美大香线蕉线伊人久久国产精品| 欧美三级免费| 亚洲黄色大片| 亚洲高清色综合| 欧美伊人久久久久久午夜久久久久| 一本不卡影院| 久久综合国产精品| 欧美在线高清视频| 国产精品一区二区三区久久久 | 国产精品亚洲欧美| 亚洲看片一区| 亚洲国产一区在线观看| 久久精品夜色噜噜亚洲aⅴ| 欧美在线91| 国产精品一区二区你懂的| 亚洲视频久久| 亚洲欧美日韩国产综合在线| 欧美激情亚洲国产| 欧美国产三级| 91久久嫩草影院一区二区| 久久免费99精品久久久久久| 久久先锋资源| 在线看欧美视频| 裸体女人亚洲精品一区| 欧美大片免费| 91久久久久久久久| 久久香蕉精品| 亚洲国产精品一区二区www| 亚洲人成网站777色婷婷| 麻豆久久婷婷| 亚洲国内精品在线| 亚洲一区二区在线视频| 国产精品成人在线| 亚洲一区二区欧美| 欧美亚洲三级| 国产精品自拍三区| 欧美在线观看一二区| 久久高清福利视频| 狠狠色狠狠色综合日日五| 美国成人直播| 99国产精品久久久久久久久久| 亚洲午夜电影网| 国产欧美一区二区三区久久 | 亚洲欧美日韩精品在线| 欧美一区影院| 影音先锋亚洲一区| 欧美成人自拍| 亚洲一区免费观看| 久久精品中文| 亚洲看片免费| 国产女人aaa级久久久级| 久久国产欧美精品| 亚洲国产电影| 午夜日本精品| 尤妮丝一区二区裸体视频| 欧美国产专区| 亚洲影音一区| 欧美激情在线免费观看| 亚洲先锋成人| 激情文学一区| 一区二区三区国产| 久久久久久久999精品视频| 亚洲国产综合视频在线观看| 国产精品v欧美精品v日韩精品| 午夜精品偷拍| 亚洲精品影院| 看片网站欧美日韩| 亚洲一区免费观看| 影音先锋日韩精品| 国产精品视频网| 欧美精品午夜视频| 欧美一区二区三区免费在线看| 亚洲精品欧美在线| 老司机午夜免费精品视频| 亚洲一区三区电影在线观看| 1000精品久久久久久久久| 国产精品成人观看视频免费| 免费久久99精品国产| 欧美一区日韩一区| 亚洲深夜福利视频| 亚洲精品久久久久久久久久久久| 久久九九热re6这里有精品| 中文欧美日韩| 夜夜嗨av一区二区三区四季av | 欧美系列精品| 欧美精品一区二区三区在线看午夜 |