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

huaxiazhihuo

 

c++面向對象的類設計

類的設計在于用恰到好處的信息來完整表達一個職責清晰的概念,恰到好處的意思是不多也不少,少了,就概念就不完整;多了,就顯得冗余,累贅,當然特例下,允許少許的重復,但是,這里必須要有很好的理由。冗余往往就意味著包含了過多的信息,概念的表達不夠精準,好比goto,指針,多繼承這些貨色,就是因為其過多的內涵,才要嚴格限制其使用。好像,more effective c++上說的,class的成員函數,應該是在完整的情況下保持最小化。但是,這里我們的出發點,是成員數據的完整最小化。

最小化的好處是可以保持概念最大的獨立性,也意味著,可以用最小的代價來實現這個概念,也意味著對應用層的代碼要求越少,非侵入式?好比c++11 noexcept取代throw(),好比從多繼承中分化出來接口的概念,好比不考慮多繼承虛繼承的普通成員函數指針。又比如,如果不要求只讀字符串以0結束,那么就可以把只讀字符串的任何一部分都當成是只讀字符串。類的對外功能固然重要,但是,類不能做的事情,也很重要。

首先是要有清晰的概念以及這個概念要支持的最基本運算,然后在此基礎上組織數據,務求成員數據的最小化。當然,概念的產生,并非拍著腦袋想出來的,是因為代碼里面出現太多那種相關數據的次數,所以就有必要把這些數據打包起來,抽象成一個概念。好比說,看到stl算法函數參數到處開始結束的迭代器,就有必要把開始結束放在一起。比如說,string_view的出現,這里假設其字符存儲類型為charstring_view就是連續char內存塊的意思,可以這樣表示

struct string_view

{

         const char* textBegin;

         size_t length; //或者 const char* textEnd

};

這里的重點是,string_view里面的兩個成員字段缺一不可,但是也不必再添加別的什么其他東西。然后,在這兩個數據上展開實現一系列的成員函數,這里,成員函數和成員字段這兩者,有一點點雞生蛋生雞的糾結,因為必要成員函數的集合(原始概念的細化),成員函數決定了成員字段的表示,而成員字段定下來之后,這反過來又能夠驗證成員函數的必要性。不管怎么說都好,成員函數的設計,也必須遵從最小完整化的原則。再具體一點,就是說但凡一個成員函數可以通過其他成員函數來實現,就意味著這個函數應該趕出類外,作為全局函數存在。當然,這也不是死板的教條,有些很特殊的函數,也可以是成員函數,因為成員函數的使用,確實很方便。

可能會有疑惑,感覺所有的成員函數其實都可以是全局函數。或者說,我們可以對每一個成員字段都搞一對setget的函數,那么所有的其他成員函數就可以是全局函數的形式,很容易就可以遵守最小完整化的原則。當然,這是明顯偷懶,拒絕思考的惡劣行為。與其這樣,還不如就開放所有的成員字段,那樣子就落入c語言的套路了。所以的法論是,一個函數,這里假設是全局函數,如果它的實現必須要訪問到成員字段,不能通過調用該類的成員函數(一般不是getset)來達到目的,或者,也可以強行用其他函數來完成任務,但是很麻煩,或者要付出時間空間上的代價,那么就意味著這個函數應該是該類的成員函數。

類的設計,就是必不可少的成員字段和必不可少的成員函數,它們一起,實現了對類的原始概念的完整表達,其他什么的,都不必理會。一個類如果不好寫,往往意味著這個類的功能不專一,或者其概念不完整,這時,可以不要急著抽象,如果一個類有必要誕生,那么在代碼的編寫中,該類的抽象概念將一再重復出現,猿猴對它的理解也越來越清晰,從而,水到渠成地把它造出來。所有非需求推動,非代碼推動的,拍著腦袋,想當然的造類行為,都是在臆造抽象,脫離實際生活的藝術,最終將被淘汰。

類的設計,其著眼點在于用必要的數據來完整表達一個清晰的概念。而繼承,則是對類的概念進行細化,也就是分類,好比說生物下面開出來動物、植物這兩個子類,就是把生物分成動物、植物這兩類,繼承與日常生活的分類不太一樣,繼承的分類方式是開放式,根據需要,隨時可以添加新的子類別。整個類的體系,是一顆嚴格的單根樹,任何類只能有一個根類。從任何類開始,只能有一條路徑回溯到最開始的根類,javaC#中就是Object,所有的類都派生自Object,這是一棵大樹。單根系下,萬物皆是對象,這自然很方便,起碼,這就從語言層面上直接支持c++ std的垃圾any了。而由于javaC#完善的反射信息,拋棄靜態類型信息,也可以做動態語言層面上的事情,而cc++void*,所有的動態類型信息全部都在猿猴的大腦中。java平臺上生存著大把的動態語言,而且,性能都還很不錯。

