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

Note of Justin

關于工作和讀書的筆記

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  47 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

留言簿(14)

搜索

  •  

積分與排名

  • 積分 - 53243
  • 排名 - 433

最新評論

閱讀排行榜

評論排行榜

[原創(chuàng)文章歡迎轉載,但請保留作者信息]
Justin 于 2009-12-20

大師說了,C++的設計還是有缺陷的:它無法把接口(interface)的設計和實現(xiàn)(implementation)的設計完全劃分開來。比如說在一個類的(接口)聲明當中,總是或多或少的會泄漏一些實現(xiàn)上的細節(jié),雖然這樣做與接口的設計并沒有太多聯(lián)系。
有同學說應該多放些代碼一起炒冷飯,是個好主意,下面是書中的修改版本,大致是一樣的。

class ?AClass {
public :
???
void ?interface_1();
???std::
string ?interface_2();
???
// ..
private :
???
// ?implementation?details?are?leaking?as?below..
???std:: string ?internalData_1;
???BClass?internalData_2;
???
// ..
}

這些實現(xiàn)上的細節(jié)往往需要引用其他頭文件中相關對象的定義(比如說下面的代碼),從而產(chǎn)生了對這些頭文件的(在編譯時的)依賴。因此每次這些文件中的某個有變化時,依賴它的所有文件都需要重新編譯。

#include? < string >
#include?
" BClass.h "
// ..

