20200304

@ShiKaiWi

Plan

60min: ClickHouse

Notes

ClickHouse

今天主要进行了主流程的感知,目前知道初始化工作是在 dbms/programs/server/Server.cpp 的 main 方法中启动的,其中所有的 databases 放在了 global_contex 中,目前了解到的层级是:Server->global_context->Databases(IDataBase)->Tables(IStorage)

其中 IDatabase 是是管理 table 的,而 table 是本质上是一个 IStorage,IStorage 管理具体的数据存储,因此明天的主体流程可以把经历集中在 IStorage 上面。

cpp 误区

动态绑定

基类里面调用一个 virtual method,如果 this 指针实际上是一个派生类的话,会动态绑定到派生类的方法上,可以参考下面的例子:

#include <iostream>

class Base {
public:
  virtual void run() {
    init();
    std::cout << "Base::run" << std::endl;
  }
  virtual void init() { std::cout << "Base::init " << std::endl; }
};

class Derived : public Base {
public:
  void run() override {
    std::cout << "Derived::run" << std::endl;
    Base::run();
  }
  void init() override { std::cout << "Derived::init" << std::endl; }
};

int main() {
  Derived d;
  d.run();
  return 1;
}

try catch

此外还看到这样的 try catch block,用于 catch 所有的异常:

try {

}catch(...) {

}

继承模版类

一个模版类如果实例化之后,那么就是一个实例类,那么也就可以用来继承。

More

  • global_context 中设定了一个指针用于指向自己,有什么用处?
  • 动态绑定的逻辑确实是符合逻辑的,但是在这种模式下,是不是 OOP 使用起来会有比较多的误区?(可以参考 Server 和 Application 的关系)。