2

私はこのような機能を持っています:

float_as_thousands_str_with_precision(value, precision)

私がこのようにそれを使うならば:

float_as_thousands_str_with_precision(volts, 1)
float_as_thousands_str_with_precision(amps, 2)
float_as_thousands_str_with_precision(watts, 2)

それらの1/2のマジックナンバーはありますか?

4

3 に答える 3

6

はい、それらは魔法の数字です。数値 1 と 2 がコード サンプルの精度を指定していることは明らかですが、その理由はわかりません。その時点で、ボルトよりも正確であるためにアンペアとワットが必要なのはなぜですか?

また、マジック ナンバーを回避することで、精度を変更する必要があるリテラルの数値 2 の場合にコードを精査するのではなく、コードの変更を一元化できます。

私は次のようなものを提案します:

HIGH_PRECISION = 3;
MED_PRECISION = 2;
LOW_PRECISION = 1;

クライアントコードは次のようになります。

float_as_thousands_str_with_precision(volts, LOW_PRECISION )
float_as_thousands_str_with_precision(amps, MED_PRECISION )
float_as_thousands_str_with_precision(watts, MED_PRECISION )

次に、将来、次のようなことをするとします。

HIGH_PRECISION = 6;
MED_PRECISION = 4;
LOW_PRECISION = 2;

定数を変更するだけです...

しかし、OPタイトルの質問に答えようとすると:

IMO 本当に使用でき、「魔法」と見なされない唯一の数値は、反復で使用され、長さとサイズ、および多くの数学演算をテストする場合、-1、0、および 1 です。定数を使用すると実際にコードが難読化される例:

for (int i=0; i<someCollection.Length; i++) {...}

if (someCollection.Length == 0) {...}

if (someCollection.Length < 1) {...}

int MyRidiculousSignReversalFunction(int i) {return i * -1;}

これらはすべて非常に明白な例です。たとえば、最初の要素を開始して 1 ずつインクリメントし、コレクションが空であるかどうかをテストし、反転に署名します...ばかげていますが、例としては機能します。-1、0、1 の値をすべて 2 に置き換えます。

for (int i=2; i<50; i+=2) {...}

if (someCollection.Length == 2) {...}

if (someCollection.Length < 2) {...}

int MyRidiculousDoublinglFunction(int i) {return i * 2;}

ここで、自問し始めます: なぜ 3 番目の要素から反復を開始し、他のすべての要素をチェックしているのですか? 50という数字の何がそんなに特別なのですか?2 つの要素を持つコレクションの何が特別なのですか? ダブラーの例はここでは実際に理にかなっていますが、2 と 50 の非 -1、0、1 の値がすぐに魔法になることがわかります。なぜなら、彼らがしていることには明らかに特別な何かがあり、その理由がわからないからです。

于 2012-04-24T19:38:01.673 に答える
1

いいえ、そうではありません。

そのコンテキストでのマジック ナンバーとは、説明のつかない意味を持つ数字です。あなたの場合、それは明確に見える精度を指定します。

マジック ナンバーは次のようなものです。

int calculateFoo(int input)
{
  return 0x3557 * input;
}

「マジックナンバー」という言葉には複数の意味があることに注意してください。この場合、ソース コードで数値を指定しますが、それは周囲では説明できません。このフレーズが使用される他のケースもあります。たとえば、ファイル ヘッダーで、特定のタイプのファイルとして識別されます。

于 2012-04-24T19:31:27.513 に答える
0

次の場合、リテラル数字はマジック ナンバーではありません。

  • コンテキストに基づく非常に明確な目的を持って、1 か所で 1 回だけ使用されます。
  • それは非常に一般的な頻度で、限られたコンテキスト内で使用され、魔法ではないと広く受け入れられています (たとえば、ループ内の +1 または -1 は、人々が魔法ではないと頻繁に受け入れています)。
  • ゼロ オフセットの +1 を魔法ではないと受け入れる人もいます。私はしません。変数 + 1 が表示された場合でも、その理由を知りたいのですが、ZERO_OFFSET を間違えることはありません。

シナリオの例については、次のとおりです。

float_as_thousands_str_with_precision(ボルト、1)

そして提案された

float_as_thousands_str_with_precision(ボルト, HIGH_PRECISION)

1 のボルトの関数が同じ目的で繰り返し使用される場合、1 は魔法です。確かに、それは「魔法」ですが、意味が不明確だからではなく、単に複数回出現しているからです.

ポールの答えは、HIGH_PRECISION = 3 が目的を説明したと考えている「説明されていない意味」の部分に焦点を当てていました。IMO、HIGH_PRECISION は、PRECISION_THREE または THREE または 3 のようなもの以上の説明や価値を提供しません。もちろん、3 は 1 よりも高いですが、なぜより高い精度が必要なのか、またはなぜ精度に違いがあるのか​​ を説明していません。数字は、提案されたラベルと同じくらい意図的で明確です。

そもそも精度を変える必要があるのはなぜですか?エンジニアリング担当者として、考えられる理由は 3 つあります。(a) 測定自体は X 精度に対してのみ有効であり、したがってディスプレイはそれを反映する必要があるという真のエンジニアリング上の正当性、または (b) X に十分な表示スペースしかない精度、または (c) 視聴者は、X 精度よりも高い精度が利用可能であっても気にしません。

これらは一定のラベルで捉えるのが難しい複雑な理由であり、(何かが行われた理由を説明するために) コメントを付けたほうがよいでしょう。

これらの関数の使用が 1 か所で、しかも 1 か所だけである場合、私は数字が魔法だとは思わないでしょう。意図は明らかです。

参考のため:

リテラル数字は次の場合に魔法です。

于 2012-04-25T22:08:39.150 に答える