2009-04-30 3 views
5

다른 사람의 코드를 읽는 동안 많은 플래그를 보았습니다.코드에서 플래그를 자주 사용하는 것이 좋습니다?

if (condition1) 
    var1 = true 
else 
    var1 = false 

if (var1 == true) 
    // do something. 

이렇게 많은 플래그가 있습니다. 내가 알기를 바랍니다, 플래그를 자주 사용하는 것이 좋습니다.

+3

이것은 공포를 나타내는 것처럼 보입니다. 나는 이와 관련하여 찾을 수있는 모든 질문에 이런 종류의 코딩에 대한 불만을 표합니다. if (condition) {return true;} else {return false;} 세상에! –

+0

@ MasterPeter : 사실, 필자는 그것을 "프로그래머의 무지"로 생각하는 애완 동물 오줌 싸개 중 하나라고 생각합니다. http://stackoverflow.com/questions/423823. –

+0

@ 브라이언 : 나는 당신 앞에 있을지도 모른다. http://stackoverflow.com/questions/423823/whats-your-favorite-programmer-ignorance-pet-peeve/424005#424005 –

답변

11

이로 대해 참조 생각합니다.
대신 당신은 작성해야 :

var1 = condition1; 

그리고 네, 플래그는 코드를 읽기 그리고 아마도, 더 빨리 만들기위한 매우 유용합니다.

4

이것은 꽤 주관적이며 나머지 코드에 따라 다릅니다. 당신이 그들을 부르는 "깃발"은 그들의 자리를 차지합니다.

7

condition1이 매우 복잡하고 (예 : if (A && (B || C) && !D)) 많은 오버 헤드가 포함 된 경우 (if (somethingTimeConsumingThatWontChange())) 코드 복사 - 붙여 넣기 대신 결과를 저장하는 것이 좋습니다.

condition1이 단순한 비교 일 뿐이라면 아니오, 플래그를 사용하지 않을 것입니다. 모든

+4

"조건 1이 상당히 복잡하면 - if (A && (B || C) &&! D) "물론, 다음과 같이하면됩니다 : bool var1 = A && (B || C) &&! D, . 또한 'var1'이 플래그 인 경우, (var1 == true)가 아닌 if (var1) – MatrixFrog

2

첫째,이 코드는 다음과 같이 읽어야 플래그의 수에 관해서는

var1 = condition1; 

if(var1) 

// No need to compare *true* to *true* when you're looking for *true* 

을, 코드를 분기의 더 우아한 방법이 있습니다. 예를 들어,이 같은 물건을 할 수있는 자바 스크립트를 사용하는 경우 :

var methodName = someFunctionThatReturnsAString(); 

// assuming you name the method according to what's returned 
myObject[ methodName ](); 

대신

if(someFunctionThatReturnsAString === 'myPreferedMethod'){ 
    myObject.myPreferedMethod(); 
}else{ 
    myObject.theOtherMethod(); 
} 

당신이 강력하게 형식화 된 언어를 사용하는 경우

의 다형성은 당신의 친구입니다.

if (condition1) 
    var1= true; 
else 
    var1 = false; 

고전 잘못 작성된 코드이다 : 나는 기술이 다형성 파견

2

리팩토링 북에서이 Replace Temp var with Query method을 기억합니다. 이 리팩터링은 코드를 좀 더 읽기 쉽게 만들 것이라고 생각하지만 쿼리 메소드가 비싸면 성능에 영향을 미칠 수 있다고 동의합니다. (하지만 쿼리 메소드는 자체 클래스에 넣을 수 있으며 결과는 그 클래스에 캐싱).

2

이것은 약간 일반적인 질문입니다. 대답은 당신이하고 싶은 것과 당신이하고 싶은 언어에 달려 있습니다. OO 컨텍스트를 가정하면보다 나은 접근 방법이 될 수 있습니다.

조건이 "플래그"보다 일부 개체 상태의 결과 일 경우 적절하게 개체 자체의 속성이되어야합니다. 실행중인 응용 프로그램의 조건이고 이러한 것들이 많으면 상태 패턴/상태 시스템에 대해 생각해야 할 수도 있습니다.

1

읽을 수 있고 작업을 수행하면 문제가 없습니다.

var $isNewRecord; 
var $hasUpdated; 

if ($isNewRecord) 
{ 
} 

if ($hasUpdated) 
{ 
} 
0

이것은 조건과 사용 횟수에 따라 다릅니다. 어쨌든, 함수로 리팩토링 (조건이 느릴 경우 결과를 캐싱하는 것이 바람직 함)하면 더 많은 코드를 읽을 수 있습니다.

예를 이것에 대한 고려 : 코딩 스타일에 관해서는

def checkCondition(): 
    import __builtin__ as cached 
    try: 
     return cached.conditionValue 
    except NameError: 
     cached.conditionValue = someSlowFunction() 
     return cached.conditionValue 

:

if (condition1) 
    var1= true 
else 
    var1 = false 

