問題タブ [global-state]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - クラスメタデータなどの実行時情報に受け入れられるPHPグローバル状態?
グローバル状態を使用してクラス メタデータに関する実行時情報を PHP に格納するのに苦労しています。明らかな理由により、グローバル状態は「悪い」と見なされるため、できるだけ避けたいと思います。とはいえ、どの状況でそれが本当に受け入れられ、どの状況で受け入れられないのかはまだわかりません. 具体的な例を提供するために、PHP での Enum 型の実装を見てみましょう。各具体的な Enum 型は抽象 Enum 型を拡張し、リフレクションを使用してサブクラスの定数を有効な Enum 値として読み取ります。
ここで考えられる問題は、リフレクションを使用してサブクラスの定数を解決する resolveConstants() メソッドです。実行時に大量の Enum インスタンスを作成する必要がある状況を考えてみましょう。ここで各インスタンスでリフレクションを使用すると、パフォーマンスに深刻な影響を与える可能性があるため、特定の Enum 型の最初のインスタンスでのみクラス メタデータを「遅延読み込み」するのが適切な方法のようです。しかし、これを達成するにはグローバル状態を使用する必要がありますが、これも間違っているようです。これは最良の例ではないかもしれませんが、パフォーマンスの問題に関する私の懸念を示しています。オブジェクトを状態に設定するために、リフレクションとクラス メタデータ イントロスペクションを広範に使用する必要があるユース ケースは他にもあるかもしれません。この種のグローバルな状態を持つことは一般的に受け入れられるのでしょうか、それともそのような目標を達成するための代替手段はありますか? Enum のような単純な値オブジェクトの依存性注入がオーバーヘッドになるような状況で、クラス メタデータを提供する別のクラスを使用するのは好きではありません。
ruby - グローバル状態が悪いのはなぜですか?
先日、#ruby-lang チャンネルの誰かと について話しました@@class_variables
。すべては、あるユーザーが、自分のサーバーに接続しているユーザーを追跡する最善の方法は何かと尋ねたときに始まりました (少し単純化しましたが、それが要点です)。
だから、私は提案しました:
ただし、ここでグローバル状態を使用することは悪い習慣と見なされると誰かが言いました。
複数のバックエンドに依存するものにとってなぜグローバル状態が悪いのか、私は理解しています。なぜなら、グローバル状態のグローバル部分がグローバルではなくなり、その 1 つのバックエンドにローカライズされるからです。または、依存性注入を妨害すること。
とはいえ、これが悪い理由は他に思いつきません。また、同時実行性が問題になった場合 (複数のバックエンドが必要な場合)、Redis (または同様のもの) を使用するようにコードを更新できます。
また、この質問をprogrammers.sxcで見つけましたが、上記のコードがなぜそれほど悪いと考えられているのか理解するのに役立ちませんか? また、代替手段は何ですか?
java - シングルトン Util クラスの代替
だから私は次のようなクラスを持っています:
したがって、基本的に私はシングルトン クラスを自分用に持っています。これは、初めて使用するときに構成オブジェクトをセットアップし、その後は単純に get 呼び出しをリッスンし続けます。このクラスにはいくつかの問題があります。
- クラス HBaseUtil 内の静的メソッドの単体テストは、Singleton と構成ファイルの間の緊密な結合により困難になります。
- 私が本当に欲しいのは、ファイル名/ファイル名 + パスをクラスに提供して、そこに移動し、そのファイルから構成プロパティを読み取り、着信読み取り要求にそれらを提供できるようにすることです。ただし、ここで重要な注意点が 1 つあります。JVM の起動ごとに 1 回だけプロパティ ファイルを指定するという柔軟性が必要です。だから私は確かに状態を維持する必要はありません。
これが私が思いついたものです。シングルトンの代わりに、すべての静的メソッドを持ち、明示的なコンストラクターが定義されていない通常のクラスがあります。
そして、次のように他のコードでクラスを使用する代わりに:
私はそれを次のように使用します:
私の質問:
- 私は正しい方向に考えていますか?私の要件は、JVM ごとに 1 回だけクラスに柔軟性を持たせることです。このために私のプロジェクトで構成可能にする必要があるのは、HBase .properties ファイルの場所/内容だけです。シングルトンを持つことは、この要件に対してやり過ぎだと思っていました。
- 私の要件には、他にどのようなより良いアプローチがありますか (上記のポイントで述べた)?
ありがとう!
注:このStackOverflow のディスカッションを読みましたが、さらに混乱してしまいました。
python - Python の `unittest.mock.patch` はグローバル状態を変更しますか?
mock.patch
Python の( unittest.mock.patch
Py3 の) コンテキスト マネージャーがグローバル状態を変更するかどうか、つまり、スレッド セーフかどうかを判断しようとしています。
例: 1 つのスレッドがコンテキスト マネージャーを使用して関数bar
内の関数にパッチを適用foo
し、コンテキスト マネージャー内でインタープリターがそのスレッドを一時停止し (GIL などの理由で)、そのfoo
コンテキスト マネージャーの外部で実行される別のスレッドを再開するとします。がスレッドセーフである場合、関数およびpatch
のグローバル状態は変更されていないことが期待されるため、2 番目のスレッドは の通常の動作を取得します。しかし、グローバル状態を変更すると、2 番目のスレッドは、コンテキスト マネージャー内になくても、変更された動作を取得します。foo
bar
foo
patch
foo
ソースコードを参照しましたが、見ただけでははっきりとはわかりませんでした。
ios - Swift でグローバル状態を回避する方法
可変状態の回避と、シングルトン パターンがグローバル状態を持つのにどのように悪いかについて読んでいます。
依存性注入http://www.objc.io/issue-13/singletons.htmlに関する回答はほとんどありませんが、この基本的なアプローチを解決する方法が見つかりません。
アプリの周りのユーザーデータをどのように維持しますか?解決策は、パラメーターによるビューを介して、1 つのビュー (Web サービスによって要求される場所) から 7 つのプッシュビュー (再び必要になる場所) にユーザー情報を渡すことです。
より良い方法はありますか?、またはシングルトンパターンが必要な場合がありますか?
javascript - Reactアプリケーションでグローバル状態を回避するには?
私の React アプリでは、どこからでもアクセスできるようにする必要があるデータを保存する必要がありますが、単体テストとスタイルガイド。
私が意味するデータは、たとえば次のとおりです。
- ブラウザのビルドと Node.js にある定数
IN_BROWSER
です。true
false
IS_MOBILE
ブラウザの起動時に初期化される定数- 現在ログインしているユーザーのデータ、
- 接続先の API の URL (構成に応じて、ローカルホスト、ステージング サーバー、またはプロダクション)
現在sessionData.js
、このデータを格納する という名前のファイルがあり、必要なときはいつでもrequire('./sessionData')
自分のコードでそれを使用します。を使用して単体テスト用にモックできますrewire
。それらは順次実行されるため、今のところ問題なく動作します。各例が異なるユーザーの視点からビューを表示できるため、スタイルガイドにとっては問題があります (理想的には、各例には独自の がありますsessionData
)。
IN_BROWSER
これはglobal
、すべてのモジュールの初期化コードに暗黙の依存関係を置くため、これも悪い考えであることが判明しました。
sessionData
階層の下のすべてのコンポーネントに小道具を介して自分のものや他のものを渡すことができることがわかりましたが、これは多くの冗長性のようです。
それをよりよく解決するための設計パターンはありますか?