欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c++ 面向?qū)ο蟮念?lèi)設(shè)計(jì)

 更新時(shí)間:2017年07月23日 16:29:10   投稿:mdxy-dxy  
類(lèi)的設(shè)計(jì)在于用恰到好處的信息來(lái)完整表達(dá)一個(gè)職責(zé)清晰的概念,恰到好處的意思是不多也不少,少了,就概念就不完整;多了,就顯得冗余,累贅,當(dāng)然特例下,允許少許的重復(fù),但是,這里必須要有很好的理由

類(lèi)的設(shè)計(jì)在于用恰到好處的信息來(lái)完整表達(dá)一個(gè)職責(zé)清晰的概念,恰到好處的意思是不多也不少,少了,就概念就不完整;多了,就顯得冗余,累贅,當(dāng)然特例下,允許少許的重復(fù),但是,這里必須要有很好的理由。冗余往往就意味著包含了過(guò)多的信息,概念的表達(dá)不夠精準(zhǔn),好比goto,指針,多繼承這些貨色,就是因?yàn)槠溥^(guò)多的內(nèi)涵,才要嚴(yán)格限制其使用。好像,more effective c++上說(shuō)的,class的成員函數(shù),應(yīng)該是在完整的情況下保持最小化。但是,這里我們的出發(fā)點(diǎn),是成員數(shù)據(jù)的完整最小化。

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

首先是要有清晰的概念以及這個(gè)概念要支持的最基本運(yùn)算,然后在此基礎(chǔ)上組織數(shù)據(jù),務(wù)求成員數(shù)據(jù)的最小化。當(dāng)然,概念的產(chǎn)生,并非拍著腦袋想出來(lái)的,是因?yàn)榇a里面出現(xiàn)太多那種相關(guān)數(shù)據(jù)的次數(shù),所以就有必要把這些數(shù)據(jù)打包起來(lái),抽象成一個(gè)概念。好比說(shuō),看到stl算法函數(shù)參數(shù)到處開(kāi)始結(jié)束的迭代器,就有必要把開(kāi)始結(jié)束放在一起。比如說(shuō),string_view的出現(xiàn),這里假設(shè)其字符存儲(chǔ)類(lèi)型為char,string_view就是連續(xù)char內(nèi)存塊的意思,可以這樣表示

struct string_view
{
     const char* textBegin;
     size_t length; //或者 const char* textEnd
};

這里的重點(diǎn)是,string_view里面的兩個(gè)成員字段缺一不可,但是也不必再添加別的什么其他東西。然后,在這兩個(gè)數(shù)據(jù)上展開(kāi)實(shí)現(xiàn)一系列的成員函數(shù),這里,成員函數(shù)和成員字段這兩者,有一點(diǎn)點(diǎn)雞生蛋生雞的糾結(jié),因?yàn)楸匾蓡T函數(shù)的集合(原始概念的細(xì)化),成員函數(shù)決定了成員字段的表示,而成員字段定下來(lái)之后,這反過(guò)來(lái)又能夠驗(yàn)證成員函數(shù)的必要性。不管怎么說(shuō)都好,成員函數(shù)的設(shè)計(jì),也必須遵從最小完整化的原則。再具體一點(diǎn),就是說(shuō)但凡一個(gè)成員函數(shù)可以通過(guò)其他成員函數(shù)來(lái)實(shí)現(xiàn),就意味著這個(gè)函數(shù)應(yīng)該趕出類(lèi)外,作為全局函數(shù)存在。當(dāng)然,這也不是死板的教條,有些很特殊的函數(shù),也可以是成員函數(shù),因?yàn)槌蓡T函數(shù)的使用,確實(shí)很方便。

可能會(huì)有疑惑,感覺(jué)所有的成員函數(shù)其實(shí)都可以是全局函數(shù)?;蛘哒f(shuō),我們可以對(duì)每一個(gè)成員字段都搞一對(duì)set、get的函數(shù),那么所有的其他成員函數(shù)就可以是全局函數(shù)的形式,很容易就可以遵守最小完整化的原則。當(dāng)然,這是明顯偷懶,拒絕思考的惡劣行為。與其這樣,還不如就開(kāi)放所有的成員字段,那樣子就落入c語(yǔ)言的套路了。所以的法論是,一個(gè)函數(shù),這里假設(shè)是全局函數(shù),如果它的實(shí)現(xiàn)必須要訪問(wèn)到成員字段,不能通過(guò)調(diào)用該類(lèi)的成員函數(shù)(一般不是get,set)來(lái)達(dá)到目的,或者,也可以強(qiáng)行用其他函數(shù)來(lái)完成任務(wù),但是很麻煩,或者要付出時(shí)間空間上的代價(jià),那么就意味著這個(gè)函數(shù)應(yīng)該是該類(lèi)的成員函數(shù)。

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

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