나는 코드의 종류를 싫어. 다시

(== 사실이 var1)

var1 = bool(condition1) 

경우 :

var1 = condition1 

또는 그 결과의 보장하려는 경우 부울이다 : 그것은 하나 간단해야한다 . 잘못된 코딩 스타일. 그것은이다 :

if (var1) 
0

그 코드를 더 판독 가능

var1 = condition1 

로 기록 될 수 있다는 것을 염두에 베어링, 잘 사용하는 경우이 과제가 몇 가지 유용한 속성이 있습니다. 하나의 유스 케이스는 기능으로 그것을 파괴하지 않고 복잡한 계산을 이름을 지정하는 것입니다 : 사람이 자주 노출 된 상태에서 명확하지 않은, 의미하는 조건을 사용하여 무슨 일을 설명 할 수 있습니다

user_is_on_fire = condition_that_holds_when_user_is_on_fire 

.

조건을 평가하는 데 비용이 많이 들거나 (부작용이있는 경우) 조건을 재평가하는 대신 결과를 로컬로 저장하는 것이 바람직 할 수 있습니다.

몇 가지주의 사항 : 잘못 명명 된 플래그는 코드를 읽기 쉽게 만듭니다. 플래그는 사용되는 장소에서 멀리 설정됩니다. 또한, 플래그를 사용하기를 원한다는 사실은 조건을 함수로 분리하는 것을 고려해야한다는 것을 암시하는 코드 냄새입니다.

도박

0

사전 OO 언어로 작업 할 때 플래그를 지정하십시오. 코드의 동작을 매개 변수화하는 데 유용합니다.

곧 코드를 따라 잡기가 어려울 것입니다. 차이점을 추출 할 때 읽기/변경/유지가 더 쉬울 것입니다. 변경 가능한 기능에 대한 참조를 제공합니다.

함수가 일등급 시민 (예 : 자바 스크립트, 하스켈, 리스프, ...) 인 언어에서는 매우 간단합니다.

OO 언어에서는 추상 공장, 전략/정책 등과 같은 디자인 패턴을 구현할 수 있습니다.

개인적으로 코드 냄새로 생각되는 스위치가 너무 많습니다.

2

플래그는 매우 유용합니다. 그들의 이름에 "Is"또는 이와 유사한 것을 사용합니다.

예를 들어

는 비교 :

if(Direction) {/* do something */} 
if(PowerSetting) {/* do something else */} 

로 : 그들은 아무런 코멘트와 함께, 플래그를 호출 될 때

if(DirectionIsUp) {/* do something */} 
if(PowerIsOn)  {/* do something else */} 
0

는 내가 뭘, 플래그에 대한처럼 해달라고하는 것입니다.

예컨대는

void foo(...){ 

    bool flag; 

    //begin some weird looking code 

    if (something) 
     [...] 
     flag = true; 
} 

그들은 코드 redeability에 대해 시도합니다. 그리고 원래 프로그래머가 사라진 후 몇 달/몇 년 동안 그것을 읽어야하는 가난한 사람은 원래 그 목적이 무엇인지 이해하려고 힘들게 노력할 것입니다.

그러나 플래그 변수에 대표 이름이있는 경우 현명하게 사용하는 한 괜찮습니다 (다른 응답 참조).

0

네, 그건 바보 같은 말도 안되는 코드입니다.

당신은 모든 것을 내려 단순화 할 수 있습니다 :

if (condition1) 
{ 
    // do something 
} 
0

가 여기에 내 걸릴입니다. 깃발을 사용하여 코드 :

... 
if (dogIsBarking && smellsBad) { 
    cleanupNeeded = true; 
} 
doOtherStuff(); 
... many lines later 
if (cleanupNeeded) { 
    startCleanup(); 
} 
... 

매우 부정합니다. 프로그래머는 마음이 말하는 순서대로 코드를 작성하기 만하면됩니다. 논리를 리팩토링 수 있습니다, 로버트 마틴 (클린 코드)의 조언에 따라

... 
doOtherStuff(); 
... many lines later 
if (dogIsBarking && smellsBad) { 
    startCleanup(); 
} 
... 

그리고 : 그는 단지 그가 왜 이렇게하지 않았다 ... 정리가 나중에 필요하다는 자신을 생각 나게하는 임의의 장소에 코드를 추가 보다 의미있는 방법으로 :

... 
doSomeStuff(); 
... many lines later 
if (dogTookADump()) { 
    startCleanup(); 
} 
... 
boolean dogTookADump() { 
    return (dogIsBarking && smellsBad); 
} 

그래서, 내가 본 많은 이상과 같은 간단한 규칙을 준수, 아직 사람들이 아무 이유없이 합병증 및 플래그를 계속 추가 할 수있는 코드를 많이! 이제는 플래그가 필요할 수있는 합법적 인 경우가 있지만 대부분의 경우 프로그래머가 과거부터 수행하고있는 스타일 중 하나입니다.

관련 문제