다른 사람의 코드를 읽는 동안 많은 플래그를 보았습니다.코드에서 플래그를 자주 사용하는 것이 좋습니다?
if (condition1)
var1 = true
else
var1 = false
if (var1 == true)
// do something.
이렇게 많은 플래그가 있습니다. 내가 알기를 바랍니다, 플래그를 자주 사용하는 것이 좋습니다.
다른 사람의 코드를 읽는 동안 많은 플래그를 보았습니다.코드에서 플래그를 자주 사용하는 것이 좋습니다?
if (condition1)
var1 = true
else
var1 = false
if (var1 == true)
// do something.
이렇게 많은 플래그가 있습니다. 내가 알기를 바랍니다, 플래그를 자주 사용하는 것이 좋습니다.
이로 대해 참조 생각합니다.
대신 당신은 작성해야 :
var1 = condition1;
그리고 네, 플래그는 코드를 읽기 그리고 아마도, 더 빨리 만들기위한 매우 유용합니다.
이것은 꽤 주관적이며 나머지 코드에 따라 다릅니다. 당신이 그들을 부르는 "깃발"은 그들의 자리를 차지합니다.
condition1
이 매우 복잡하고 (예 : if (A && (B || C) && !D)
) 많은 오버 헤드가 포함 된 경우 (if (somethingTimeConsumingThatWontChange())
) 코드 복사 - 붙여 넣기 대신 결과를 저장하는 것이 좋습니다.
condition1
이 단순한 비교 일 뿐이라면 아니오, 플래그를 사용하지 않을 것입니다. 모든
"조건 1이 상당히 복잡하면 - if (A && (B || C) &&! D) "물론, 다음과 같이하면됩니다 : bool var1 = A && (B || C) &&! D, . 또한 'var1'이 플래그 인 경우, (var1 == true)가 아닌 if (var1) – MatrixFrog
첫째,이 코드는 다음과 같이 읽어야 플래그의 수에 관해서는
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;
고전 잘못 작성된 코드이다 : 나는 기술이 다형성 파견
리팩토링 북에서이 Replace Temp var with Query method을 기억합니다. 이 리팩터링은 코드를 좀 더 읽기 쉽게 만들 것이라고 생각하지만 쿼리 메소드가 비싸면 성능에 영향을 미칠 수 있다고 동의합니다. (하지만 쿼리 메소드는 자체 클래스에 넣을 수 있으며 결과는 그 클래스에 캐싱).
이것은 약간 일반적인 질문입니다. 대답은 당신이하고 싶은 것과 당신이하고 싶은 언어에 달려 있습니다. OO 컨텍스트를 가정하면보다 나은 접근 방법이 될 수 있습니다.
조건이 "플래그"보다 일부 개체 상태의 결과 일 경우 적절하게 개체 자체의 속성이되어야합니다. 실행중인 응용 프로그램의 조건이고 이러한 것들이 많으면 상태 패턴/상태 시스템에 대해 생각해야 할 수도 있습니다.
읽을 수 있고 작업을 수행하면 문제가 없습니다.
var $isNewRecord;
var $hasUpdated;
if ($isNewRecord)
{
}
if ($hasUpdated)
{
}
이것은 조건과 사용 횟수에 따라 다릅니다. 어쨌든, 함수로 리팩토링 (조건이 느릴 경우 결과를 캐싱하는 것이 바람직 함)하면 더 많은 코드를 읽을 수 있습니다.
예를 이것에 대한 고려 : 코딩 스타일에 관해서는
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)
그 코드를 더 판독 가능
var1 = condition1
로 기록 될 수 있다는 것을 염두에 베어링, 잘 사용하는 경우이 과제가 몇 가지 유용한 속성이 있습니다. 하나의 유스 케이스는 기능으로 그것을 파괴하지 않고 복잡한 계산을 이름을 지정하는 것입니다 : 사람이 자주 노출 된 상태에서 명확하지 않은, 의미하는 조건을 사용하여 무슨 일을 설명 할 수 있습니다
user_is_on_fire = condition_that_holds_when_user_is_on_fire
.
조건을 평가하는 데 비용이 많이 들거나 (부작용이있는 경우) 조건을 재평가하는 대신 결과를 로컬로 저장하는 것이 바람직 할 수 있습니다.
몇 가지주의 사항 : 잘못 명명 된 플래그는 코드를 읽기 쉽게 만듭니다. 플래그는 사용되는 장소에서 멀리 설정됩니다. 또한, 플래그를 사용하기를 원한다는 사실은 조건을 함수로 분리하는 것을 고려해야한다는 것을 암시하는 코드 냄새입니다.
도박
사전 OO 언어로 작업 할 때 플래그를 지정하십시오. 코드의 동작을 매개 변수화하는 데 유용합니다.
곧 코드를 따라 잡기가 어려울 것입니다. 차이점을 추출 할 때 읽기/변경/유지가 더 쉬울 것입니다. 변경 가능한 기능에 대한 참조를 제공합니다.
함수가 일등급 시민 (예 : 자바 스크립트, 하스켈, 리스프, ...) 인 언어에서는 매우 간단합니다.
OO 언어에서는 추상 공장, 전략/정책 등과 같은 디자인 패턴을 구현할 수 있습니다.
개인적으로 코드 냄새로 생각되는 스위치가 너무 많습니다.
플래그는 매우 유용합니다. 그들의 이름에 "Is"또는 이와 유사한 것을 사용합니다.
예를 들어는 비교 :
if(Direction) {/* do something */}
if(PowerSetting) {/* do something else */}
로 : 그들은 아무런 코멘트와 함께, 플래그를 호출 될 때
if(DirectionIsUp) {/* do something */}
if(PowerIsOn) {/* do something else */}
는 내가 뭘, 플래그에 대한처럼 해달라고하는 것입니다.
예컨대는
void foo(...){
bool flag;
//begin some weird looking code
if (something)
[...]
flag = true;
}
그들은 코드 redeability에 대해 시도합니다. 그리고 원래 프로그래머가 사라진 후 몇 달/몇 년 동안 그것을 읽어야하는 가난한 사람은 원래 그 목적이 무엇인지 이해하려고 힘들게 노력할 것입니다.
그러나 플래그 변수에 대표 이름이있는 경우 현명하게 사용하는 한 괜찮습니다 (다른 응답 참조).
네, 그건 바보 같은 말도 안되는 코드입니다.
당신은 모든 것을 내려 단순화 할 수 있습니다 :
if (condition1)
{
// do something
}
가 여기에 내 걸릴입니다. 깃발을 사용하여 코드 :
...
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);
}
그래서, 내가 본 많은 이상과 같은 간단한 규칙을 준수, 아직 사람들이 아무 이유없이 합병증 및 플래그를 계속 추가 할 수있는 코드를 많이! 이제는 플래그가 필요할 수있는 합법적 인 경우가 있지만 대부분의 경우 프로그래머가 과거부터 수행하고있는 스타일 중 하나입니다.
이것은 공포를 나타내는 것처럼 보입니다. 나는 이와 관련하여 찾을 수있는 모든 질문에 이런 종류의 코딩에 대한 불만을 표합니다. if (condition) {return true;} else {return false;} 세상에! –
@ MasterPeter : 사실, 필자는 그것을 "프로그래머의 무지"로 생각하는 애완 동물 오줌 싸개 중 하나라고 생각합니다. http://stackoverflow.com/questions/423823. –
@ 브라이언 : 나는 당신 앞에 있을지도 모른다. http://stackoverflow.com/questions/423823/whats-your-favorite-programmer-ignorance-pet-peeve/424005#424005 –