讀《google C++風(fēng)格指南》有感


1. 復(fù)習(xí)內(nèi)容

1.1 匿名命名空間

字面意思:聲明命名空間時忽略名字
編譯器內(nèi)部會為這個命名空間生成一個唯一的名字和using指令

namespce {
    char c;
    int i;
    double d;
 }

所以上面的代碼在編譯器內(nèi)部類似于:

 namespace __UNIQUE_NAME_ {
     char c;
     int i;
     double d;
     }
 using namespace __UNIQUE_NAME_;

它和靜態(tài)變量的相似之處筹陵?
匿名命名空間也具有內(nèi)連接屬性,也就是說名稱的作用域被限制在當(dāng)前文件中贱枣,無法在其他文件使用extern來擴展作用域
它和靜態(tài)變量相比更優(yōu)在哪适袜?
對于多個同一文件的標(biāo)識符函數(shù)只需要用一個匿名空間來聲明欢峰,不需要多次輸入static

1.2 如何引用命名空間
// 方式一
ace::Mutex mutex;
// 方式二
using ace::Mutex;
// 方式三
using namespace ace;
  • 方式一
    只是在必要的時候運用域運算符::來引用指定空間里的標(biāo)識符炊邦。
    適用于:當(dāng)前編譯單元內(nèi)引用ace內(nèi)的標(biāo)識符不多且使用次數(shù)不多
  • 方式二
    只引入ace::Mutex一個標(biāo)識符
    適用于:當(dāng)前編譯單元內(nèi)ace::Mutex使用次數(shù)較多的情況
  • 方式三
    把ace里的全部標(biāo)識符都引入當(dāng)前命名空間中芙粱,此后ace內(nèi)所有的標(biāo)識符對于當(dāng)前空間都是可見的
    適用于:當(dāng)前編譯單元內(nèi)使用ace內(nèi)的標(biāo)識符較多划咐,且不會出現(xiàn)標(biāo)識符沖突的問題

對于上面三種方式的選擇應(yīng)由一到三拴念,因為越往后產(chǎn)生命名沖突的可能越大

1.3 override與final
  • override:指定一個虛函數(shù)覆寫另一個虛函數(shù)
    在成員聲明或定義中,override確保該函數(shù)為虛并且復(fù)寫來自基類的虛函數(shù)褐缠,若不是就會出現(xiàn)編譯錯誤
  • final:指定派生類不能覆寫虛函數(shù)政鼠,或類不能被繼承
    在虛函數(shù)聲明或定義中,final確保函數(shù)為虛且不可被派生類復(fù)寫队魏。
    在類定義中缔俄,final指定此類不能被派生
1.4 訪問者模式
  • 定義:封裝某些作用于某數(shù)據(jù)結(jié)構(gòu)中各元素的操作,它可以在不改變數(shù)據(jù)結(jié)構(gòu)的前提下定義作用于這些元素的新的操作
  • 自己的理解:在衣服店定制了幾套衣服,成衣后我又想對某件衣服進(jìn)行改變俐载,但是已經(jīng)不能改變衣服了蟹略,所以收到衣服后,我只能針對我想改變的那件遏佣,新增加一些小搭配(絲巾等等)
  • 含有角色:
    抽象訪問者 訪問者 抽象元素類 元素類 結(jié)構(gòu)對象
package yanbober.github.io;

import java.util.ArrayList;
import java.util.List;

//Vistor(抽象訪問者)
interface Vistor {
    void visit(ConcreteElementNodeA node);
    void visit(ConcreteElementNodeB node);
}
//ConcreteVisitor(具體訪問者)
class ConcreteVisitorA implements Vistor {
    @Override
    public void visit(ConcreteElementNodeA node) {
        System.out.println(node.operationA());
    }

    @Override
    public void visit(ConcreteElementNodeB node) {
        System.out.println(node.operationB());
    }
}

class ConcreteVisitorB implements Vistor {
    @Override
    public void visit(ConcreteElementNodeA node) {
        System.out.println(node.operationA());
    }

    @Override
    public void visit(ConcreteElementNodeB node) {
        System.out.println(node.operationB());
    }
}
//Element(抽象元素)
abstract class ElementNode {
    public abstract void accept(Vistor vistor);
}
//ConcreteElement(具體元素)
class ConcreteElementNodeA extends ElementNode {
    @Override
    public void accept(Vistor vistor) {
        vistor.visit(this);
    }

