web-dev-qa-db-ja.com

再利用可能なメソッドにインスタンスまたは静的メソッドを使用する

デスクトップアプリケーション用に多くのフォームを作成しました。一部のフォームは、コードをコピーして貼り付ける必要がある同じ方法を使用していました(OOPではありません)。

FirstDayOfWeek()というメソッドがあり、このメソッドが5つのフォームで必要であるとします。つまり、コードを4回コピーして他のフォームに貼り付ける必要があります。

私が聞きたいのは:

  1. このFirstDayOfWeek()を新しいクラスに配置する場合、デフォルトまたは静的(インスタンスまたは静的)にする必要がありますか?したがって、このメソッドの更新がある場合、5つの形式で微調整する必要はありません。
  2. どちらの方がパフォーマンスが優れています。インスタンス、静的、または単なる手続き型コード(コピーと貼り付け)?
3
chopperfield

あなたの質問への答えは簡単ですが、追加のコンテキストがないと、正しいパターンではなくなったより複雑なシナリオで同じパターンが過剰に適用される可能性があります。

短い答え

この場合は、静力学が適しています。主な理由は、これが結果が特定のコンテキストに拘束されないヘルパーメソッドであることです。

長い答え

正しい方法は、方法の目的と、それをどのように達成するかによって異なります。

静的メソッドは、メソッドの目的がコンテキストに依存せず、グローバルに適用できない場合に使用する必要があります。週の最初の日を見つけるために必要なロジックは常に同じです。

ただし、ユーザーが週の最初の日(土/日/月)を選択できると仮定します。今週の最初の日を見つけるためのロジックはコンテキストであり、もはやグローバルに正しくないです(これはユーザーに依存します)。これは、ユーザー(またはユーザーが選択した日)を渡すことにより、静的を使用して行うこともできます。より複雑な例を考えると、これはより面倒になります。
ここでのより良いオプションは、依存性注入を使用して動作を注入することです。それぞれが同じ基本クラスの実装である複数のクラスを作成します。これは非常に複雑なトピックであり、最初から説明することはできませんが、重要な違い(コンテキスト)が明確であることを願っています。

パフォーマンス

静的メソッドとインスタンス化メソッドの間に意味のある違いはありません。オブジェクトをインスタンス化するコストは、ごくわずかです。パフォーマンスに影響を与える可能性がある唯一のものは、コンストラクターに高価なロジックがある場合ですが、これは、コンストラクターにこの高価なロジックが必要であり、したがってそれなしでは機能しません。そのため、それを回避するために取り組むべき問題ではありません(それ以外の場合と同じです)。

余談として:

手続きコード(コピー&ペースト)

これは手続き型のコードではありません。手続き型コードは、それが生成されており(開発者によってコピー/貼り付けされていない)、意図されていないツールによって示唆されています。

これらの複数のインスタンスが機能的に互いに独立していることを証明できない限り、コピー/貼り付けされたコードは決して正しいアプローチではありません。言い換えれば、それらは非常に異なるものになる可能性があり、現在同じことをしているという事実はcoincidence;です。 1つを更新するときに、他のすべてを更新する必要があるという要件はありません。
スポイラーアラート:同じメソッドの複数のインスタンスが適切なアプローチであると開発者が考える場合、10回のうち9回はそうではありません。

5
Flater

あなた パフォーマンスについてあまり心配しないでください ここ。このメソッドは、毎秒数百回呼び出されることはありません。あなたは再利用性について心配しています。これは素晴らしいことです(ところで、OOPに限定されません)。

current週の最初の日を返す単純なメソッドだけが必要な場合は、静的メソッドを tility class に作成します:

public static class Utility {
    public static DateTime FirstDayOfCurrentWeek() {
        // your code goes here
    }
}

このように、フォーム(またはアプリケーションの他の場所)から呼び出すのが最も簡単です。

これらのメソッドをさらに多く取得する場合は、DateUtilityStringUtilityなどの個別のユーティリティクラスを作成します。

0
Glorfindel

FirstDayOfWeekのコードが次のような場合:

DayOfWeek FirstDayOfWeek() => DayOfWeek.Monday;

つまり、返された値はハードコードされ、それを静的メソッドにします。

代わりに、コードがユーザーの構成またはロケールに基づいて週の最初の日を決定する場合、それはインスタンスメソッドであり、インターフェースと依存関係の注入を介してこれらのフォームに公開する必要があります。

0
David Arno

命名は難しい。オブジェクトに適切な名前を付け、それらが何をしているのかは、少しわかりやすくなっています。

それでは、assumeして、ある種のCalendarオブジェクトまたは拡張されたDateTime APIを作成しようとしています。

説明している内容は、3つの異なるカテゴリに分類される場合があります。

  1. ファクトリーメソッド は静的であり、パラメーターがない場合は常に同じオブジェクトを返すことがあります。
  2. 単純な プロパティ 。これは、静的ではないドメインモデルとオブジェクトによっては読み取り専用になる場合があります。
  3. 定数 は、アーキテクチャに応じて、クラスの外に表示される場合と表示されない場合があります。

状況に応じて、3つすべてが正しいです。

したがって、「週の最初の日」が何を意味するかについての詳細な情報がなく、オブジェクトの適切な名前と解決しようとしている問題についてのもう少し多くの情報がないと、公平なアドバイスをすることはできません。

命名は難しい

補足:日付と時刻も難しい。あなたはそれについて TheDailyWTFの記事の数 のピークを早めることでそれを理解できます。独自の日付/時刻操作関数を開発する前に高度なものが必要な場合は、 NodaTime を確認することを強くお勧めします。

副注2:最初の曜日は、 暦日 (チェック ここ を含む柔軟な概念です同様に)と営業日。

0
Machado