关于三元条件结果的方法

时间:2017-12-20 02:31:02

标签: c++ ternary-operator

在三元条件的结果中使用方法被认为是坏的风格吗? 有点像:

(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();

2 个答案:

答案 0 :(得分:3)

我强烈推荐另一种选择:

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

通过引入简单的名称,可以清楚地知道发生了什么。三元运算符本身并不坏,但挑战是仅在简单的上下文中使用它。

答案 1 :(得分:2)

我会说这确实是不好的风格。

以这种方式思考,如果你在其他人的代码中发现它,你可能无法一眼就知道它的作用。你肯定需要一些时间才能意识到reset()函数首先存在,并且它会影响条件的两个分支!

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

虽然三元运算符可以很简单,过度使用它可以使你的代码非常难以阅读,不仅对你而且对其他人来说更多。 如果你在别人的代码中找到它,你不想看到这个吗?

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

所以请尽量保持清洁和清洁!每个人都会感谢你!