相對(duì)很多語(yǔ)言來(lái)說(shuō),c++就是怪胎就是異數(shù),自有其自身的設(shè)計(jì)哲學(xué),它是多根系的,它不可能也沒(méi)必要搞成單根系,當(dāng)然,我們可以假設(shè)一個(gè)空類(lèi),然后所有的類(lèi)都默認(rèn)繼承自這個(gè)空類(lèi)。c++的所有類(lèi)組成一個(gè)森林,森林里的樹(shù)都長(zhǎng)自大地。但是不管怎么說(shuō)都好,只能允許單繼承,千萬(wàn)不要有多繼承,這是底線,千萬(wàn)千萬(wàn)不能違背(當(dāng)然,奇技淫巧的場(chǎng)合,就不必遵守這個(gè)戒條,多繼承千般不是,但是不可或缺,因?yàn)樗梢酝娉鰜?lái)很多花樣,并且都很實(shí)用很必要)。最起碼,單根系出來(lái)的內(nèi)存布局直觀可預(yù)測(cè),一定程度上跨編譯器,只有良好的內(nèi)存布局,才有望良好的二進(jìn)制復(fù)用。另外,父類(lèi)對(duì)子類(lèi)一無(wú)所知,不要引用到子類(lèi)一丁點(diǎn)的信息,要保持這種信息的單向流動(dòng)性。

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

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

某種意義上講,c++在面向?qū)ο笊咸峁┑恼Z(yǔ)言機(jī)制,就是為了方便地生成各種內(nèi)存布局,以及此內(nèi)存布局上所能支持的操作,虛函數(shù)用以生成一堆成員函數(shù)指針,繼承則用以方便地生成一坨成員字段,……。所以,c++的面向?qū)ο缶褪敲嫦騼?nèi)存布局地設(shè)計(jì),而多繼承、虛繼承、模板這些鬼東西很容易就導(dǎo)致內(nèi)存布局的失控,不過(guò),如果使用得當(dāng),卻又有鬼斧神工之奇效,創(chuàng)造出來(lái)其他語(yǔ)言所沒(méi)有的奇跡。真的,論動(dòng)態(tài)行為藝術(shù),任何語(yǔ)言在c++這個(gè)大人面前都是幼兒園里的小學(xué)生。

為了引出接口,本座花大力氣做科普。這也沒(méi)辦法,因?yàn)轭?lèi)雖然是基礎(chǔ),但是靜態(tài)面向?qū)ο蟮木A,全部都在接口上。只有清晰明確類(lèi)的功能職責(zé),才能理解接口的必要性以及其多樣性。那么,可不可以只有接口,沒(méi)有類(lèi)的。可以,就好像com那樣子,而代價(jià)是,使用起來(lái),各種不方便。這個(gè)世界,從來(lái)就不存在包治百病之萬(wàn)能藥。什么事情都能做的意思就是什么都做不好。

相關(guān)文章

  • Opencv分水嶺算法學(xué)習(xí)

    Opencv分水嶺算法學(xué)習(xí)

    這篇文章主要為大家詳細(xì)介紹了Opencv分水嶺算法的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++符號(hào)優(yōu)先級(jí)(詳細(xì)整理)

    C++符號(hào)優(yōu)先級(jí)(詳細(xì)整理)

    C++符號(hào)優(yōu)先級(jí),我詳細(xì)整理了一下。需要的朋友可以過(guò)來(lái)參考下。希望對(duì)大家有所幫助
    2013-10-10
  • Visual Studio 如何創(chuàng)建C/C++項(xiàng)目問(wèn)題

    Visual Studio 如何創(chuàng)建C/C++項(xiàng)目問(wèn)題

    這篇文章主要介紹了Visual Studio 如何創(chuàng)建C/C++項(xiàng)目問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C語(yǔ)言中#define在多行宏定義出錯(cuò)的原因及分析

    C語(yǔ)言中#define在多行宏定義出錯(cuò)的原因及分析

    這篇文章主要介紹了C語(yǔ)言中#define在多行宏定義出錯(cuò)的原因及分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C語(yǔ)言超細(xì)致講解分支語(yǔ)句

    C語(yǔ)言超細(xì)致講解分支語(yǔ)句

    分支結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語(yǔ)句出現(xiàn)的物理順序。分支結(jié)構(gòu)的程序設(shè)計(jì)方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)姆种дZ(yǔ)句
    2022-05-05
  • C++調(diào)用matlab引擎實(shí)現(xiàn)三維圖的繪制

    C++調(diào)用matlab引擎實(shí)現(xiàn)三維圖的繪制

    這篇文章主要為大家詳細(xì)介紹了C++如何調(diào)用matlab引擎實(shí)現(xiàn)三維圖的繪制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++和Matlab有一定的幫助,需要的可以參考一下
    2022-12-12
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲的示例代碼

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言如何實(shí)現(xiàn)經(jīng)典貪吃蛇游戲,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01
  • 深入解析最長(zhǎng)公共子串

    深入解析最長(zhǎng)公共子串

    本篇文章是對(duì)最長(zhǎng)公共子串進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Matlab繪制雨云圖的方法詳解

    Matlab繪制雨云圖的方法詳解

    這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)雨云圖的繪制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下
    2022-05-05
  • 使用C++遞歸求解跳臺(tái)階問(wèn)題

    使用C++遞歸求解跳臺(tái)階問(wèn)題

    這篇文章主要介紹了使用C++求解跳臺(tái)階問(wèn)題的方法,通過(guò)遞歸算法來(lái)解決,不算難,文中給出了計(jì)算思路,需要的朋友可以參考下
    2016-02-02

最新評(píng)論