3

これにはよく戸惑います。変数や定数を使ってよく使う数値に名前を付けるように教えられてきましたが、プログラムの効率が低下する場合は、それでもそうすべきでしょうか? 例を次に示します。

private int CenterText(Font font, PrintPageEventArgs e, string text)
    {
        int recieptCenter = 125;
        int stringLength = Convert.ToInt32(e.Graphics.MeasureString(text, font));
        return recieptCenter - stringLength / 2;
    }

上記のコードは名前付き変数を使用していますが、このコードよりも遅く実行されます。

private int CenterText(Font font, PrintPageEventArgs e, string text)
    {
        return 125 - Convert.ToInt32(e.Graphics.MeasureString(text, font) / 2);
    }

この例では、実行時間の差はごくわずかですが、より大きなコード ブロックではどうでしょうか?

4

3 に答える 3

9

変数を使用する場合とハードコードされた値を使用する場合の違いは、最悪の場合でもごくわずかです。コンパイラは、このようなことを非常にうまく処理します。パフォーマンスに違いが見られた場合は、それらの指標を収集する方法についてお聞きしたいと思います. (テスト自体が疑わしい可能性があり、再現できない可能性が最も高いです。)

いずれにせよ、まず最初に、プログラムを正しく、保守しやすいものにすることを心配する必要があります。つまり、次のことを意味します。

  • クラス、メソッド、変数に慎重に名前を付ける
  • 懸念事項の分離
  • 魔法の数字と文字列を避ける (一体何なのか、125どういう意味なのか?)
  • ハーコーディングを避ける

また、recipientCenter は、定数である必要があるようにも聞こえません。頻繁に変更されることはありませんが、アプリの外部の構成ファイルや db テーブルなどに保存することをお勧めします。その値を変更する必要がある場合は、再コンパイルしてすべてを prod にプッシュする必要があります。また、receiptCenter の値が異なる別の場所でソフトウェアを公開する場合はどうすればよいでしょうか? そのインスタンスのためだけに別のバージョンのアプリをビルドするのではなく、構成設定を変更したいだけです。

最適化は、アーキテクト/エキスパートレベルの考慮事項であり、最初に心配する必要がある場合を除いて、最後に心配することです。

于 2013-10-18T19:03:00.207 に答える
9

彼らが「定数を使用する」と言うとき、文字通り「定数を使用する」ことを意味します。「決して変わらない変数を使用する」という意味ではありません。

これはあなたのコードと同等です:

const int recieptCenter = 125;
int stringLength = Convert.ToInt32(e.Graphics.MeasureString(text, font));
return recieptCenter - stringLength / 2;

キーワードを配置するconstと、コンパイラはそれ125が決して変わらないことを認識し、リテラルとして表現された定数に適用する最適化を適用できます。

「マジック ナンバー」に名前を付けることには大きな利点があります。会社を辞めた後もコードを管理する人は、125. 数年後にこのコードに戻ってきたときにも役立ちます。

于 2013-10-18T19:05:20.077 に答える
-1

レシートセンターは、すべての定数が一緒に宣言されている明らかな場所で、そのプライベートメソッドの外側のどこかで宣言された定数でなければなりません。または、構成から読み取った変数にすることもできます。

クラスライブラリの奥深くにあるプライベートメソッドのどこかにある定数に名前を付けても、コードは実際には改善されません。

于 2013-10-18T19:06:47.457 に答える