2010-12-01 19 views
2

で私はいつもクラスレベルで定数を定義するのが習慣にしてきました定義定数のスコープ

public class MyClass 
{ 
    public void SomeMethod() 
    { 
     const int SomeNumber = 10; 
     ... 
    } 
} 

最初のを好むための私の唯一の引数は定数が他の方法で必要とされる場合には何のリファクタリング必要がないことであり、また、それはそれが簡単に、彼らはよ以来、定数を更新することができます:それはその方法で定義する必要があります同じ場所に定義することができます。

他の賛否両論はありますか、それとも本当に違いはありませんか?

+0

更新が必要な「定数」は 'static readonly'変数でなければなりません。 – Sorax

答えて

4

更新が必要な場合は、実際には定数ではありません。つまり、Piの価値をしばしばリファクタリングすることはありません。私の意見では、変更されたものは設定ファイルに含まれています。

私は通常、クラスレベル公開の定数を使用しています。 メソッドレベルの定数を見たり、使用したことがありません。概念的には、メソッドレベル定数は私にはほとんど意味がありません。

0

私は少なくともクラスレベルでの定義のアプローチに行きます。さまざまなクラスの方法で同じ定数を見ることができます。

またはより良いアプローチ

をすべてのそれらの定数が出て、ソリューションのeevnを通じてdifferntクラスで見ることができるように、一定の計算にいくつかのロジックを変更したい場合は、あなたがそれを行うことができ、単一のクラス内のすべての定数を定義します集まった場所で。

+0

'grep const'は私にすべての定数を与えます。 – delnan

1

メソッドレベルconstは、変数が変更されないようにコンパイラに示唆しており、その場合に最適化できます。これらのメソッドの外側で使用されていないメソッドに文字列や数値をハードコーディングする習慣があるなら、これはすばらしいことです。これは、イホ、良い習慣ではありません。

1

グローバル、シングルトンなどに対する一般的な推論は、すべての範囲が(合理的に)可能な限り制限されるべきであるということです。私は同意する - スコープが小さいほど、誰かがそれを混乱させ、コードが少なくなるとコードが混乱する可能性がある。この推論は定数にはあまり当てはまらない。しかし、それが単一の方法でのみ必要な場合は、そこに定義してください。それがうまくいっていないためにまったく無関係の文脈でそれを使用しないようにするためだけであれば、定数 "に変更されます(それは頻繁ではありません - そうでなければ定数ではなく、ファイル - それでもなお)。

「他のメソッドが定数にアクセスする必要がある場合は、リファクタリングが減ります」... YAGNI。

+0

それに加えて、すべての内部定数を使用するメソッドが多数ある場合(おそらくそれはないはずです)、同じ場所に宣言するのは意味がありません。共通点はありません。一緒に属しているものは一緒にすべきです:変数(定数かどうか)がメソッドに属している場合は、そのメソッドで宣言します。 forループに属している場合:forループを宣言します。クラスに属している場合:クラスで宣言します。 – Johan

関連する問題