2017-12-20 24 views
2

삼항 조건의 결과에서 방법을 사용하는 것은 나쁜 스타일로 간주됩니까? 의 라인을 따라 뭔가 :삼항 조건의 결과에 대한 방법

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

왜 마지막 두 피연산자가 같은지, 처음에는 삼항 연산자가 필요하지 않습니다. – stackptr

+0

@stackptr 제 잘못, 우연히 같은 것을 다시 작성했습니다. – Davar

+0

조건부의 결과를 변수에 저장할 수도 있습니다. 당신은 'auto'로 타입을 철자조차하지 않아도됩니다. – chris

답변

2

나는 그것이 참으로 나쁜 스타일 말할 것입니다.

이런 식으로 생각해보십시오. 다른 사람의 코드에서이 코드를 보면, 언뜻보기에는 그것이 무엇인지 알 수 없을 것입니다. 리셋() 함수가 처음부터 존재하고, 조건의 두 분기에 영향을 미친다는 것을 깨닫기까지는 시간이 걸릴 것입니다!

디버깅 중에도 사용자에게 불필요한 문제가 발생할 수 있습니다.

삼항 연산자는 단순한 물건에 대해 깔끔하고, 과용 할 수 있지만 코드를 읽기가 어렵게 만들뿐만 아니라 다른 사람을 위해 더 많이 읽을 수 있습니다. 다른 사람의 코드에서 발견하면 이것을 보지 않겠습니까?

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

가능한 한 깨끗하고 명확하게 유지하십시오. 모두 감사합니다!

3

난 강력 또 다른 추천 :

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

간단한 이름을 도입함으로써를, 그것은 무슨 일이 일어나고 있는지 분명하다. 삼항 연산자는 그 자체로 나쁘지는 않지만 간단한 문맥에서만 사용하는 것이 문제입니다.

+0

나는이 솔루션이 정말로 마음에 들지만, 나에 관한 부분은 성능에 대해 걱정하고있다.하지만 그건 아마도 쓸데없는 마이크로 최적화 일 것이다. 내 정보를 위해서, 이것과 같은 새로운 참조 변수가 얼마나 많은 영향을 미칠까요? – Davar

+0

'Node :: left'가 부작용이 있는지 없는지 최적화 도구를 지원합니다. 그렇지 않으면 동일하게 작동합니다. – Caleth

+0

@Davar : 이것은 단지 이름을 지정하고 이름은 성능에 영향을 미치지 않습니다. – MSalters