16

「ステートレス」や「イミュータブル」という言葉をよく耳にします。たとえば、HTTP はステートレス プロトコルであり、String オブジェクトは不変オブジェクトです。しかし、私は両者の違いを理解するのに苦労しています。ステートレス オブジェクトを作成すると、「状態」データが内部に保存されません。Immutable オブジェクトを作成すると、それは決して変更されないことを意味します。

同じ意味じゃない?

不変オブジェクトは変更されないため、定義上、状態を持つことはできません。それは永遠にあるものです。また、オブジェクトに状態がない場合、(定義により) 変更することはできません。したがって、すべてのステートレス オブジェクトが不変であり、不変オブジェクトがステートレスではないのでしょうか。

変更可能なステートレス オブジェクトまたは不変のステートフル オブジェクトの例は何ですか?

4

4 に答える 4

8

コンテキストは重要であり、ここには 2 つの無関係な概念があります。

「HTTP はステートレス プロトコルです」とは、同じクライアントから送信された以前のリクエストを含め、各リクエストが他のリクエストの暗黙的な知識を持たないことを意味します。これは、接続が確立されてから異なるコマンドが送信される FTP や SMTP などのプロトコルとは異なります。各コマンド/リクエストは同じクライアント/接続に「関連付けられています」。もちろん、状態/追跡は経由で追加されます。Cookie とトラッキング URI、さらにはパイプライン処理も含まれますが、要点は、HTTP プロトコルでは各リクエストが「新規」で「個別」であるということです。

「文字列は不変オブジェクトです」とは、その特定のオブジェクトのデータが、すべての観察可能な方法で現在のものと常に同一であることを意味します(これは、観察可能な属性を変更できないことも意味します)。一部の純粋主義者は、これよりも深い意味があると主張するかもしれませんが、実際には観察可能な属性に関するものです。不変オブジェクトが可変オブジェクトを「含む」ことができる場合、問題はより複雑になります。

(そして、技術的には、許可されたデータ(または状態) を持たないオブジェクトは更新できないため、「不変」です。ただし、繰り返しますが、コンテキストは重要であり、象やトランクの牙について話すのは奇妙ですタイガーで。)

編集:2つの違い

状態を持たないオブジェクトはステートレスです。すべてのステートレス オブジェクトは不変です (変更するものがないため)。これはトートロジカルな技術です。オブジェクトは状態を持つことができ、依然として不変です。ただし、状態を持つオブジェクト (不変またはその他) は、もはやステートレスと見なすことはできません。リンクされた回答のコメントによると、 「[an immutable object] has just one state」、初期状態です。

私のコメントから

于 2012-10-19T19:13:18.867 に答える
6

いいえ、同じ意味ではありません。

不変オブジェクトは変更できません。これは、そのオブジェクトに含まれるデータが状態を示すことができないという意味ではありません。State の変化を表現したい場合は、新しいオブジェクトを作成する必要があるということです。

ステートレスとは、状態がないことを意味します。

于 2012-10-19T19:12:40.677 に答える
3

状況によっては同じことだと思いますが、少し異なる側面に焦点を当てています。

「ステートレス」とは、状態がないことを意味すると人々が言うとき、私は笑ってしまいます。もちろん、いくつかの観点からはいくつかの状態があります。たとえば、ステートレス サービスは、オブジェクトの複雑なグラフ (依存性注入) によってサポートされます。問題は、ネットワークプロトコルの「状態」の意味がわずかに異なることです。これは、以前の要求/応答に依存するものです。しかし、定義上、不変サービスは以前の呼び出しにも依存しません。

「ステートレス」は必ずしも HTTP プロトコルに関連しているわけではありません。同じ用語は、光沢のある OOP コードのサービス オブジェクトのセッターを議論するために使用できます。ここで、これら 2 つの用語が実際には同じであることがわかります。不変サービスはステートレス サービスであり、その逆です。

しかし、値オブジェクトを「ステートレス オブジェクト」と呼ぶのは、私にとっては厄介です。ひどいですね。

要約: サービスの場合 (ネットワークまたは OOP は関係ありません)、これらの用語は交換可能です。

例:

interface Logger
{
    public function logWarning(string $message);
    public function logError(string $message);
}

何回呼び出したlogWarningか、またはlogError呼び出しの順序も重要ではありません。したがって、これを「ステートレス サービス」と呼ぶことができます。

ただし、このサービスにはセッターもミューテーターもありませんchangeFileName()->不変のサービス/オブジェクトです。

可変性により、オブジェクトはステートフルになります。ステートフルはオブジェクトを変更可能にします。これらの用語は、サービスのコンテキストで相互に依存しています。

于 2017-01-04T11:32:26.300 に答える
1

それらは間違いなく同じではありません。

不変オブジェクトは決して変更されません。不変オブジェクトの状態が変更されることはありません。不変オブジェクトのエイリアシングは無害であり、不変オブジェクトにエイリアス制御は必要ありませんが、オブジェクトが実際に不変であることを証明するためにエイリアス制御が必要になる場合があります。

そして、ステートレスは状態がないことを意味します。HTTP はステートレス プロトコルと呼ばれます。これは、各コマンドが独立して実行され、その前にあるコマンドを認識していないためです。これは、リクエスト パラダイムに基づいています。このプロトコルでは、通信は通常、TCP/IP プロトコルを介して行われます。

于 2012-10-19T19:17:11.233 に答える