문제

이것이 허용 가능한 코딩 관행입니까?

public class MessageFormat {
    private static final Color DEFAULT_COLOR = Color.RED;

    private Color messageColor = DEFAULT_COLOR;

    public MessageFormat(Person person) {
        Color color = person.getPreferredColor();
        messageColor = (color != null) ? color : messageColor; // this line
    }
}

아니면 고전과 함께가는 것이 더 낫습니까 ...

if (color != null) {
    messageColor = color;
}
도움이 되었습니까?

해결책

? 고전적인 예 :

a = sprintf( "There are %i green bottle%s on the wall.", i, (i==1?"":"s") );

이 경우 코드는 약 5 IF/Else 라인으로 분해되면 코드를 읽기 쉽지 않습니다.

나는 일반적으로 전체 운영자 주위에 괄호를 넣어서 읽을 때 정신적으로 단일 값으로 구문 분석합니다.

 messageColor = (color != null ? color : messageColor); 

또 다른 변형입니다

messageColor = color || messageColor;

어떤 언어에서는 색상이 "거짓"으로 평가되지 않는 한 "색상, MessageColor의 값이"색상으로 평가됩니다. 제 생각에는 사람들을 혼동 할 수 있으므로 피해야합니다.

가장 중요한 것은 코드를 읽는 다음 사람이 (당신이라도) 인식 오버 헤드를 최소화하도록 일관성을 유지하는 것입니다.

다른 팁

이 경우 가독성, 이해 용이성 등이 동일합니다 (내 말은, 어서 ...). 나는 첫 번째 예에서 복제와 명백한 자기 과제를 좋아하지 않는다. 그것은 다음과 같은 것으로 번역됩니다.

if (colour != null) {messageColour = colour;}
   else {messageColour = messageColour;};

조금 바보입니다.

나는 보통 한 줄로 두 번째를 쓸 것이지만, 그것은 개별적인 공상의 문제입니다. 코딩 스타일 지침 :

if (colour != null) {messageColour = colour;};

편집하다 (나는 이제 8 년 전보다 더 많은 의견이 있습니다)

모범 사례를 찾고 있기 때문에 :

// Use default visibility by default, especially in examples.
// Public needs a reason.
class MessageFormat {
    static final Color DEFAULT_COLOR = Color.RED;

    // Strongly prefer final fields.
    private final Color messageColor;

    // Protect parameters and variables against abuse by other Java developers
    MessageFormat (final Person person) {
        // Use Optionals; null is a code smell
        final Optional<Color> preferredColor = person.getPreferredColor();
        // Bask in the clarity of the message
        this.messageColor = preferredColor.orElse(DEFAULT_COLOR);
    }
}

Ternary 운영자의 사용은 종종 다른 코딩 표준과 함께 민감한 문제입니다. 사이트의 코딩 표준에 따라 사용되는 것이 가장 좋습니다.

그러나이 특정 상황에서 나는 두 번째 옵션을 확실히 추천 할 것입니다. 더 명확 할뿐만 아니라, 3 원 운영자의 사용은 완전히 불필요합니다. MessageColor를 그 자체로 재 할당 할 필요가 없으므로이 특정 상황에서 3 원 운영자의 유일한 기능은 코드 난독 화입니다.

Ternary 운영자는 C 프로그래머들 사이에서 더 일반적입니다. C에서 제어 구조를 피하면 잘못 될 예측이 없기 때문에 종종 더 나은 파이프를 얻을 수 있습니다. 나는 당신이 Java의 성능 차이를 보게 될지 의심스럽고, if-null-then assign 패턴은 3 배보다 훨씬 일반적입니다. 그러나 기존 코드베이스를 유지하는 경우 일반적으로 기존 코드와 일치하는 것이 가장 좋습니다.

당신이 이것을 많이하고 있다면, 당신은 defaultIfNull, firstNonNull 또는 coalesce 코드를 더 간결하게 만들 수있는 함수. Apache Commons Lang은 다음을 포함합니다 defaultIfNull 기능.

일부 언어에는 a가 포함됩니다 ||= 해당 언어의 값을 불이행하기위한 일반적인 관용구 인 연산자.

나는 당신이 의미하는 바를 더 명확하게 표현하기 때문에 두 번째를 선호합니다. 색상이 널이 아닌 경우에만 변경하고 싶습니다. 첫 번째 방법은 이것을 그렇게 명확하게하지 않습니다.

귀하의 경우, 나는 '클래식'구현을 선호합니다. 왜냐하면 나에게는 이해하기가 더 빠르기 때문에, 당신은 그 사람이 선호하는 경우 새로운 색상 만 사용하고 싶다는 것을 이해하기 때문입니다.

나는 때때로 NPE를 피하고 싶다면 메소드 호출에 사용하지만, 보통 다음 리팩토링 중 하나에서 추악한 코드 조각을 엘레딩합니다.)

제 3의 운영자는 종종 생산 된 코드가 영리하고 컴팩트 한 것처럼 보이기 때문에 남용됩니다.

실제로 그들은 코드를 덜 읽기 쉽고 더 많은 오류가 발생하기 쉽습니다. 가능할 때마다 더 긴 버전을 사용하는 것이 좋습니다.

 if ( <condition> ) {
     <action> ;
 }

3 배의 구문 대신.

나에게는 괜찮아 보인다 (나는 Python의 Ternary Operator를 많이 사용한다). 그러나 이런 종류의 스타일 문제는 일반적으로 매우 주관적이다. 프로젝트에 코딩 스타일 문서가 있으면 확인할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top