オブジェクトでメソッドを呼び出すよりも、静的メソッドを使用してオブジェクトへの参照をパラメーターとして渡すほうが有利なのはなぜですか?
私の意味を明確にするために、次のクラスを検討してください。
public class SomeClass {
private double someValue;
public SomeClass() {
// Some constructor in which someValue is set
}
public void incrementValue() {
someValue++;
}
}
静的メソッドを使用したこの代替実装と比較して:
public class SomeClass {
private double someValue;
public SomeClass() {
// Some constructor in which someValue is set
}
public static void incrementValue(SomeClass obj) {
obj.someValue++;
}
}
私の質問はこのクラスだけに限定されていません。メソッドで呼び出すのではなくオブジェクトを渡す任意のポイントが私が興味を持っているものです。これはこれまでに有利ですか?もしそうなら、なぜですか?
自明な例:渡されたインスタンスが正当にnullになる可能性があり、これの(自明ではない)処理をメソッドに組み込みたい場合。
あなたの例では、インスタンスメソッドは明らかに勝者です。
一般的なケースでは、静的メソッドが適切ないくつかの理由を考えることができます。
ロジックをデータから分離することが理にかなっている状況があるため、静的メソッドを別のクラスに配置する必要があります(注:この例はその1つではありません)。
2つ以上のオブジェクトを渡していて、それらが同等に重要であることを強調したい。
null
は有効な値です(ユーザー9000が説明)。
オブジェクトの状態を変更するメソッドをstaticメソッドではなくinstanceメソッドとして含めるのが賢明です。
ただし、特定の検証ルールに基づいてオブジェクトをインスタンス化する必要がある場合など、pure
メソッドである静的メソッドの例を見つけて、オブジェクトを入力として取得できます。たとえば、 。NET には、オブジェクトを検証してインスタンス化するメソッドDateTime.TryParse(String s, DateTime d)
があります。ただし、パラメータ_DateTime d
_は明示的にout
としてマークされます。
オブジェクトを比較して、比較結果のブール値/整数値ではなく、戻り値として目的のオブジェクトを取得したい場合もあります(例:Team.GetHigherScorer(teamA, teamB).IncreaseRanking()
)。これは以下よりもクリーンになります:
_int compareResult = teamA.compareScoreWith(teamB);
if (compareResult == 1)
teamA.IncreaseRanking();
else if (compareResult == -1)
teamB.IncreaseRanking();
_
(ケースを単純化するために「引き出し」ておいてください)。
依存性注入は、静的メソッドへの呼び出しを実行する良い理由です。 SomeClass
の具体的な実装に継承チェーンがあるか、別のクラスの実装であると想定します。オブジェクトのモックを使用し、それをテスト目的で渡して、メソッドが想定どおりの動作をすることを確認してから、そのステータスについて報告することができます。