    public String operationA() {
        return "ConcreteElementNodeA";
    }
}

class ConcreteElementNodeB extends ElementNode {
    @Override
    public void accept(Vistor vistor) {
        vistor.visit(this);
    }

    public String operationB() {
        return "ConcreteElementNodeB";
    }
}
//ObjectStructure(對象結(jié)構(gòu))
class ObjectStructure {
    private List<ElementNode> nodeList = new ArrayList<>();

    public void action(Vistor vistor) {
        for (ElementNode node : nodeList) {
            node.accept(vistor);
        }
    }

    public void add(ElementNode node) {
        nodeList.add(node);
    }
}
//客戶端
public class Main {
    public static void main(String[] args) {
        ObjectStructure objectStructure = new ObjectStructure();
        objectStructure.add(new ConcreteElementNodeA());
        objectStructure.add(new ConcreteElementNodeB());

        Vistor vistor = new ConcreteVisitorA();
        objectStructure.action(vistor);
    }
}

參考:
設(shè)計模式(行為型)之訪問者模式(Visitor Pattern)
23種設(shè)計模式(9):訪問者模式

1.5 何時捕獲異常

我們只能捕獲我們能夠處理的異常挖炬,能夠恢復(fù)的異常將它捕獲后恢復(fù),像不能恢復(fù)的如状婶,越界等就不要捕獲了意敛。
對使用 C++ 異常處理應(yīng)具有怎樣的態(tài)度?

1.6 可重入函數(shù)
1.7 雜項
  • explicit構(gòu)造函數(shù):指定構(gòu)造函數(shù)或轉(zhuǎn)換函數(shù)為顯式膛虫,即它不能用于隱式轉(zhuǎn)換和復(fù)制初始化
  • 靜態(tài)存儲周期:static用于聲明對象擁有靜態(tài)存儲期
  • POD(Plain Old Data):該類型包括標(biāo)量類型草姻,c/c++的基本類型,用戶自定義的類類型(這里的類必須是無析構(gòu)函數(shù)和構(gòu)造函數(shù)/拷貝構(gòu)造函數(shù)的類稍刀,其實也就相當(dāng)于struct)
  • const_cast:用來移除變量的cv限定符
  • volatile:一般編譯器在訪問變量時撩独,都會對變量進(jìn)行優(yōu)化。也就是不會每一次都去變量的內(nèi)存中讀數(shù)據(jù)账月,編譯器會把變量值存在「寄存器」中综膀,在下一次查詢時直接到此取數(shù)據(jù),這樣訪問速度就大大增加局齿。
    而volatile修飾的變量剧劝,編譯器每一次查詢都會去內(nèi)存中讀取數(shù)據(jù)。它常用于多線程編程抓歼,當(dāng)一個線程改變變量的值的時候讥此,「寄存器」的值可能還未更新,所以必須從內(nèi)存中讀數(shù)據(jù)讀到的才是真實的數(shù)據(jù)谣妻。
  • mutable:常用于不影響類的外部可變狀態(tài)的成員萄喳,該成員在const函數(shù)內(nèi)依舊可被修改
    下面是它在lambda表達(dá)式中的使用:
    雖然看起來修改了x,其實只是修改了x的拷貝
int x{0};
auto f1 = [=]() mutable {x = 42;};  // okay, 創(chuàng)建了一個函數(shù)類型的實例
auto f2 = [=]()         {x = 42;};  // error, 不允許修改按值捕獲的外部變量的值
  • std::function:通用多態(tài)的函數(shù)封裝器拌禾,它的實例可以存儲取胎,復(fù)制及調(diào)用任何可調(diào)用目標(biāo)
// 存儲自由函數(shù)
std::function<void(int)> f_display = print_num;
f_display(-9);
 
// 存儲 lambda
std::function<void()> f_display_42 = [](){ print_num(42); };
f_display_42();
 

2. 代碼風(fēng)格的思考(僅針對客戶端)

2.1 在別人代碼上進(jìn)行迭代
  • 注意不要破壞別人原有的風(fēng)格,對函數(shù)命名/變量命名應(yīng)與前人統(tǒng)一
  • 修改之前應(yīng)該仔細(xì)看看代碼的結(jié)構(gòu)湃窍,不要把本來耦合度很低的代碼改成了耦合度極高的代碼
