c# - 효율 - 자바스크립트 삼항연산자 중첩




이것은 삼항 연산자의 합리적인 사용인가? (11)

나는 당신이 적절한 if 구조를 할 때 더 잘 봉사 할 것이라고 생각합니다. 나는 심지어 조건부 실행에 나중에 라인을 추가해야하는 경우에 항상 if 구조체로 중괄호를 사용하는 것을 선호합니다.

if (inVar != 0) {
    v.push_back(inVar);
}

코드에서 비롯된 이해 / 유지 관리 문제가 있습니까?

inVar1 == 0 ? NULL : v.push_back(inVar1);
inVar2 == 0 ? NULL : v.push_back(inVar2);

기타 등등.

혼란을 줄 수있는 생각은 일반적인 설명 인 변수 할당보다는 프로그램 흐름에 삼항 연산자를 사용하는 것입니다.

나는이 사용법을 다루는 작업 표준을 코딩하는 것을 보지 못했다. 그래서 나는 이것을 편안하게하는 동안 좋은 이유가 없는지 알아 내고 싶다.


나는 때때로 삼자가 생성자를위한 초기화리스트에서 필요한 악이라고 생각한다. 나는 주로 메모리를 할당하고 생성자의 본문 앞에 포인터를 가리 키도록 설정하려는 생성자에 주로 사용합니다.

예를 들어, 벡터를 입력으로 받아들이고 싶지만 내부 표현이 배열 인 정수 저장소 클래스가 있다고 가정 해보십시오.

class foo
{
public:
    foo(std::vector<int> input);
private:
    int* array;
    unsigned int size;
};

foo:foo(std::vector<int> input):size(input.size()), array( (input.size()==0)?
        NULL : new int[input.size])
{
    //code to copy elements and do other start up goes here
}

이것이 삼항 연산자를 사용하는 방법입니다. 나는 사람들이하는 것처럼 혼란스럽지 않다고 생각하지만, 얼마나 많이 사용하는지 제한해야한다고 생각합니다.


만약 당신이 한 가지 또는 두 가지 주장 모두에 여러 가지 메소드 호출을했다면, 그것은 잘못되었다. 어떤 문장이 짧고 간단해야하며, 이상적으로는 복합적이지 않아야한다.


삼항 연산자는 값을 반환합니다.

IMO, 상태를 변경해서는 안되며 반환 값을 사용해야합니다.

다른 경우에는 if 문을 사용하십시오. if 문은 코드 블록을 실행하기위한 것입니다.


실제로이 유형의 글쓰기를 방해하는 사람들의 감정에 동의하는 반면 (독서의 경우, 부작용에 대한 표현을 검사하기 위해 추가 작업을해야 함) 제공하고 싶습니다.

!inVar1 ?: v.push_back(inVar1);
!inVar2 ?: v.push_back(inVar2);

... 당신이 애매한 것을 찾으러 간다면. GCC는 x ?: y 대신 x ?: y 를 허용합니다 x ? x : y x ? x : y . :-)


적절한 if 문은 다른 사람들이 언급 한 것처럼 더 읽기 쉽습니다. 또한 디버거를 사용하여 코드를 단계별로 실행할 때 모든 것이 한 행에 있거나 세 가지 표현식을 사용하는 경우 if의 분기를 쉽게 볼 수 없습니다.

if (cond) doIt();

cond ? noop() : doIt();

반면 다음을 수행하는 것이 훨씬 낫습니다 (중괄호를 가지고 있든 없든).

if (cond) {
    doIt();
}

주석에 언급 된 바와 같이, 이것은 C ++가 유효하지 않습니다 . 예를 들어, GCC는이 코드에서 오류를 발생시킵니다.

error: `(&v)->std::vector<_Tp, _Alloc>::push_back [with _Tp = int, _Alloc =
std::allocator<int>](((const int&)((const int*)(&inVar1))))' has type `void' 
and is not a throw-expression

그러나 캐스팅을 통해 해결할 수 있습니다.

inVar1 == 0 ? (void)0 : v.push_back(inVar1);
inVar2 == 0 ? (void)0 : v.push_back(inVar2);

그러나 비용은 얼마입니까? 그리고 무슨 목적으로?

여기에 삼항 연산자를 사용하는 것이이 상황에서 if 문보다 더 간결한 것은 아닙니다.

inVar1 == 0 ? NULL : v.push_back(inVar1);
if(inVar1 != 0) v.push_back(inVar1);

컴파일러는 요즘에는 삼항 연산자만큼 빠릅니다.

당신은 다른 소프트웨어 개발자가 읽기가 얼마나 쉬운지를 목표로 삼아야합니다.

나는에 찬성한다.

if ( inVar != 0 )
{
   v.push_back( inVar );
}

왜 괄호 ... 왜 언젠가 당신은 거기에 다른 것을 넣을 수 있기 때문에 괄호는 당신을 위해 미리 수행됩니다. 대부분의 편집자는 요즘 어쨌든 그들을 넣을 것입니다.


언급했듯이, 1 라인 if 문보다 짧거나 명확하지 않습니다. 그러나, 그것은 또한 더 이상 존재하지 않습니다. 삼항 연산자를 알고 있다면, 무슨 일이 일어나고 있는지 꽤 분명합니다.

결국, 변수에 할당 된 경우 아무도 문제가 없을 것이라고 생각합니다 (상태가 변경되는 경우에도 마찬가지입니다).

var2 = inVar1 == 0 ? NULL : v.push_back(inVar1);

삼항 연산자가 항상 IMO 값을 반환한다는 사실은 부적절합니다. 확실히 모든 반환 값을 사용할 필요는 없습니다 ... 결국 할당 값을 반환합니다.

그 말은, 내가 NULL 분기를 가로 질렀다면 그것을 if 문으로 대체 할 것이다.

그러나 3 행 if 문을 바꾼 경우 다음과 같습니다.

if (inVar == 0) {
   v.doThingOne(1);
} else {
   v.doThingTwo(2);
}

와:

invar1 == 0 ? v.doThingOne(1) : v.doThingTwo(2);

내 기분에 따라 ...두고 갈 수도 있습니다 . ;)


나는 타이핑하는 것보다 혼란스럽고 읽을 것이 훨씬 어렵다고 생각한다.

if (inVar != 0)
  v.push_back(inVar);

그 결과가 어떤 확실성을 지니고 있는지 알아 내기 위해 여러 번 당신의 예를 살펴보아야했습니다. 나는 당신의 예제보다 한 줄 if () {} 문장을 선호 할 것이고, 한 줄 if 문장을 싫어한다.


삼항 연산자를 사용하면 아무 것도 얻을 수 없으며 코드 가독성이 떨어집니다.

삼항 연산자는 사용하지 않는 값을 반환하기 때문에 홀수 코드입니다. 당신의 경우에는 if 사용하는 것이 훨씬 더 명확합니다.





ternary