2013-10-22 2 views
0

나는 -1, 0, 12는 매직 넘버 규칙에 대한 예외 있음을 알고있다. 그러나 나는 그들이 같은 때 수레에 대한 사실인지 궁금 해서요. 최종 변수를 초기화해야합니까 아니면 내 프로그램에서 직접 사용할 수 있습니까?0.0과 1.0은 매직 넘버로 간주됩니까?

나는 수업에서 백분율로 사용하고 있습니다. 입력 값이 0.0보다 작거나 1.0보다 크면 자동으로 백분율을 0으로 설정합니다. 따라서 (0.0 < = 입력 & & 입력 < = 1.0).

은 정말 상황에 따라 당신에게

+1

"보유"하지 않았습니다. 그것은 스타일입니다. –

+0

그러나 앞으로 코드를 관리하는 사람들은 매직 넘버를 상수로 입력 해 주셔서 감사 드리며, 따라서 그들이 의미하는 바를 추측 할 필요가 없습니다. – DVG

+0

상수는 특정 의미 *로 한 번만 사용되며 사용 된 컨텍스트 외부에서는 의미가 없기 때문에 이름을 정의하는 것보다 주석을 포함하는 것이 더 좋습니다. 동일한 숫자 값이 여러 번 사용되었지만 * 다른 * 의미가있는 경우 여러 의미에 동일한 이름을 사용하면 원시 숫자 상수를 사용하는 것보다 나쁩니다. – supercat

답변

2

감사드립니다. 매직 넘버를 피하는 요지는 코드의 가독성을 유지하는 것입니다. 최선의 판단을 사용하거나 우리가 사용할 수 있도록 상황을 제공하십시오.

매직 넘버는 [u]nique values with unexplained meaning or multiple occurrences which could (preferably) be replaced with named constants입니다.

http://en.wikipedia.org/wiki/Magic_number_(programming)

편집 : 변수 이름으로 코드를 작성하는 경우에는 대 단지 숫자가 뜨겁게 논쟁 주제 사용하는 경우. 위의 Wiki 기사 작성자의 견해입니다. 의미가 즉시 명확하지 않고 코드에이 여러 번 나오는 경우 이 명명 된 상수를 사용합니다. 한 번만 발생하면 코드를 주석으로 처리하십시오. 당신이 다른 사람의 (강력 바이어스)의 의견에 관심이 있다면

는, 일반적으로 What is self-documenting code and can it replace well documented code?

+1

수업에서 백분율로 사용하고 있습니다. 입력 값이 0.0보다 작거나 1.0보다 크면 자동으로 백분율을 0으로 설정합니다. 그래서 (0.0 <= input && input <= 1.0). – user2426500

+0

이 경계가 명백한 경우 (예 :'EnforceBounds()','{set;}'접근 자 등의 함수), 변수 이름을 사용하여 문서를 작성하는 대신이 숫자에 경계를 표시하는 _why_ 당신의 코드. – Dan

0

을 읽고, 모든 규칙은 예외가 (이 하나 너무). 이러한 상수에 대해 니모닉 이름을 사용하는 것은 스타일의 문제입니다. 예를 들어

:

int Rows = 2; 
int Cols = 2; 

원시 값의 사용은 오해의 소지가있을 것입니다 꽤 유효한 예입니다.

마법 번호의 의미는 문맥에서 분명해야합니다. 그렇지 않은 경우 - 이름을 지정하십시오.

2

이 숫자는 실제로 마법 수 규칙의 예외는 아닙니다. 교리 수준으로 단순화되지 않은 상식 법칙 ("하나"규칙이있는 한)은 기본적으로 "의미를 분명히하지 않는 문맥에서 숫자를 사용하지 마십시오." 이 네 가지 숫자는 명백한 상황에서 매우 일반적으로 사용됩니다. 그렇다고해서 이것이 적용되는 유일한 숫자는 아닙니다. 내가 가지고있는 경우 :

