本原則的建議是把兩個(gè)template中的與參數(shù)無(wú)關(guān)的共同的代碼抽離出來(lái),也就是在泛型中最不具有泛型特性的代碼抽離出來(lái)。因?yàn)橐话銇?lái)講與參數(shù)有關(guān)的代碼具有變性,與參數(shù)無(wú)關(guān)的代碼帶有不變性,而泛型恰恰是變性的體現(xiàn)。如果你不注意這一點(diǎn),可能會(huì)造成代碼膨脹,就是重復(fù)性的代碼太多。
不過(guò)這一點(diǎn)在兩個(gè)具體類中并不成立,因?yàn)榫唧w類中的代碼都已經(jīng)是具體化的了。
作者舉了一個(gè)矩陣的例子來(lái)加以說(shuō)明。作者把那些與可變參數(shù)值無(wú)關(guān)的,具有共性的代碼集中在父類中。然后讓子類進(jìn)行特定的繼承。
在這個(gè)過(guò)程中作者提出了一個(gè)問(wèn)題,即,父類向子類傳遞信息是很正常的,但是如果子類向父類傳遞信息,子類本身會(huì)有很多個(gè),每個(gè)子類中向父類傳遞信息的函數(shù)也有很多個(gè),而且傳遞的往往是重復(fù)的信息。這并不是一個(gè)高效的做法。
另一個(gè)做法是在父類中保留一個(gè)指針指向那些頻繁的,相同的從子類傳遞進(jìn)來(lái)的信息,因?yàn)檫@些信息的高度重復(fù)性,可以用一個(gè)指針指向它是一個(gè)非常高效而明智的選擇。作者說(shuō)這將允許子類決定對(duì)象內(nèi)存的分配方式,作者給出的方式有二。第一,用子類的構(gòu)造函數(shù)來(lái)初始化父類的構(gòu)造函數(shù)參數(shù),它可能導(dǎo)致對(duì)象自身很大。第二,在子類構(gòu)造函數(shù)中只對(duì)父類對(duì)象進(jìn)行初始化,子類對(duì)象的空間分配是動(dòng)態(tài)分配的來(lái)的。這決定了子類對(duì)象不大,并且只有在明確得知需要大小的情況下才分配空間。后者有個(gè)好處,那就是動(dòng)態(tài)分配是根據(jù)具體情況而定不會(huì)造成信息誤傳遞的情況。
不過(guò)這兩種方式各有各的好處。第一種由于大小已經(jīng)是常量,所以它不會(huì)占用運(yùn)行時(shí)間,而只占用編譯期時(shí)間。而第二種可以減小可執(zhí)行文件的大小,它可以降低working set的大小并使指令緩沖區(qū)內(nèi)的引用高度集中化,從而提高程序執(zhí)行速度(說(shuō)實(shí)話這些道理我并不太懂)。
下面作者從對(duì)象大小的角度來(lái)分析兩者的優(yōu)劣。雖然可以把那些與具體參數(shù)無(wú)關(guān)的,共性的代碼放到父類中去,但是因?yàn)楸皇褂玫氖亲宇悓?duì)象,子類繼承自父類,這樣的話,每個(gè)子類對(duì)象的體積也會(huì)變大。你可以修改設(shè)計(jì),但是作者想說(shuō)的是一般來(lái)講設(shè)計(jì)得越精巧設(shè)計(jì)得就越復(fù)雜,而有的時(shí)候我們往往更追求程序的簡(jiǎn)潔,所以這個(gè)時(shí)候一點(diǎn)點(diǎn)代碼重復(fù)反倒不賴。
不僅僅是對(duì)于泛型而言即便是內(nèi)置類型也存在代碼重復(fù)的問(wèn)題,在此作者舉了int和long的例子,因?yàn)樗鼈兊亩M(jìn)制表述是一樣的。此外,還有指針,所有指針的底層表述都是一樣的只不過(guò)表面上的類型不同而已。
本原則略顯復(fù)雜我理解得并不深刻甚至有錯(cuò)誤的存在。
總結(jié)一下作者所說(shuō)的:
1、在template內(nèi)保留與可變泛型參數(shù)有關(guān)的class和function,無(wú)關(guān)的要拿到別的地方去;
2、由可變泛型參數(shù)造成的代碼膨脹可以避免,只要把這些放到函數(shù)中或者類的成員變量當(dāng)中去即可;(這個(gè)我不太懂)
3、因類型參數(shù)造成的代碼膨脹,做法是讓它們共享實(shí)現(xiàn)碼。
原則44:將與參數(shù)無(wú)關(guān)的代碼抽離templates
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 一:java概述:1,JDK:Java Development Kit,java的開(kāi)發(fā)和運(yùn)行環(huán)境,java的開(kāi)發(fā)工...
- 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
- 轉(zhuǎn)自:http://blog.csdn.net/jackfrued/article/details/4492194...
- 說(shuō)起跑步崴腳,也許很多人對(duì)它并沒(méi)有正確的認(rèn)識(shí),這樣就容易耽誤了病情,從而貽誤治療的最佳時(shí)機(jī)。 崴腳后應(yīng)立即熱敷? ...
- 現(xiàn)在的生活無(wú)奈 悲憤 痛苦 突然感覺(jué)可能如果我在堅(jiān)持下去 可能就撐不住了 我累 我困 我想放棄 放棄大學(xué)夢(mèng) 放棄枯...