工程实践
- 使用C++17,内存管理上以RAII为规范。
- 引入Expect Monad简化返回值错误处理。
- 基于C++的asio异步模块设计网络模块与线程池模块。
- 使用CMake构建工程
- 使用了asio/rocksdb/gtest/glog三方库
单元测试
- 使用
gtest
作为单元测试框架 - 模块化开发,各个模块都支持单元测试。例如
lock
/record
/rocks_kvstore
/network
等模块,都有对应的单元模块测试
集成测试
- tclsh,使用
Tendis存储版
替换原生redis,复用redis的测试用例 - go集成测试,基于go代码,测试集群、备份恢复、复制、故障处理等复杂场景。
代码规范
Google C++ Style Guide
Tendis
遵循Google C++ Style Guide 规范,使用cpplint
工具。
提交时保证cpplint执行通过。例如,可将如下脚本放到.git/hooks/pre-commit
中:
files=`git diff --name-only HEAD HEAD~1`
echo "$files" | while read file
do
if [[ $file =~ \.cc$ || $file =~ \.h$ || $file =~ \.hpp$ || $file =~ \.cpp$ ]]; then
if [[ -f $file ]]; then
if [[ $file =~ optional\.h$ ]]; then
continue
else
echo "cpplint --filter=\"-runtime/reference\" $file"
cpplint --filter="-runtime/reference" $file
if [[ $? -ne 0 ]]; then
echo "Run cpplint against $file failed..."
exit 1
fi
fi
fi
fi
done
格式化工具
格式化依赖clang-format
工具。具体格式看文件.clang-format