숫자의 이름을 지정하는 데 실제로는 아무런 의미가 없습니다. 작은 컨텍스트에서 변환 요소라는 것이 분명합니다. 나는 이것이 약간 낮은 수준의 코드에서 할 경우 반면에, : 즉 일정한 kResetCommand = 1하거나 뭔가를해야하기 때문에

sendCommandToDevice(1); 

그것은 여전히 ​​잘못입니다.

따라서 0.01.0이 상수로 완전히 대체되어야하는지 여부는 문맥에 따라 다릅니다.

0

무언가에 이름을 붙이면 신원이 만들어집니다. 정의

const double Moe = 2.0; 
const double Joe = 2.0; 
... 
double Larry = Moe; 
double Harry = Moe; 
double Garry = Joe; 

모에 조를위한 상징의 사용은 래리와 해리의 기본 값은 게리의 기본값은 아니라고 방식으로 서로 관련 제안을 감안할 때. 특정 상수에 대한 이름을 정의할지 여부는 해당 상수의 값에 의존해서는 안되며 코드에서 여러 위치에 동시에 나타나지 않을지 결정해야합니다. 하나의 특정 바이트 값이 리셋을 트리거하도록 보내도록 요구하는 원격 장치와 통신하는 경우, I 고려할 것이다 :

void ResetDevice() 
{ 
    // The 0xF9 command is described in the REMOTE_RESET section of the 
    // Frobnitz 9000 manual 
    transmitByte(0xF9); 
} 
... elsewhere 
myDevice.ResetDevice(); 
... 
otherDevice.ResetDevice(); 

// The 0xF9 command is described in the REMOTE_RESET section of the 
// Frobnitz 9000 manual 
const int FrobnitzResetCode = 0xF9; 
... elsewhere 
myDevice.transmitByte(FrobnitzResetCode); 
... 
otherDevice.transmitByte(FrobnitzResetCode); 

받는 우수한 경우가 많다 것으로 값 0xF9는 Frobnitz 9000 장치 재설정 컨텍스트 외부에서 실제 의미가 없습니다. 외부 코드가 ResetDevice 메서드를 호출하는 것보다 필요한 값 자체를 보내야하는 이유가없는 한 해당 메서드 외부의 코드에 상수는 아무런 가치가 없어야합니다. 하나는 아마도 사용할 수 있지만

void ResetDevice() 
{ 
    // The 0xF9 command is described in the REMOTE_RESET section of the 
    // Frobnitz 9000 manual 
    int FrobnitzResetCode = 0xF9; 
    transmitByte(FrobnitzResetCode); 
} 

등이 있습니다. 좁은 의미의 문맥에 대한 이름을 정의하는 것은별로 중요하지 않습니다.

0과 1 같은 값에 대한 유일한 "특수"는 다른 정수보다 훨씬 자주 사용되는 것입니다. 사용 된 컨텍스트 외부에서 도메인 특정 ID가없는 경우 23. 하나는 첫 번째 매개 변수 (C에서 다소 공통) 추가 매개 변수의 수를 표시해야하는 기능이 말을하는 것이 좋습니다 사용하는 경우 :

output_multiple_strings(4, "Bob", Joe, Larry, "Fred"); // There are 4 arguments 
... 
output_multiple_strings(4, "George", Fred, "James", Lucy); // There are 4 arguments 

보다 #DEFINE의 NUMBER_OF_STRINGS 4 4 개 인수

이 있습니다 //
output_multiple_strings(NUMBER_OF_STRINGS, "Bob", Joe, Larry, "Fred"); 
... 
output_multiple_strings(NUMBER_OF_STRINGS, "George", Fred, "James", Lucy); 

첫 번째 메서드에 전달 된 값과 해당 메서드 호출의 다른 값 사이에 존재하는 것보다 첫 번째 메서드에 전달 된 값과 두 번째 메서드에 전달 된 값 사이의 연결이 더 강력하다는 의미입니다. 무엇보다도 5 개의 인수를 전달하기 위해 호출 중 하나를 변경해야하는 경우 두 번째 코드 샘플에서이를 허용하기 위해 변경해야 할 것이 명확하지 않습니다. 대조적으로, 이전 샘플에서 상수 "4"는 "5"로 변경되어야합니다.