2011-01-22 4 views
0

私は本当にこの質問の正しい名前を知る方法がわかりません。私は、使用されるたびに処分されるべき物体がある特定のシナリオを持っています。その理由は2つあります:私は、すべてのメンバ変数(フィールド)が任意の新しい使用前に初期化されることを保証しなければならないオブジェクトの複数のインスタンスを保証する

  1. スレッドセーフではないので、このオブジェクトが同時に呼び出される方法は2つありません。

両方の理由は、すべてのパブリックメソッドが同じミューテックスをロックし、また、すべての公共の方法で呼び出されるプライベートメソッド、上のすべての変数を初期化した、オブジェクトでカバーすることができます。

このソリューションはエラーが発生しやすく、使用前にオブジェクトをロックするため、マルチスレッドのシナリオでアクセスをシリアル化するという副作用があります。もちろん、コール・サイトは、メソッドを呼び出す前に(副作用を除去して)新しいインスタンスを作成できますが、エラーが発生しやすくなります。

だから、私はきれいで、非常に奇妙な両方見つける解決策を考え出した:

私のオブジェクトが両方に必要な変数をパラメータとして持つ静的メソッドは、オブジェクトの新しいインスタンスを作成し、メソッドを実行公開。この静的メソッドは、オブジェクトのインスタンスを作成し、必要なメソッドを呼び出します。

もちろん、コンストラクタはプライベートです。

このソリューションを見るときに気づいた最初のことは、新しいメソッド呼び出しのたびに新しいオブジェクトが必要になるため、私のオブジェクトは手続き的なメソッドのように見えることです。しかし、オブジェクトの責任はこの計画にうまく収まります。

私の質問は、(ついに!、私が知っている)、次のとおりです。

  • (常にオブジェクトの新しいインスタンスを使用して)私の要件に準拠しますパターンはありますか?
  • 私のアプローチを記述するパターンはありますか?それとも反パターンですか?
  • オブジェクトが手続き型関数のコレクションのように見えるという事実の他に、このアプローチをしていない他の理由がありますか?

ありがとうございました。

+0

はあなたがターゲットとしている特定の言語があり、またはこれを勧誘するためにあなたがつもりですより一般的なアドバイス? –

+0

新しいクラスを作成し、おそらく状態を保持せずに、新しいクラスのすべての静的メソッドを非静的メソッドに置き換えます。いいえ、それが助けてもいいけど、それはテストの方がいいし、奇妙ではないように見えます。 – maaartinus

+0

@Cody:今、私はC#で作業していますが、答えがより一般的であれば良いと思います。 –

答えて

1

あなたの説明と同じように、それは古い手続き関数のクラス構文ラッピングです。これは実際にオブジェクトのクラスではありません。私はこのような非OOPプログラミングを含むOOPパターンが存在するとは思わない(シングルトンを除く)?

このようなデザインで、機能内でワンタイム使用オブジェクトを作成および破棄するためのメモリ/パフォーマンスオーバーヘッドが追加された点は何ですか?

ところで、クラスを2つのクラスに分割することができます。リソースを操作するリソースを保持するリソースの1つ。クライアントが最も適切なリソース管理スキームを決定し、リソース保持オブジェクトを操作クラスのメソッドに渡すようにします。

+0

シングルトンが私の心の中にあった... –

1

あなたはどの言語を使用しているのかは言いません(タグを使用するとよいです)。 C#では、次のようにします。

  1. フィールドをプライベートにして、プロパティを介してのみ公開します。
  2. 建設時にフィールドを初期化します。
  3. クラスはスレッドセーフである必要があります( "このオブジェクトが同時に呼び出される方法は2つありません")ので、スレッドセーフにしてください。ロックで変更可能な共有状態を保護します。
  4. Dispose patternを実装して、クライアントのインスタンスの廃棄を担当させます。

静的メソッドは、具体的にどのクライアントクラスにも本質的に結合します。とりわけ、クライアントクラスを単独でテストすることが難しくなります。

+0

テストの面については実際にはありません。良いですね。 –

0

オブジェクトが再利用されないようにするための組み込みの方法はありませんが、私はあなたがそれを奨励しようとすることができますいくつかの方法を考えることができます。ユーザーが望んでいれば、そのすべてが回り込む可能性があります。

  1. オブジェクトに1回だけ呼び出すメソッドがある場合は、オブジェクトの作成時にオブジェクト内に「状態」を設定してから、呼び出し後に状態を「使用済み」状態に設定できますメソッド。これにはさまざまな問題がありますが、可能な解決策です。
  2. 「トークンを取得して」オブジェクトを使用するようにユーザーに強制することができます。オブジェクトが使用されると、そのトークンを渡す必要があります。次に、オブジェクトはトークンを「使用済みトークン」リストと比較し、存在しない場合にのみ機能するようにします。繰り返しますが、問題は基本的に1回だけ呼び出すメソッドが1つしかない場合にのみ機能することです。
  3. コールので、二次利用が例外をスローします、基本的に作成したものは何でもリソースdestorying、オブジェクト自体の内部処分...
関連する問題