相對很多語言來說,c++就是怪胎就是異數,自有其自身的設計哲學,它是多根系的,它不可能也沒必要搞成單根系,當然,我們可以假設一個空類,然后所有的類都默認繼承自這個空類。c++的所有類組成一個森林,森林里的樹都長自大地。但是不管怎么說都好,只能允許單繼承,千萬不要有多繼承,這是底線,千萬千萬不能違背(當然,奇技淫巧的場合,就不必遵守這個戒條,多繼承千般不是,但是不可或缺,因為它可以玩出來很多花樣,并且都很實用很必要)。最起碼,單根系出來的內存布局直觀可預測,一定程度上跨編譯器,只有良好的內存布局,才有望良好的二進制復用。另外,父類對子類一無所知,不要引用到子類一丁點的信息,要保持這種信息的單向流動性。

在這種單根系的等級分明的階級體系下,一切死氣沉沉,沒有一點點的社會活力。顯然,只有同屬于同一父類的類別之間,才能共享那么一丁點可憐的共性。如果沒有接口搗亂,將是怎樣的悲劇,最好的例子,mfc,真是厲害,沒有用到接口,居然可以做出來嚴謹滿足大多數需要的gui框架,沒有接口,并不表示它不需要,因為mfc開了后門,用上了更厲害的玩意----消息發送,即便如此,mfc有些地方的基類還有依賴到子類,這就很讓人無語了。

c++下,類的設計絕對不對兒戲,一定要清楚自己想要的是什么,抽象出來的概念才不會變成垃圾。大而全的類,遠遠不如幾個小而專的細類。javaC#下的類開發很方便,但是粒度過大,把一攬子的東西都丟給你,強賣強買,反正只要類一定義,必然相應的就會出現一大坨完善的反射信息,而對象里面也包含了一些無關緊要的成員字段,而對象的訪問,也全部都是間接引用的訪問,雖然,現在計算機性能過剩,這些都無傷大雅。c++給了開發者最大的選擇,而搞c++的猿猴,基本上都智力過剩,對于每種選擇,都清楚其背后的代價以及所要到達的目的,所以雖然開發時候,存在心智包袱影響開發效率,但是,但內心就不會存在什么性能包袱的負罪感。就個人而言,還是喜歡c++這種最高自由度的語言,有時候,對于內存最細致的控制,可以得到更精簡的設計,這里無關運行性能,好比說,在c++中,只要內存布局一致,即便是不同類型的對象,通過強制類型轉換來統一對待,進而做匪夷所思之事,好比COM里面,為了聚合復用,一個類,竟然可以針對同一個接口提供兩套實現方式。這種方便,在其他強類型語言中是不支持的。

某種意義上講,c++在面向對象上提供的語言機制,就是為了方便地生成各種內存布局,以及此內存布局上所能支持的操作,虛函數用以生成一堆成員函數指針,繼承則用以方便地生成一坨成員字段,……。所以,c++的面向對象就是面向內存布局地設計,而多繼承、虛繼承、模板這些鬼東西很容易就導致內存布局的失控,不過,如果使用得當,卻又有鬼斧神工之奇效,創造出來其他語言所沒有的奇跡。真的,論動態行為藝術,任何語言在c++這個大人面前都是幼兒園里的小學生。

為了引出接口,本座花大力氣做科普。這也沒辦法,因為類雖然是基礎,但是靜態面向對象的精華,全部都在接口上。只有清晰明確類的功能職責,才能理解接口的必要性以及其多樣性。那么,可不可以只有接口,沒有類的。可以,就好像com那樣子,而代價是,使用起來,各種不方便。這個世界,從來就不存在包治百病之萬能藥。什么事情都能做的意思就是什么都做不好。

posted on 2017-07-14 11:48 華夏之火 閱讀(1430) 評論(0)  編輯 收藏 引用 所屬分類: c++技術探討

導航

統計

常用鏈接

留言簿(6)

隨筆分類