2.2 自己寫代碼
  • 在做csd時就思考好節(jié)點的構(gòu)造
  • 低耦合
  • 代碼簡潔闻蛀,清楚
  • 命名易于理解,別人在看你代碼時您市,可以通過命名直接明白函數(shù)需要做什么
  • 考慮內(nèi)存觉痛!考慮內(nèi)存!需要做緩存的就做緩存

下面以這個頁面來對代碼做一個梳理:
首先有一個頭部主要是放活動圖片/標(biāo)題等茵休,中部是一個橫向scroll薪棒,上面的btn可以刷新下面的縱向scroll里的節(jié)點信息


  • 首先拿到頁面所需要信息(initData)
  • 根據(jù)信息從上往下在代碼中對頁面進(jìn)行展示(initView)
  • 思考scroll是否需要做緩存手蝎,在這里我只對縱向scroll做了緩存
  • 初始化橫向scroll,注冊回調(diào)事件來刷新縱向scroll(initMiddleScroll,updateMiddleScroll)
  • 定義兩個table:tableItemsSel 和 tableItemsSpare(用于存儲緩存數(shù)據(jù))
  • 封裝縱向scroll的信息俐芯,使用一個table封裝棵介,這里的point用于等會插入緩存table(initScrollData)
local tableItemsSel = {
  { data = data,
    point = nil,
    pos = {x = 0,y = 0}
}
}
  • 初始化縱向scroll,計算節(jié)點位置吧史,更新tableItemsSel.pos(initScroll)
  • 填充縱向scroll

設(shè)定一個值為預(yù)加載范圍邮辽,如果在范圍內(nèi)就讓節(jié)點可見,不在范圍內(nèi)就讓節(jié)點不可見且插入緩存tableItemsSpare

local scrollH = scroll的高度
local tableShowH = {beginY = math.max(0,scroll的y軸偏移-0.5*scrollH),endY = scroll的y軸偏移+1.5*scrollH,}

白色區(qū)域為我們的初始可視區(qū)域贸营,紅色區(qū)域就是我們現(xiàn)在擴大了的可視區(qū)域吨述,超過這個可視區(qū)域,就讓節(jié)點不可見且插入緩存tableItemsSpare


if v.pos.y < tableShowH.beginY or v.pos.y > tableShowH.endY then
                v.point:setVisible(false)
                table.insert(self.tableItemsSpare,v.point)
                v.point = nil
end

如果緩存數(shù)組里有節(jié)點就取出設(shè)為可見钞脂,再初始化它揣云。否則新建節(jié)點


  • 設(shè)置scroll回調(diào)事件去重新填充scroll
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市冰啃,隨后出現(xiàn)的幾起案子邓夕,更是在濱河造成了極大的恐慌,老刑警劉巖亿笤,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翎迁,死亡現(xiàn)場離奇詭異栋猖,居然都是意外死亡净薛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門蒲拉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肃拜,“玉大人,你說我怎么就攤上這事雌团∪剂欤” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵锦援,是天一觀的道長猛蔽。 經(jīng)常有香客問我,道長灵寺,這世上最難降的妖魔是什么曼库? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮略板,結(jié)果婚禮上毁枯,老公的妹妹穿的比我還像新娘。我一直安慰自己叮称,他們只是感情好种玛,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布藐鹤。 她就那樣靜靜地躺著,像睡著了一般赂韵。 火紅的嫁衣襯著肌膚如雪娱节。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天祭示,我揣著相機與錄音括堤,去河邊找鬼。 笑死绍移,一個胖子當(dāng)著我的面吹牛悄窃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蹂窖,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼轧抗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瞬测?” 一聲冷哼從身側(cè)響起横媚,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎月趟,沒想到半個月后灯蝴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡孝宗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年穷躁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片因妇。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡问潭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出婚被,到底是詐尸還是另有隱情狡忙,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布址芯,位于F島的核電站灾茁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谷炸。R本人自食惡果不足惜北专,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淑廊。 院中可真熱鬧逗余,春花似錦、人聲如沸季惩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至啥繁,卻和暖如春菜职,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旗闽。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工酬核, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人适室。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓嫡意,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捣辆。 傳聞我的和親對象是個殘疾皇子蔬螟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容