8

私は最近、同僚の 1 人に、現在のプロジェクト (C#) では「サービスはステートレスであるため、静的であるべきだ」と勧めました。

私の同僚は同意し、私たちのプロジェクトではサービスが実際にステートレスである (そしてそうあるべきである) ことを示しました。しかし、私の同僚は、静的は状態がないことを意味し、ステートレスは静的であることを意味することに同意しませんでした。

私の質問は、「静的とマークされたメソッドは、状態を必要とせず、ほとんどの場合、ステートレス メソッドを静的にする必要があることを意味しますか」です。

4

13 に答える 13

8

静的はほぼグローバルを意味します。まだインスタンスがあり、そのインスタンスにはまだ状態がありますが、それはstatic instanceです。つまり、インスタンスは 1 つしかなく、すべての呼び出し元は常にそのインスタンスを参照します。

于 2009-10-27T01:10:32.020 に答える
5

静的とマークされたメソッドは、状態を必要としないことを意味しますか

1)いいえ。静的メソッドは静的/シングルトンリソースにアクセスできるため、静的メソッドが状態を必要としないことを暗示しているとは言えません。

ほとんどの場合、ステートレス メソッドを静的にする必要があります

2) はい。状態を必要としない、したがってインスタンスを必要としないメソッドは、通常、静的にする必要があります。

于 2009-10-27T01:13:15.537 に答える
3

C# の静的メソッドは、それを含むクラスの静的変数にアクセスできます。アクセスできる場合、それはステートレスではありません。私は、再入不可の「ステートレス」静的メソッドが楽しい競合状態を引き起こすという痛ましい事例をいくつか見てきました。

真にステートレスなメソッドは実際に静的にすることができ、通常は静的にする必要があります。

于 2009-10-27T01:12:31.317 に答える
3

これらは2つの異なる世界であるため、ステートレスは静的と同じであると言うのはかなり怖いと思います。ステートレスとは、状態が保持されないことを意味します。つまり、HTTP 接続 (データが送信されると、接続は閉じられ、メモリは保持されません) が完璧な例です。 1 つの状態)。

一方、静的は、メソッドが呼び出される方法を説明するために使用される用語です。C# では、クラス インスタンスなしでメソッドを呼び出すことができますが、クラスのインスタンスは状態と同じではありません。静的インスタンスがまだあり、状態を完全に維持できます。静的メンバー変数、フィールド、またはプロパティは状態を維持できます。静的メソッドまたはクラスは、メモリ マップされたファイル、データベースなどを使用して状態を完全に維持することもできます。静的は呼び出し規約であり、それ以上のものではなく、ステートレスかどうかには関係ありません。

于 2009-10-27T01:17:06.730 に答える
3

彼の発言は、「民主主義は黄色い紙の投票用紙を使うべきだ」と同じくらい理にかなっていると思います。

彼は、高レベルの設計概念である「ステートレス サービス」と、低レベルの技術的な実装の詳細である「静的クラスを使用する」を混ぜ合わせています。

ステートレス サービスは、静的変数のみをサポートする言語 (COBOL、RPG など) および静的変数さえ許可しない言語 (Erlang など) で実装できます (実装されています)。

ステートレス サービスが静的クラスを使用して大規模に実装されているケースを簡単に想像できます。静的クラスが存在し、正しいビジネス ロジックが既に実装されているためです。ただし、一般的には、本当に必要な場合を除き、静的クラスを使用しないことを Java プログラミングの良い方法と考えています。

彼はまた、「静的」とは何かを真剣に誤解しています。静的変数は、呼び出し間の状態を格納する方法です。したがって、「ステートフル」サービスとのほうが適しているように思われます。

于 2009-10-27T01:44:14.600 に答える
2

staticは言語キーワードであり、stateはデザイン コンセプトです。これら2つのものの間には明らかな関係がありますが、それは形而上学的なものに対する具体的な関係であり、原因と結果の関係ではありません. 静的メソッドは、ある種の状態情報を参照することができます。

ステートレス メソッドに関しては、ここではクラス インスタンスを参照しないメソッド、つまり this ポインターについて説明します。これらのメソッドを静的としてマークすると、コードが明確になり、ベスト プラクティスと一致します。この場合、特定の種類の「ステートレス」について話しているのであり、ステートフル コンテキストの使用について一般的な解説を行っているわけではないことに注意してください。

