-1
、0
、1
、および2
がマジック ナンバー規則の例外であることはわかっています。しかし、フロートの場合も同じかどうか疑問に思っていました。それらの最終変数を初期化する必要がありますか、それともプログラムで直接使用できますか?
クラスでパーセンテージとして使用しています。入力が 0.0 未満または 1.0 より大きい場合、パーセンテージを自動的にゼロに設定します。したがって、(0.0 <= 入力 && 入力 <= 1.0) の場合。
ありがとうございました
-1
、0
、1
、および2
がマジック ナンバー規則の例外であることはわかっています。しかし、フロートの場合も同じかどうか疑問に思っていました。それらの最終変数を初期化する必要がありますか、それともプログラムで直接使用できますか?
クラスでパーセンテージとして使用しています。入力が 0.0 未満または 1.0 より大きい場合、パーセンテージを自動的にゼロに設定します。したがって、(0.0 <= 入力 && 入力 <= 1.0) の場合。
ありがとうございました
これらの数字は、マジック ナンバー ルールの例外ではありません。ドグマのレベルまで単純化されていない場合の常識的なルール (「1 つ」のルールがある限り) は、基本的には「意味が明らかでない文脈で数字を使用しないでください」です。これらの 4 つの数字は、明らかな文脈で非常に一般的に使用されています。これは、これが当てはまる唯一の数字という意味ではありません。たとえば、次のような場合です。
long kilometersToMeters(int km) { return km * 1000L; }
数値に名前を付けることに意味はありません。小さなコンテキストから、それが変換係数であることは明らかです。一方、低レベルのコードでこれを行うと、次のようになります。
sendCommandToDevice(1);
kResetCommand = 1
それは定数かそれに似たものでなければならないので、それはまだ間違っています。
したがって0.0
、 and1.0
を定数に置き換える必要があるかどうかは、コンテキストに完全に依存します。
何かに名前を付けると、アイデンティティが作成されます。定義を考えると
const double Moe = 2.0;
const double Joe = 2.0;
...
double Larry = Moe;
double Harry = Moe;
double Garry = Joe;
Moe と Joe の記号の使用は、Larry と Harry のデフォルト値が、Garry のデフォルト値とは異なる方法で相互に関連していることを示唆しています。特定の定数の名前を定義するかどうかの決定は、その定数の値に依存するのではなく、コード内の複数の場所に偶然ではなく現れるかどうかに依存する必要があります。リセットをトリガーするために特定のバイト値を送信する必要があるリモートデバイスと通信している場合、次のことを検討します。
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 のような値の唯一の「特別な」点は、23 などの他の定数よりもはるかに頻繁に使用されることです。これは、それらが使用されるコンテキスト外でドメイン固有の ID を持たない場合です。最初のパラメーターが追加パラメーターの数を示す必要がある関数を使用している場合 (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);
後者のステートメントは、最初のメソッドに渡された値と 2 番目のメソッドに渡された値との間の関係が、最初のメソッドに渡された値とそのメソッド呼び出しの他の部分との間に存在するよりも強いことを意味します。特に、呼び出しの 1 つを 5 つの引数を渡すように変更する必要がある場合、2 番目のコード サンプルでは、それを可能にするために何を変更する必要があるかが不明確になります。対照的に、前者のサンプルでは、定数「4」を「5」に変更する必要があります。