【注意】這里貌似邏輯不是很順:就算沒有那些私有成員的聲明,接口函數(shù)的返回值如果是string或是BClass等類型,不還是一樣需要依賴引用其他頭文件嗎?其實這是兩種不一樣的情況,實現(xiàn)和接口。前面說的實現(xiàn)細節(jié)的泄漏是會導致編譯依賴的,因為編譯器需要了解這些類型對象的大小進而為其分配內存空間;但是接口,比如說函數(shù)的返回值或是參數(shù)表中的參數(shù),就不需要編譯器去考慮分配內存的問題,因此也就沒有所謂的編譯依賴了。
問題知道了,那么解決辦法呢,大師提出“骨肉分離法”(嗯……其實是我的杜撰@#¥%):將聲明(declaration)和定義(definition)分開。

呃……下面的比喻,最好吃完飯再繼續(xù)。
如果說接口是一個類的骨架,那么實現(xiàn)就是他的血肉;如果說聲明讓你摸到了骨頭,那么定義應該就是血和肉生長的地方。
根據(jù)骨肉分離法,對于一個AClass類,第一步先把血肉(定義/實現(xiàn))剝離開,只留下骨架。然后找個盒子(新建一個類,比如說AClassImpl),把血肉放進去。
接下來還有一步,在骨頭盒子里(原AClass類)加一條繩子連著血肉盒子(一個指向AClassImpl的指針),這樣才不至于讓骨肉真正的分離,只要找到了骨頭盒子,就一定能找到血肉盒子,然后對于這個“可憐”的AClass來說,它的全部“零件”都是完整的,啥也沒丟,但是做到了骨肉分離。

也做到了沒有編譯依賴。
因為對于AClass的用戶來說,他們面對的將是一個沒有定義的類,這個類的后繼改動,只要不涉及接口的改動,都不會導致用戶程序的重新編譯。
看到這里想想工作時看到的代碼,原來前輩也有看過啊……
對比前面的例程,給一個“骨肉分離”了的版本吧:

class ?AClassImpl {
// ..
private :
???
// ?implementation?details?are?moved?here..
???std:: string ?internalData_1;
???BClass?internalData_2;
// ..
}


class ?AClass {
public :
???
void ?interface_1();
???std::
string ?interface_2();
???
// ..
private :
???
// ?there?is?only?a?pointer?to?implementation
???std::tr1::shared_ptr < AClassImpl > ?pImpl;
}


// a?constructor:?instantiations?of?AClass?and?AClassImpl?should?always?be?bound?together.
AClass::AClass( // ..)?:?pImpl(new?AClassImpl( // ..))
{
???
// ..
}

前面的文字是自己的理解,而大師的真言是這樣的:

  • 如果可以用指針/引用的話,就不用對象。
  • 如果可以做到僅依賴聲明,就不要依賴定義。
  • 為定義和聲明分別準備兩個頭文件。這樣一來,用戶就可以很簡單做到上面兩點。

如果覺得骨肉分離太殘忍,大師還有另外一個工具:工廠(factory)。
第二種方法中,抽象類/接口類提供了所有接口的純虛函數(shù)形式:會有該類的子類去實現(xiàn)這些接口。與此同時,在抽象類/接口類中還會有一個靜態(tài)(static)的工廠函數(shù)(比如create()/produce()/factory()……),這個函數(shù)實際上起到了構造函數(shù)的作用,它“制造”出子類對象來完成真正的任務,同時返回這個對象的指針(通常是智能指針如shared_ptr)。憑借這個返回的指針就可以進行正常的操作,同時不會有編譯依賴的擔心。一個簡陋的代碼見下:

class ?AClass: public ?AClassFactory {
public :
???AClass()?
{}
???
void ?interface_1();
???std::
string ?interface_2();
???
virtual ? ~ AClass();
// ..
}


class ?AClassFactory {
public :
???
virtual ? void ?interface_1()? = ? 0 ;
???
virtual ?std:: string ?interface_2()? = ? 0 ;
???
// ..
??? virtual ? ~ AClassFactory() { /* .. */ }
???
static ?std::tr1::shared_ptr < AClassFactory > ?Produce( /* .. */ )
???
{
??????
// this?factory?function?could?be?more?complicated?in?practice..
?????? return ?std::tr1::shared_ptr < AClassFactory > ( new ?AClass);
???}

// ..
}



// AClassFactory?could?be?used?in?this?way..
std::tr1::shared_ptr < AClassFactory > ?pAClassObject;
pAClassObject?
= ?AClassFactory::Produce( /* .. */ );
// pAClassObject->..

無論是骨肉分離法還是工廠模式,都可以去除編譯依賴。代價是有的,要為之付出一點點額外代碼執(zhí)行的時間和空間。這個代價又可以通過內聯(lián)函數(shù)(inline function)來減小一些。(不過有聽過這種說法:大部分的編譯器都會將短小的函數(shù)自動轉成內聯(lián)函數(shù)的)
盡管如此,只有在以上做法很明顯地降低了系統(tǒng)的性能的情況下,才可以放棄分離實現(xiàn)和接口的努力。
這是大師的忠告。
posted on 2010-02-01 09:06 Justin.H 閱讀(2092) 評論(2)  編輯 收藏 引用 所屬分類: Effective C++ 炒冷飯

Feedback

# re: 讀書筆記:Effective C++ 炒冷飯 - Item 31 減少文件間的編譯依賴 2012-10-02 20:34 xiaolong
只能說降低編譯依賴,但是實際工作中編譯依賴簡直太大了,而且很多情況下無法避免的吧!  回復  更多評論
  

# re: 讀書筆記:Effective C++ 炒冷飯 - Item 31 減少文件間的編譯依賴[未登錄] 2014-11-18 17:00 liu
寫的不錯,血肉的說法太瘆人了,改成肉吧  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区三区视频在线播放| 欧美亚洲免费高清在线观看| 最新日韩在线| 中文亚洲欧美| 欧美日韩1区| 在线欧美一区| 久久精品亚洲乱码伦伦中文| 一本色道久久综合亚洲精品高清| 浪潮色综合久久天堂| 国内成人精品视频| 久久久久欧美精品| 欧美一区二区三区四区在线观看| 国产精品初高中精品久久| 99精品免费| 日韩视频久久| 欧美亚州一区二区三区| 亚洲自拍偷拍一区| 亚洲深夜福利网站| 国产日韩在线亚洲字幕中文| 久久黄色级2电影| 久久狠狠久久综合桃花| 国内视频精品| 亚洲第一伊人| 欧美伦理91i| 亚洲欧美日韩一区二区三区在线观看| 亚洲精品一区在线观看| 欧美日韩在线精品| 亚洲欧美亚洲| 欧美中文在线免费| 在线精品亚洲| 亚洲三级观看| 国产精品久久久久久久久免费桃花| 亚洲专区国产精品| 欧美一区二区三区在线视频| 亚洲高清在线精品| 亚洲日韩欧美视频一区| 国产精品亚洲欧美| 麻豆freexxxx性91精品| 欧美激情片在线观看| 欧美一级黄色网| 久久亚洲综合网| 一区二区91| 久久成人综合视频| 一区二区三区波多野结衣在线观看| 在线中文字幕一区| 激情欧美丁香| 99视频精品免费观看| 国产一区二区三区四区在线观看 | 欧美日韩黄色大片| 欧美一区二区三区视频| 浪潮色综合久久天堂| 亚洲无吗在线| 久久精品一区蜜桃臀影院| 一本不卡影院| 欧美极品aⅴ影院| 香蕉乱码成人久久天堂爱免费| 欧美一级淫片播放口| av成人动漫| 久久gogo国模啪啪人体图| 一区二区三区 在线观看视| 久久精品中文字幕一区| 亚洲午夜黄色| 另类图片综合电影| 久久av资源网站| 欧美女主播在线| 免费日韩视频| 国产亚洲精品一区二区| 亚洲免费av片| 亚洲日本免费| 久久精品视频在线看| 亚洲一区二区三区中文字幕在线 | 欧美精品福利视频| 免费观看日韩| 国产欧美日韩视频一区二区三区| 亚洲国产精品嫩草影院| 国语自产精品视频在线看8查询8| 99综合视频| 日韩视频在线一区二区三区| 欧美伊人久久| 香蕉久久精品日日躁夜夜躁| 欧美日韩午夜| 亚洲国产日韩精品| **欧美日韩vr在线| 久久精品视频在线看| 久久国产直播| 国产一区久久| 午夜视频在线观看一区| 性欧美激情精品| 国产精品乱人伦一区二区| 99国产精品视频免费观看| 亚洲激情黄色| 久久综合网色—综合色88| 久久中文字幕一区| 一区二区三区我不卡| 久久国产精品99久久久久久老狼| 欧美在线播放一区| 国产日产精品一区二区三区四区的观看方式 | 一区二区三区欧美视频| 免费在线欧美视频| 亚洲第一天堂无码专区| 亚洲精品网站在线播放gif| 免费亚洲电影| 亚洲欧洲另类国产综合| 一本久久综合亚洲鲁鲁| 欧美三级电影精品| 亚洲综合色丁香婷婷六月图片| 午夜免费日韩视频| 国产一区二区精品| 久久久噜噜噜久久中文字幕色伊伊 | 欧美日本韩国在线| 亚洲性感激情| 国产精品美女一区二区| 亚洲伊人网站| 久久免费精品视频| 亚洲国产精品一区二区尤物区| 久久综合伊人77777| 亚洲国产aⅴ天堂久久| 日韩亚洲精品在线| 国产精品久久久久免费a∨大胸| 亚洲男人第一av网站| 久久综合色天天久久综合图片| 亚洲高清视频一区二区| 欧美色精品天天在线观看视频 | 国产伦精品一区二区三区视频孕妇| 亚洲欧美中文日韩v在线观看| 裸体女人亚洲精品一区| 一区二区三区www| 国产视频一区在线| 免费成人高清视频| 一本色道久久88亚洲综合88| 久久久久久自在自线| 日韩亚洲欧美一区| 国产日韩在线播放| 欧美激情a∨在线视频播放| 亚洲综合视频网| 欧美护士18xxxxhd| 香蕉久久精品日日躁夜夜躁| 亚洲国产91色在线| 国产精品日韩欧美| 农村妇女精品| 午夜久久福利| 91久久久久久久久久久久久| 欧美自拍偷拍午夜视频| 99在线精品免费视频九九视| 国产欧美日韩不卡| 欧美日韩国产二区| 久久午夜羞羞影院免费观看| 亚洲天堂av在线免费| 亚洲国产日韩一区| 久久伊人免费视频| 午夜精品www| 日韩午夜av| 亚洲国产91色在线| 国内精品视频666| 国产精品乱码人人做人人爱 | 亚洲午夜激情在线| 亚洲电影第三页| 国产日韩精品在线播放| 欧美日韩性视频在线| 欧美成人精品影院| 久久久久久久久久久成人| 亚洲综合欧美| 一本色道久久综合狠狠躁篇的优点 | 久久精品国产一区二区三区| 亚洲天堂偷拍| 亚洲三级免费观看| 亚洲高清av| 韩日成人av| 国内成+人亚洲| 国产专区欧美精品| 国产亚洲欧美色| 国产欧美在线播放| 国产精品专区第二| 国产精品视频男人的天堂| 亚洲第一福利在线观看| 亚洲欧洲综合另类在线| 国产精品一区二区三区成人| 欧美国产高清| 在线视频免费在线观看一区二区| 久久久久久网| 亚洲精品欧洲| 欧美一区二区精品在线| 黄色工厂这里只有精品| 久久精品在这里| 亚洲欧洲日本在线| 性欧美大战久久久久久久免费观看 | 欧美日本不卡高清| 日韩视频不卡| 老司机午夜精品视频在线观看| 亚洲高清在线视频| 国产精品久久中文| 免费不卡在线视频| 亚洲欧美成人综合| 91久久黄色| 久久综合伊人| 久久久中精品2020中文| 一区二区三区.www| 亚洲人成艺术| 亚洲成色777777在线观看影院| 国产精品国产三级国产普通话蜜臀|