于 2009-10-27T01:24:41.503 に答える
1

実行できる「静的」のすべての定義を再ハッシュする以上、答えは「はい」です。静的メソッドは、クラス自体の状態 (静的変数を介して表される) を喜んで変更し、クラスのインスタンスの状態を変更することさえできます (特に、インスタンスまたはインスタンスのセットが渡された場合)。ただし、ほとんどの場合、状態が変更されない場合は静的メソッドを使用します。最も重要な例は、インスタンス (ファクトリ メソッド) を検索または作成することです。

そうは言っても、本当の答えは「いいえ」です。実生活(たとえば、HTTP を介した Web サービス、またはあらゆる種類の Orb との対話) では、サービスは実際の静的メソッドを使用してサービス メソッドを公開することはありません。通常、静的メソッドを呼び出してサービスのインスタンス (またはインスタンスを取得するサービス ファクトリのインスタンス) を取得し、それを操作します。これは、サービス プロキシが内部的に、その場所を追跡する必要があるためです。したがって、メソッドはステートレスに見えますが、実際にはそうではありません。

これがあまり混乱しないことを願っています:)

于 2009-10-27T02:03:14.707 に答える
1

Static クラスはステートレスではありません。静的ではあるが状態を持つ変数を持つことができます。

クラスレベル変数のない静的クラスはステートレスです。データは保持されません。

于 2009-10-27T02:03:25.810 に答える
1

static はステートフルにすることができます。上記の状態の静的コンテナーを定義するだけです。コンテナーは、静的メソッドへのすべての呼び出しで共有されます。

于 2009-10-27T01:14:21.510 に答える
1

あなたの質問に対する短い答えは「いいえ」であり、 static「状態がない」ことを意味するものではありません。

他のコメントを参照してstatic、ステートレス サービスの実装に役立てることができますが、それstaticだけでは十分ではありません。何かをステートレスにするのに役立つもう 1 つのツール/手法は、不変のデータ構造を使用することです。これは (現在) C# の長所の 1 つではありません。特に F# と比較するとそうです。

于 2009-10-27T01:49:05.027 に答える
1

すべてのクラスには、静的フィールドが表現および格納されるクラス定義構造があります。クラスのすべての「インスタンス」は、クラス定義 (データ構造 caleld CORINFO_CLASS_STRUCT) に格納されている静的フィールドにアクセスできます。インスタンスが作成されていない場合でも、アセンブリ内の任意のコードは、classname.StaticFieldNameインスタンスをまったく使用せずに、構文を使用してこれらの静的クラス レベル フィールドにアクセスできます。

これらの静的なクラス レベル フィールドに格納された値は永続化されるため、確実に状態になります。実際、それらは、存在する可能性のあるクラスのインスタンスによって共有される状態であるだけでなく、インスタンスが作成されているかどうかに関係なく、アセンブリ全体で共有されます。

さらに重要なのは、CORINFO_CLASS_STRUCTクラス定義がロードされると、クラスの真のインスタンスとは異なり、アセンブリ (または AppDomain) がアンロードされるまでアンロードされないため、クラスで定義されたどのインスタンス フィールドよりも間違いなくステートフルです。これは、インスタンスがガベージ コレクションされるとインスタンス フィールドが消えるためです。

詳細については、Don Boxes のすばらしい本Essential .NetCORINFO_CLASS_STRUCTへのリンクを参照してください。

于 2009-10-27T01:19:43.637 に答える
0

それは一般的に正しいです。ただし、静的変数を使用すると、静的メソッドに状態を持たせることができます。たとえば、この FooBarFactory クラスを取り上げます。

class FooBarFactory
{
    private static _id = 0;
    public FooBar MakeAFooBar()
    {
        FooBar foo = new FooBar();
        foo.ID = _id;
        _id++;
    }
}
class FooBar
{
    public int ID {get;set;}
}

その場合、静的メソッドには最小限の状態がありますが、(おそらく) 必要です。

于 2009-10-27T01:13:40.423 に答える
-1

状態を持つ単一のインスタンスが必要な場合は、シングルトン パターンを使用します。単一オカレンス オブジェクトを操作しているという意図が明確になります。

それから、すべての静的クラスとメソッドをステートレスとして扱います。正気を保つのに役立つだけです。

于 2009-10-27T01:16:49.443 に答える