ステートレス クラスの欠点を知りたいのですが (もしあれば)? 一部のユースケースでステートレス クラスの作成が義務付けられている実際のアプリケーションを見た人はいますか (No hello world please )。ステートレス クラスとは、フィールドのないクラスを意味すると思います。
7 に答える
「ステートレス クラス」とは聞いたことがありませんが、不変オブジェクトのことだと思います (非常に便利な概念です!)。または、フィールドをまったく持たないクラスである可能性があるため、通常は純粋な関数の集まりのように見えます。
私もその用語が何を意味するのかわかりませんが、オブジェクトの状態は実際にはそのフィールドのコンテンツであるため、フィールドのないクラスを意味すると思います。
さて、通常、この種のクラスを関連する関数のコレクションとして使用します。たとえば、特定の Utils
クラスです。この種のクラスを使用する一般的な方法は、そのメソッドを静的にすることです。そのため、実際にクラスのインスタンスを作成する必要はありません。
このようなステートレスオブジェクトを実際に作成することを考えることができる唯一の理由は、実行時に実際の機能を決定したい場合です。したがって、UtilsBase
一連の仮想メソッドを提供し、UtilsDerived
一部のメソッドをオーバーライドするクラスがある場合は、utilsを使用する必要がある人に参照を渡しUtilsBase
、実行時に実際のutilsオブジェクトを作成できます。特定のニーズ。
ステートレス クラスが不変オブジェクトのクラスを意味する場合、欠点は、変更操作では、オブジェクトをインプレースで変更するのではなく、オブジェクトをコピーする必要があることです。それは高価かもしれません。
オブジェクトの動作が一度に処理できる何らかの入力によって決定されるときはいつでも、私はこれらのものをかなり頻繁に使用します。最近の例は、私が実装した統計言語モデルです。モデル パラメーターは、トレーニング入力に基づいてコンストラクター内で完全に決定されます。その後、モデルに対してクエリを実行して、目に見えないテキストの確率推定を行うことができましたが、変更はできませんでした。不変性は厳密には義務付けられていませんでしたが、オブジェクトを変更しても意味がありませんでした。後でデータを追加する必要がなかったからです (その場合、とにかく計算の多くをやり直す必要がありました)。
ステートレス クラスでは、すべてのフィールド メンバーが読み取り専用型である必要があります。c# には、コンパイル時にステートレスであることをチェックする次のような機能はありません。
public readonly class MyReadonlyClass
{
public readonly double X {get;set;}
public readonly double Y {get;set;}
public readonly double Z {get;set;}
public MyReadonlyClass(double x_,double y_,double z_)
{
X=x_;Y=y_;Z=z_;
}
}
public readonly static class MyStaticReadonlyClass
{
public readonly static double X {get;set;}
public readonly static double Y {get;set;}
public readonly static double Z {get;set;}
static MyStaticReadonlyClass(double x_,double y_,double z_)
{
X=x_;Y=y_;Z=z_;
}
}