CUB(C++ Unified Base)
是一個(gè)輕量的現(xiàn)代C++
基礎(chǔ)類庫(kù),遵循C++14
基礎(chǔ)語(yǔ)言版本。提供了內(nèi)存、時(shí)間、文件系統(tǒng)、字符串、多線程、實(shí)現(xiàn)模式等基礎(chǔ)類庫(kù)實(shí)現(xiàn)。
初衷
抽取CUB
的公共抽象,其最大的動(dòng)機(jī)就是為了消除重復(fù),避免在各個(gè)實(shí)現(xiàn)中充斥重復(fù)邏輯,最大可能性地抑制程序員“復(fù)制-粘貼”的惡習(xí)。其次,CUB
實(shí)現(xiàn)了標(biāo)準(zhǔn)庫(kù)的擴(kuò)展和補(bǔ)充,例如包括any, optional, string_view
等,當(dāng)你的編譯器還沒(méi)有升級(jí)到C++17
時(shí),你便最大限度地從中獲益。
以日志為例,我們當(dāng)然不希望每個(gè)人,每個(gè)模塊都寫一個(gè)打印日志的類庫(kù),否則會(huì)制造大量的重復(fù)代碼。特殊地,日志特性在C++
實(shí)現(xiàn)中,常常使用宏定義提供API
給用戶使用,重復(fù)實(shí)現(xiàn)極大概率造成宏定義的沖突。
解決這類問(wèn)題,唯一的辦法就是提供易于用戶復(fù)用的類庫(kù),并最大自由地讓用戶獲取到源代碼,而不是讓他再造一個(gè)輪子,或者“復(fù)制-粘貼”你的代碼。
復(fù)用
程序員復(fù)用代碼,無(wú)非存在兩大障礙。
- 第一,這個(gè)
API
設(shè)計(jì)不夠人性化,復(fù)用成本高。 - 第二,庫(kù)依賴太復(fù)雜,無(wú)法便捷地獲取源代碼。
第一個(gè)問(wèn)題,關(guān)乎軟件設(shè)計(jì)。實(shí)際上,設(shè)計(jì)易于復(fù)用的組件,都需要遵循良好的設(shè)計(jì)原則。例如,用戶僅依賴于打印日志的幾個(gè)宏定義,而迫使用戶依賴了他不想要的代碼,便違背了接口隔離原則。再如,用戶依賴你的接口,他不是根據(jù)場(chǎng)景特殊性擴(kuò)展實(shí)現(xiàn),他復(fù)制了你的代碼做局部修改,便違背了開(kāi)放封閉原則。也就是說(shuō),你要從設(shè)計(jì)上約束用戶的行為,使得他復(fù)制代碼相對(duì)于復(fù)用代碼成本更高,才有可能吸引用戶大概率復(fù)用既有代碼。讓優(yōu)秀的程序員用起來(lái)感覺(jué)更爽,工作更愉悅,同時(shí)也不放棄改造和教育普通程序員,是吧?
第二個(gè)問(wèn)題,關(guān)乎依賴管理。感謝Google
的工程師,他們創(chuàng)造了Bazel
,使得代碼復(fù)用變得更加便捷。無(wú)論你發(fā)布的庫(kù)有多大,只要用戶依賴的目標(biāo)足夠小,用戶通過(guò)Bazel
便能夠方便地復(fù)用之。另外,Bazel
使用類Python
的語(yǔ)法,相對(duì)于CMake
反人類的語(yǔ)法,Bazel
的可讀性和顏值簡(jiǎn)直爆表(當(dāng)然,你得喜歡Python
的語(yǔ)法)。此外,Bazel
的可擴(kuò)展性相當(dāng)優(yōu)異,充滿著無(wú)限的可能性。例如,在構(gòu)建工程之前自動(dòng)生成代碼,在GPU
上擴(kuò)展支持編譯CUDA
代碼,一切都變得極為容易。
源代碼
CUB
的源代碼來(lái)自于如下地址,可以使用Git
克隆整個(gè)庫(kù)實(shí)現(xiàn),歡迎小伙伴們?yōu)?code>CUB添磚砌瓦。
$ git clone https://github.com/horance-liu/cub.git