文有点长
由于跟外国同事共同开发程式互相有code review.
某位同事写的code已经有点超过了, 并且会干预其他人如果不是他那种style写法 会要求
改正
以下是 每一种写法 我标数字 目的是希望大家可以给我一些建议是不是他太超过还是我
还无法体会他的好
1.
auto v = Foo<int>{};
auto v = vector<int>{};
// 永远使用{}, {} 在container上很好读, 但他不管怎样一定是{}, ()已近乎消失
// 永远auto =
// vector<int> v; 臭了吗....
我个人觉得不该滥用 "等号"
我有用一些观点例如
copy cstor被delete情况, 只是因为你现在用c++17才给过, 建议他可以考虑相容c++14
但也是被驳回 说 不需考虑.
int a = 1; 写成 int a{1}就很怪
Foo f{1,2,3}; 会让我以为他提供initializer_list 的建构子
殊不知其实只是想呼叫 Foo(int,int,int)版本的, 这样写真的是被鼓励的吗?
我觉得要变通而不是完全弃用 () 建构
2. 承上
auto ptr = static_cast<Foo*>(nullptr);
就是不肯 Foo*ptr = nullptr;
甚至他写
struct Data
{
auto A = std::string{};
auto B = ENUM::X;
auto C = int{};
auto id = static_cast<add_pointer<GUID>::type>(nullptr);
}
这很夸张
我对于struct肯定是不用auto
甚至我想问各位 struct 每个element都给初始直 这是好的吗?
对我来讲这是使用这struct的人的义务
Data d{....给初始直}
or
d.A =
d.B = 一个一个给
不知道各位喜欢哪种 针对struct
3. 承上
auto p = std::add_pointer<void>::type{XXX};
auto p = std::add_pointer<int>::type{...};
之前他因为不知道std有提供add_pointer, 还刻意写一个traits 为了写出这行
int* p = ....; 竟然不是他脑中的首选....我实在无法理解
4. 承上
auto Foo(..............................................................) ->
void
auto Bar(..............................................................) ->
std::vector<...>
永远都是auto -> type 的写法
甚至
auto main(..) -> void
这trailing return type我一直无法体会好处,除非要deduction不然到底优点是什么?
5.
auto const* p = ....;
基本上这没问题 但是多数人都是const auto* p; 但她却坚持不follow多数
6.
大量使用3rd MACRO,让程式码呈现类似
XXX_RETURN_YY_IF(Method());
LOG_ERROR_IF(!rc);
auto XXX -> noexcept
TRY();
CATCH_RETURN();
THROW_IF(.....);
只要他写的code都是这种长相的....说真的对我来讲好难读...
甚至写一段程式没用到macro 还会担心是不是有macro可套
7. 坚持C++ exception 一定比error code来的好
所以要求团队有error都要用exception, 如果实作上用exception会不好设计的话请提出
来
当成特例来讨论
对于noexcept有没有加非常计较跟坚持
如果设计dll
errorcode dllexport... API()
{
try
{
auto rc = XXX();
if(rc == FAILED) { throw yyyy; 让下面接}
return success;
}
catch(...)
{
return yyy;
}
}
为了用exception....但又不能往dll外丢 竟然自丢自接...无法理解
8.
std::size() std::data() std::begin() std::end()
只要用了
type.size() type.data() type.begin type.end都会被逼着改...
我想说的是 如果写template code当然用std::xxx会更generic....但不是, 都是在非te
mplate情形,用自己member 合情合理(是不是可以减少compile 时间,因为不用产生tem
plate程式码?)
9.
写出
std::chrono::....
会被要求改成namespace chrono = std::chrono
这我有点傻眼 写std::不是明确又更好理解吗?
10.
template<class T>
class Foo
{
void Bar(T&& t){
Baz(std::forward<T>(t));
}
};
坚持说是用forward, 给他很多例子跟gcc vector实作也无法接受...
但因为结果论 是一样的效果,所以我说服失败,反倒是被质疑只写std::move是想少打字
吧?
11.
class Foo
{
std::string s{};
vector<int> v{};
int a{};
Type x{};
};
这边要说的是....{}固然没问题, 但 不加不是更简洁好读?
int a{} 为什么就是不肯 = 0? 甚至 有时候会写 int a{0};
12. 几乎写一般函数都写在header然后冠上inline(一看也觉得不可能inline成功的)
理由说 有文章说让compiler自己决定能不能inline, 程式效能更好(成功算赚到).
class的话也是尽可能实作写header (反正内部的code, 不是要变成shared library)
其实wiki也写了缺点,header only难道在非template library上有也是被鼓励的吗?(
假设code size变大 不重要)
13. 承上
class Foo{ static int a; 坚持不写 一定要写 inline int a;}
他认为的好处是 不用特别找cpp写定义, 更能贯彻header only 的写法
14. 因为会写windows平台的程式
他会把用到的win32 api都wrap一层
例如
raii_handle
CreateThread(...)
{
auto h = ::Creathread(...)
THROW_IF(!h)
return h;
}
之类的 方向是把win32 error code base的api变成exception based....
C++真的exception是被鼓励的吗? 对我来看 B>Z阿...
其实还有很多而且越读他的code会越多奇怪的坚持产生
例如
return std::move(local var)...
刚好vc似乎不会跳warning变成好像很难说服他改掉(我说这多余的,且限制最佳化了,
但被无视)
对方大方向是
大量使用auto , 增加"可读性", 读者or呼叫者不care型态 用auto完全的对他来讲好读
(我完全相反 让我理解力大减 我还要多跳过去定义看型别 去思考是否有问题,
auto XXX(....很长)-> type , 我为了要看type我还要拖曳到右边看.)
对方认定
vector<int> v;是 c style 初始方法 要大家用C++ style
auto v = vector<int>{};写
对方非常爱贴文章
只要你提出相反意见他都可以拿文章来回 要我去看文章(还有所谓的AAA style....)
对方是真的花心思会去follow youtube cppconf的talk....
但共识久了 会觉得对方 真的是教课书说什么就什么 而且似乎查资料只查他认同的
关键字很可能都是下
"exception better than error code c++" 之类的找文章....
我不喜欢这种照本宣科的, 但只要他一贴文章大概就句点了 (又臭又长, 我也不想细看
反正用英文讲不赢)
请各位提供一些意见
当然这些都是被网络上广泛讨论的topic...但这版似乎没特别针对这些来讨论
希望得到大家的回馈,有些也许真的是被鼓励的但我还没学到真谛
谢谢