隨筆檔案

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产农村妇女毛片精品久久麻豆 | 亚洲清纯自拍| 亚洲精品国产精品国自产观看| 国产精品嫩草久久久久| 欧美成人免费大片| 国产日本欧美一区二区| 日韩一级精品视频在线观看| 在线免费不卡视频| 欧美一区二区三区四区夜夜大片| 中文网丁香综合网| 欧美韩国一区| 欧美成人精品在线观看| 国产一区999| 亚洲一区二区在线看| 在线视频欧美日韩精品| 毛片av中文字幕一区二区| 久久久久久亚洲精品不卡4k岛国| 欧美三级在线播放| 亚洲精品免费观看| 日韩视频精品在线| 欧美激情精品久久久久久蜜臀| 麻豆成人精品| 狠狠做深爱婷婷久久综合一区| 午夜视频在线观看一区二区| 亚洲欧美福利一区二区| 国产精品xvideos88| 日韩一二三区视频| 在线综合+亚洲+欧美中文字幕| 欧美成人亚洲成人日韩成人| 欧美国产激情| 亚洲欧洲在线一区| 欧美精品一区三区在线观看| 91久久综合| 99视频超级精品| 欧美日韩免费高清一区色橹橹| 亚洲精品国久久99热| 一区二区三区欧美成人| 欧美色精品在线视频| 中文网丁香综合网| 久久丁香综合五月国产三级网站| 国产亚洲精品激情久久| 久久精品麻豆| 欧美激情黄色片| 亚洲精品影视| 欧美成人精品激情在线观看| 在线观看成人av电影| 欧美成人一区二区三区在线观看| 91久久国产自产拍夜夜嗨| 一本一道久久综合狠狠老精东影业| 欧美区一区二| 一区二区三区www| 久久激五月天综合精品| 亚洲国产aⅴ天堂久久| 欧美精品激情blacked18| 亚洲精品之草原avav久久| 亚洲性视频h| 国产在线视频欧美一区二区三区| 久久综合久久88| 亚洲精品国产精品国自产在线| 香蕉视频成人在线观看| 尤物yw午夜国产精品视频| 欧美日韩hd| 欧美在线免费观看亚洲| 欧美激情在线观看| 午夜国产精品影院在线观看 | 在线成人av网站| 欧美日韩国产大片| 欧美在线日韩精品| 亚洲欧洲一区二区三区在线观看| 午夜精品网站| 亚洲国产精品成人一区二区| 国产精品久99| 欧美xart系列高清| 欧美在线免费观看视频| 亚洲美女免费精品视频在线观看| 久久久国产精品一区二区三区| 亚洲精品日产精品乱码不卡| 国产日韩一区二区三区在线| 欧美精品日韩综合在线| 久久激情五月婷婷| 中文国产成人精品久久一| 欧美激情视频一区二区三区在线播放| 亚洲免费视频观看| 亚洲精品精选| 国外成人在线视频| 国产精品自在线| 欧美日韩大片一区二区三区| 免费不卡在线观看| 久久黄色小说| 亚洲欧美精品中文字幕在线| 亚洲日韩第九十九页| 欧美成人精品一区| 麻豆成人在线播放| 久久精品伊人| 欧美一区二区三区啪啪| 亚洲视频图片小说| 夜夜爽av福利精品导航| 亚洲国产影院| 亚洲高清电影| 亚洲国产裸拍裸体视频在线观看乱了中文| 国产精品嫩草久久久久| 欧美午夜三级| 欧美三级第一页| 欧美日韩国产首页在线观看| 欧美精品在线免费播放| 麻豆9191精品国产| 久久一区二区三区av| 老司机精品视频网站| 美女脱光内衣内裤视频久久影院| 一区二区三区欧美日韩| 亚洲国产精品久久久久婷婷老年| 一区免费观看视频| 国产日韩精品在线| 国产一区免费视频| 激情av一区二区| 亚洲电影在线| 亚洲国产视频一区二区| 亚洲激情在线观看| 日韩视频免费大全中文字幕| 亚洲精品孕妇| 亚洲网在线观看| 亚洲欧美日韩一区在线| 欧美一区二区视频在线| 久久激情久久| 欧美国产第二页| 亚洲精品永久免费| 亚洲欧美日韩国产综合| 欧美专区亚洲专区| 每日更新成人在线视频| 欧美精品久久99| 国产精品每日更新| 激情综合自拍| 亚洲老板91色精品久久| 中文欧美在线视频| 久久成人免费视频| 欧美成人精品在线视频| 日韩视频在线观看一区二区| 亚洲永久在线观看| 久久精品三级| 欧美人与性动交cc0o| 国产久一道中文一区| 在线日韩欧美| 亚洲图片在线观看| 久久人人九九| 99热精品在线| 久久久精品久久久久| 欧美久久在线| 国内成人在线| 一本色道久久综合狠狠躁篇的优点| 亚洲欧美日产图| 欧美激情久久久| 亚洲一区二区三区精品视频 | 欧美日韩视频在线一区二区观看视频| 欧美无砖砖区免费| 亚洲国产aⅴ天堂久久| 亚洲欧美久久久| 欧美好骚综合网| 亚洲字幕在线观看| 欧美日产一区二区三区在线观看| 国产亚洲一区二区三区在线播放| 亚洲免费观看在线观看| 久久免费视频网| 亚洲伊人色欲综合网| 欧美成熟视频| 精品999网站| 先锋a资源在线看亚洲| 亚洲黄网站黄| 久久免费视频网| 国产亚洲精品福利| 亚洲网站啪啪| 亚洲第一精品在线| 久久国产视频网站| 国产精品色一区二区三区| av成人毛片| 亚洲成色777777女色窝| 久久久免费av| 一区免费视频| 久久色在线观看| 香港成人在线视频| 国产精品日韩二区| 亚洲无亚洲人成网站77777| 亚洲成色777777在线观看影院| 久久高清国产| 亚洲国产精品成人| 久久三级视频| 一区二区三区自拍| 久久亚洲影音av资源网| 亚洲欧美日韩在线观看a三区| 国产精品swag| 午夜国产不卡在线观看视频| 亚洲最新色图| 欧美午夜www高清视频| 亚洲在线成人| 亚洲一级影院| 国产精品一香蕉国产线看观看 | 欧美精品成人在线| 99re6热只有精品免费观看| 亚洲国产mv| 欧美精品导航| 亚洲在线观看|