CUB(C++ Unified Base)
是一個輕量的現(xiàn)代C++
基礎(chǔ)類庫,遵循C++14
基礎(chǔ)語言版本辰狡。提供了內(nèi)存锋叨、時間、文件系統(tǒng)搓译、字符串悲柱、多線程、實現(xiàn)模式等基礎(chǔ)類庫實現(xiàn)些己。
初衷
抽取CUB
的公共抽象豌鸡,其最大的動機就是為了消除重復(fù),避免在各個實現(xiàn)中充斥重復(fù)邏輯段标,最大可能性地抑制程序員“復(fù)制-粘貼”的惡習(xí)涯冠。其次,CUB
實現(xiàn)了標準庫的擴展和補充逼庞,例如包括any, optional, string_view
等蛇更,當你的編譯器還沒有升級到C++17
時,你便最大限度地從中獲益赛糟。
以日志為例派任,我們當然不希望每個人,每個模塊都寫一個打印日志的類庫璧南,否則會制造大量的重復(fù)代碼掌逛。特殊地,日志特性在C++
實現(xiàn)中司倚,常常使用宏定義提供API
給用戶使用豆混,重復(fù)實現(xiàn)極大概率造成宏定義的沖突。
解決這類問題动知,唯一的辦法就是提供易于用戶復(fù)用的類庫皿伺,并最大自由地讓用戶獲取到源代碼,而不是讓他再造一個輪子盒粮,或者“復(fù)制-粘貼”你的代碼鸵鸥。
復(fù)用
程序員復(fù)用代碼,無非存在兩大障礙丹皱。
- 第一妒穴,這個
API
設(shè)計不夠人性化,復(fù)用成本高种呐。 - 第二宰翅,庫依賴太復(fù)雜,無法便捷地獲取源代碼爽室。
第一個問題汁讼,關(guān)乎軟件設(shè)計。實際上阔墩,設(shè)計易于復(fù)用的組件嘿架,都需要遵循良好的設(shè)計原則。例如啸箫,用戶僅依賴于打印日志的幾個宏定義耸彪,而迫使用戶依賴了他不想要的代碼,便違背了接口隔離原則忘苛。再如蝉娜,用戶依賴你的接口唱较,他不是根據(jù)場景特殊性擴展實現(xiàn),他復(fù)制了你的代碼做局部修改召川,便違背了開放封閉原則南缓。也就是說,你要從設(shè)計上約束用戶的行為荧呐,使得他復(fù)制代碼相對于復(fù)用代碼成本更高汉形,才有可能吸引用戶大概率復(fù)用既有代碼。讓優(yōu)秀的程序員用起來感覺更爽倍阐,工作更愉悅概疆,同時也不放棄改造和教育普通程序員,是吧峰搪?
第二個問題岔冀,關(guān)乎依賴管理。感謝Google
的工程師罢艾,他們創(chuàng)造了Bazel
楣颠,使得代碼復(fù)用變得更加便捷。無論你發(fā)布的庫有多大咐蚯,只要用戶依賴的目標足夠小童漩,用戶通過Bazel
便能夠方便地復(fù)用之。另外春锋,Bazel
使用類Python
的語法矫膨,相對于CMake
反人類的語法,Bazel
的可讀性和顏值簡直爆表(當然期奔,你得喜歡Python
的語法)侧馅。此外,Bazel
的可擴展性相當優(yōu)異呐萌,充滿著無限的可能性馁痴。例如,在構(gòu)建工程之前自動生成代碼肺孤,在GPU
上擴展支持編譯CUDA
代碼罗晕,一切都變得極為容易。
源代碼
CUB
的源代碼來自于如下地址赠堵,可以使用Git
克隆整個庫實現(xiàn)小渊,歡迎小伙伴們?yōu)?code>CUB添磚砌瓦。
$ git clone https://github.com/horance-liu/cub.git