はい、それらは魔法の数字です。数値 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 の値がすぐに魔法になることがわかります。なぜなら、彼らがしていることには明らかに特別な何かがあり、その理由がわからないからです。