【问题标题】:Method on result of ternary condition三元条件结果的方法
【发布时间】:2017-12-20 02:31:01
【问题描述】:

在三元条件的结果中使用方法是否被认为是不好的风格? 大致如下:

(node->parent()->left() == node ? node->parent()->left()
                                : node->parent()->right()).reset();

我知道代码风格可能是主观的,但我仍然希望我能得到一些建议,比如使用它,或者写一些类似的东西:

if (node–>parent()–>left() == node) {
    node->parent()->left().reset()
} else {
    node–>parent()->right().reset()
}

(来自评论)怎么样:

auto& childUnq = node->parent()->left() == node ? node->parent()->left()
                                                : node->parent()->right();
childUnq.reset();

【问题讨论】:

  • 为什么最后两个操作数相等,首先不需要三元运算符
  • @stackptr 我的错,我不小心又在那里写了同样的一个。
  • 您还可以将条件的结果存储到变量中。您甚至不必用auto 拼出类型。

标签: c++ ternary-operator


【解决方案1】:

我强烈推荐另一种选择:

auto& left = node->parent()->left();
auto& right = node->parent()->right();
auto& pick = (left==node) ? left : right;
pick.reset();

通过引入简单的名称,很清楚正在发生什么。三元运算符本身并不坏,但挑战在于仅在简单的上下文中使用它。

【讨论】:

  • 我真的很喜欢这个解决方案,但我的一部分担心性能 - 但这可能只是无用的微优化,对吧?仅供参考,创建这样的新引用变量会有多大影响?
  • 它将帮助优化器,允许它不关心Node::left 是否有副作用,否则性能相同
  • @Davar:这只是分配名称,名称对性能没有影响。
【解决方案2】:

我会说这确实是一种糟糕的风格。

这样想,如果你在别人的代码中找到它,你可能第一眼就无法分辨它是做什么的。你肯定需要一些时间才能意识到 reset() 函数首先存在,并且它会影响条件的两个分支!

即使对你来说,它也可能在调试时给你带来一些不必要的问题。

虽然三元运算符可以很好地处理简单的东西,但过度使用它会使你的代码非常难以阅读,不仅对你来说,对其他人来说更是如此。 如果您在其他人的代码中发现它,您会不想看到它吗?

if(node->parent()->left() == node){
    node->parent_->left_.reset();
} else {
    node->parent_->right_.reset();
}

所以请保持它尽可能干净和清晰!每个人都会感谢你!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2016-09-24
    • 2019-10-07
    相关资源
    最近更新 更多