2

シングルトンの非常に優れた包括的な概要が記載されている このページに出くわしました。

一般的な「シングルトンは、プライベート コンストラクターと 1 つのグローバル インスタンスのみを持つクラスです」の代わりに、次のようにシングルトンを説明します。

「シングルトン」の意味を正確に定義することが重要です。

この引数の目的上、シングルトンとは、スタックから開始せずに到達できる(つまり、静的変数またはグローバル変数から到達できる) 任意の変更可能な状態です。

通常、シングルトンは作成者がインスタンスが 1 つしか存在しないことを期待するクラスです。ただし、私たちの目的では、グローバルにアクセスできるオブジェクトはすべてカウントされます。

例:

  • 共有された変更可能な状態を操作する一連の関数 (または静的メソッド) は、シングルトンを構成します。
  • シングルトン A が可変オブジェクト B への参照を提供する場合、B もシングルトンです。
  • これは、シングルトン コレクションの可変メンバーはすべて、それ自体がシングルトンであることを意味します。
  • 推移的に不変のオブジェクトは、グローバルにアクセスできる場合でもシングルトンではありません。定数です。
  • コードが不変であると仮定すると、シングルトンにアクセスしないスタンドアロン関数自体はシングルトンではありません。

...

open() や stdout はどうですか?

これらはシングルトンの最悪の例です!
...

これは、本質的に、mallocnewshared_ptr、または言語がヒープメモリにアクセスするために使用するものは何でも、これらはすべてシングルトンを使用していることを意味します!

しかし、このためにヒープ割り当てを避ける必要があるとは誰も言いません。メモリ割り当てはどこでも見落とされているようです! 私が引用したページでさえ、彼らはロギングについて言及open()stdoutていますが、ヒープメモリの割り当てについては決して言及していません。これは、一方通行ではないため、ロガーなどより明らかに「危険」です。

だから私の質問は、メモリ割り当てはルールの例外ですか(なぜですか?)、それともシングルトンの悪い例ですか?

シングルトンの新しい使用が同じ「例外的な」カテゴリに該当するかどうかを判断するにはどうすればよいですか?

new(明らかな理由で言語に依存しないタグを付けますが、ユーザーが動作を変更してよりグローバルな状態を導入できるようにするため、特に C++ に関連していると思うので、C++ としてタグ付けします。)

4

1 に答える 1

1

定義上、プログラムは 1 つの外部世界とのみ対話します。したがって、それがシングルトンの例ではないと主張する人は誰もいません!

しかし、ソフトウェア設計の観点から言えば、「これで問題が発生する可能性はありますか?」という質問にすぎません。そして「それについて私にできることはありますか?」.

出力のようなものについては、両方の答えは「はい」です。複雑なプログラムでは、出力を非シングルトン オブジェクトにカプセル化することで、かなりの利点 (テスト、依存関係の挿入など) が得られます。システムメモリのようなものでは、それほど多くはありません。

固有の結合の一部を抽象化することができます (実際、メモリの場合、OS、言語ランタイム、およびカスタム アロケータなどはすべてこれをある程度行います)。オブジェクトの背後にあるすべてのメモリ割り当てをカプセル化して、メモリ不足の状態に対する複雑なアプリケーションの応答をテストできるようにすることも役立つ場合があります。しかし、それでもグローバル カップリングを完全に排除することはできません。

于 2013-03-28T19:08:25.463 に答える