2009-09-19 25 views
8

私は最近、Resharperがメソッドを静的にすることができるというヒントを出すように、渡されたオブジェクトのいくつかのフィールドを設定するプライベートメソッドを作成するときに気づいた。プライベートメソッドを静的にすることを推奨するResharperの推奨ですか?

これは、私が持つ可能性がある方法の並べ替えの非常に簡単な例です。

private void MakeStatusTheSame(MyClass mc, MySecondClass msc) 
{ 
    mc.Status = msc.Status; 
} 

このような方法がある場合、Resharperはメソッドを静的にすることを推奨しています。

パブリックメソッドを静的にしないようにしようとしています。なぜなら、それらは単体テストに大混乱を引き起こすからです...しかし私は、プライベートメソッドにも同じことが当てはまりません。

Resharperの推奨は有効なベストプラクティスですか、それともオフにするだけですか?

+2

パブリックメソッドは、副作用が発生しない場合は完全にテスト可能* * –

答えて

11

私はこれが確かに静的メソッドの第一候補だと思います。それは例など、クラスのプロパティ、フィールド、ここで

のいずれかをだ変更していないです:

public static class Extensions 
{ 
    public static MyClass MakeStatusTheSame(this MyClass mc, MySecondClass msc) 
    { 
    mc.status = msc.status 
    return mc; /* make the method chainable */ 
    } 
} 
:また

class MyClass 
{ 
    public static void MakeStatusTheSame(MyClass mc, MySecondClass msc) 
    { 
    mc.status = msc.status; 
    } 

    private void MakeStatusTheSame(MySecondClass msc) 
    { 
    this.status = msc.status; 
    } 

    private int status; 
} 

を、あなたはそれを(も静的になります)拡張メソッドを作ることができます

7

私はそう思います。メソッドが静的であることを確認することは、メソッドがでなく、がインスタンスメンバーと対話していることを明確に示しています。

非静的メソッドのデバッグを想定し、インスタンスには触れられていないことを想像してください。即座の臭いがあり、機能が何をしているのかを説明するコメントがない場合、あなたは本当の問題から気を散らすことができます。

+2

+1は、メソッドがインスタンスメンバーとやり取りしてはならないことを明確にします。インスタンスメンバーのメソッドを呼び出すことで、特定のコードを変更する前に、人々が二度考えて欲しいのは間違いないでしょう。インスタンスメンバーを使用するようにコードを修正した場合は、プライベートメソッドの静的にマークを付けることによって、コンパイルの警告が表示され、少なくとも数秒間考えるようにする必要があります。 – mezoid

+0

私は、インスタンスフィールドにアクセスしようとするとコンパイルエラーが発生するだけで、ほんの数分前に静的メソッドを作成することをR#に勧めました。初めてそれが起こったことは、何かがそれを混乱させているに違いない。 – ProfK

+0

インタラクションすることはどういう意味ですか?値を変更しますか?これには値を読むことも含まれますか? – guiomie

4

私は通常、R#の推薦で行く。それはプライベートメソッドなので、(うまくいけば)ユニットテストを書いているわけではありません。静的にすると、インスタンスメンバーが使用されないことが明示的に示されます。これにより、副作用の検査が容易になります。

8

contrarianのように聞こえる危険があるので、私は静的メソッドとインスタンスメソッドを混在させたくないことを認めなければなりません。私は一般的に静的メソッドを嫌いです。静的メソッドはテストするのが難しく、上書きが難しく、保守が難しい。私は、Fooオブジェクトを扱うための静的メソッドをすべて1つのFooUtilsクラスにスティックする方が好都合です。つまり、FooSomethingDoerクラスのシングルトンインスタンスに格納することをお勧めします。

もちろん、スタティックメソッドは、前述のシングルトンやファクトリなどを作成するときなど、ある意味では完璧な意味を持ちます。すべての静的メソッドが純粋な悪から作られているわけではありません。私は、できるだけ避けようとする側を誤って好むだけです。

+0

私はあなたと一緒です。私は単にメソッドが静的になるようにしています。なぜなら、私は「できる」だけではないからです。 – Josh

+1

私は公共、保護、および社内では同意しますが、私的な方法では同意しません。 Utilsのクラスがコードの匂いである場合、ネットについての議論がいくつかあります。私は注意して使用することをお勧めします。 – TrueWill

+0

合意。メソッドを静的にすることは、そのメソッドの使用に関連する情報を伝達する試みです。すべて静的にすることは意味をなさない。 –