序:
给算法同学重构了一版代码。原则是边重构边测试,即使看起来有多么简单逻辑,反复测试是必不可少的。
但是没这种测试工具或者日志啥的。想说都重构了,顺便把日志功能也重构的漂亮一些。
那么现在的日志不能满足了吗?是的,满足不了各种测试边界条件。最穷举的办法就是一行代码一行log,但是这样也太显得对代码太不自信了。
所以我构思中的日志,首先是满足算法业务日志的各种边界条件,还有包括我的输入请求参数,我的配置控制参数,中间用户和物品特征参数,最后是输出结果的变化次数。这些简而言之就是我所关心的参数。
然后用最少字符表达最多的信息量,当然想到这里用二维表格,同时少冗余信息,然后关心的东西更汇聚在一起。
假设这些关心的参数表格的列参数。那么我会用行代表算法的各种算子。
请求输入参数和中间特征数据等 | ||||
---|---|---|---|---|
统计数据 | ctr修改次数 | cvr修改次数 | 截断次数 | 备注 |
算子1 | ||||
算子2 |
用std::endl输出行结束符,这是我们都知道的。代表一行的结束和下一行的开始。那么单元格如何区分呢?当然我们使用 “|”代表单元格之间的分隔符。为了让边界更明显,我用两个“||”表示。这当然因人而异,看你喜好用什么符合。这里我定义“|”为小分隔符,“||”为大分割符。
std::ostringstream oss;
oss << std::endl //一行的开始
<< std::left << "||hit statistics||" //std::left后面会解释
<< "(items:" << pItems->size() << "||"
<< "nonZeroCtr:" << countOfNonZeroCtr << "||"
<< "nonZeroCvr:" << countOfNonZeroCvr << "||"
<< "nonZeroCtr&Cvr:" << countOfNonZeroCtrAndCvr << "||";
好了,有个重要的问题是,单元格之间怎么对齐,我要制定一个等宽空间。
std提供了这么一个 std::setw()提供设置固定宽度的输出,同时配套了std::setfill(' ') 设置用什么padding字符填充。
但是这里还不够,单元格提供好了,我们也想好了往里面填充什么,但是我们有个对齐的需求。
比如说我们对文字类的信息偏向于左对齐,数字之类的偏向于做友对齐。
std提供了std::left和std::right,到这里我们可以再写一版代码
oss << ")" << std::endl
<< std::setfill(' ') << std::setw(40) << "operator:"
<< "\t" << std::right << std::setfill(' ') << std::setw(10) << "ctr:"
<< "\t" << std::setfill(' ') << std::setw(10) << "cvr:"
<< "\t" << std::setfill(' ') << std::setw(10) << "truncate:"
<< "\t" << std::left << std::setfill(' ') << std::setw(100) << "note:"
<< "\t" << std::endl;
最后我们再填入每条记录。
然后输出
std::cout << oss.str();
最终效果会类似这样:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。