タグ付けされた質問 「state」

4
関数型スタイルでプログラミングする場合、アプリケーションロジックを通して織り込む単一のアプリケーション状態がありますか?
どのように私は、次のすべてを持っているシステムを構築します。 不変オブジェクトで純粋な関数を使用します。 関数が必要とする関数データのみに渡し、それ以上(つまり、大きなアプリケーション状態オブジェクトはなし) 関数への引数が多すぎることは避けてください。 関数に渡されるパラメーターが多すぎるのを避けるために、関数にパラメーターをパックおよびアンパックするためだけに新しいオブジェクトを作成する必要はありません。複数のアイテムを単一のオブジェクトとして関数にパックする場合、一時的に構築されたものではなく、そのオブジェクトをそのデータの所有者にしたい Stateモナドはルール2に違反しているように思えますが、モナドを介して織り込まれているため明らかではありません。 どういうわけかレンズを使用する必要があると感じていますが、非機能言語についてはほとんど書かれていません。 バックグラウンド 演習として、既存のアプリケーションの1つをオブジェクト指向スタイルから機能スタイルに変換しています。私が最初にやろうとしているのは、アプリケーションの内部コアをできるだけ多く作成することです。 私が聞いたことの1つは、純粋に機能的な言語で「状態」を管理する方法であり、これは私がステートモナドによって行われていると信じていることです。 「そのままの世界」を選択し、関数が戻ると、変化した世界の状態を返します。 たとえば、純粋に機能的な方法で「hello world」を実行する方法は、プログラムに画面の状態を渡し、「hello world」が印刷された画面の状態を受け取るようなものです。技術的には、純粋な関数を呼び出しているので、副作用はありません。 それに基づいて、アプリケーションを調べました。1。最初に、すべてのアプリケーション状態を単一のグローバルオブジェクト(GameState)に入れます。2。次に、GameStateを不変にしました。変更することはできません。変更が必要な場合は、新しいものを作成する必要があります。これを行うために、コピーコンストラクターを追加しました。オプションで、変更された1つ以上のフィールドを使用します。3.各アプリケーションに、GameStateをパラメーターとして渡します。関数内で、予定通りの処理を行った後、新しいGameStateを作成して返します。 純粋に機能的なコアと、そのGameStateをアプリケーションのメインワークフローループにフィードする外側のループの仕組み。 私の質問: さて、私の問題は、GameStateには約15種類の不変オブジェクトがあることです。最下位レベルの関数の多くは、スコアの保持など、これらのオブジェクトの一部のみで動作します。それで、スコアを計算する関数があるとしましょう。今日、GameStateはこの関数に渡され、新しいスコアで新しいGameStateを作成してスコアを変更します。 それについて何かが間違っているようです。この関数はGameState全体を必要としません。スコアオブジェクトが必要です。そこで、スコアを渡すように更新し、スコアのみを返します。 それは理にかなっているように思えたので、私は他の機能をさらに使いました。一部の関数では、GameStateから2、3、または4つのパラメーターを渡す必要がありますが、アプリケーションの外側のコア全体でパターンを使用しているため、ますます多くのアプリケーション状態を渡しています。たとえば、ワークフローループの先頭で、メソッドを呼び出し、メソッドを呼び出すメソッドなどを呼び出して、スコアが計算されるまで続けます。つまり、一番下の関数がスコアを計算するという理由だけで、現在のスコアがこれらすべてのレイヤーに渡されます。 だから今私は時々数十のパラメータを持つ関数を持っています。これらのパラメーターをオブジェクトに入れてパラメーターの数を減らすこともできますが、そのクラスは、単に渡すことを避けるために呼び出し時に単純に構築されるオブジェクトではなく、状態アプリケーション状態のマスターの場所にしたいです複数のパラメータで、それらを解凍します。 だから今、私が持っている問題は私の関数があまりにも深くネストされていることだろうかと思っています。これは小さな関数が必要なためです。そのため、関数が大きくなったらリファクタリングし、複数の小さな関数に分割します。しかし、そうすることでより深い階層が生成され、外部関数が直接それらのオブジェクトを操作していない場合でも、内部関数に渡されたものはすべて外部関数に渡される必要があります。 この問題を回避する方法に沿って単にGameStateを渡すように見えました。しかし、関数が必要とする以上の情報を関数に渡すという元の問題に戻りました。

4
「OOPは状態を隠す」とはどういう意味ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 でcat-v.org上の多くの抗OOPの暴言の一つ、私は以下の通りであったそのうちの一つOOPモデルに対して複数の異議を上げるジョー・アームストロングの通路を見つけました: 異論4 –オブジェクトにはプライベート状態があります 国家はすべての悪の根源です。特に、副作用のある機能は避けてください。 プログラミング言語の状態は望ましくありませんが、現実の世界では状態が豊富です。私は銀行口座の状態に非常に興味があり、銀行に入金または引き出しを行うと、銀行口座の状態が正しく更新されることを期待しています。 状態が現実の世界に存在する場合、プログラミング言語は状態を処理するためにどの機能を提供する必要がありますか? OOPLは「プログラマーから状態を隠す」と言います。状態は非表示であり、アクセス関数を介してのみ表示されます。従来のプログラミング言語(C、Pascal)は、状態変数の可視性は言語のスコープルールによって制御されると言います。純粋な宣言型言語は、状態がないと言います。システムのグローバルな状態はすべての機能に持ち込まれ、すべての機能から出てきます。モナド(FPL用)やDCG(ロジック言語)などのメカニズムは、プログラマーから状態を隠すために使用され、「状態は重要ではないかのように」プログラムできますが、必要に応じてシステムの状態に完全にアクセスできます。 OOPLによって選択された「プログラマーから状態を隠す」オプションは、最も悪い選択です。国家を明らかにし、国家の迷惑を最小限に抑える方法を見つけようとする代わりに、彼らはそれを隠します。 これはどういう意味ですか?私は、ほとんどの場合OOPの低レベルまたは手順の経験がほとんどないため、これがおそらく私がこれに慣れていないことを説明しています。そして、より現代的な観点から、オブジェクト指向のヒステリーのほとんどが渡されたので(少なくとも私が知る限り)、あなたはあなたはその通過がどれほど正確/関連していると思いますか? ご協力いただきありがとうございます。

8
変数はどのように状態を導入しますか?
「C ++ Coding Standards」を読んでいて、この行がありました: 変数は状態を導入するため、可能な限り短いライフタイムで、できるだけ少ない状態を処理する必要があります。 変異するものは最終的に状態を操作しませんか?できるだけ少ない状態に対処する必要があるとはどういう意味ですか? C ++などの不純な言語では、状態管理は本当にあなたがしていることではありませんか?そして、変数の寿命を制限する以外に、できるだけ少ない状態に対処する他の方法は何ですか?

1
関数型言語のUIパターン
ClojureScriptをいじり始めたいのですが、いくつかの点に困惑しています。私の問題は、機能的に作業しようとするときに、ユーザーの対話から生じる状態の変化に対処するための良い方法です。 いくつか例を挙げましょう。ブラウザーで実行されるアプリケーションを念頭に置いていますが、問題はより一般的だと思います。もちろん、何かが変化します-少なくともDOMです。しかし、不変のデータ構造で動作するように残りのコードを整理する方法を見つけたいと思います。 1)イベントをDOMオブジェクトに添付したいとします。これは主に機能的な方法で行うのは難しくありません。ノードを作成するときに、さまざまなイベントハンドラーでハッシュマップをアタッチします。ただし、イベントの委任を使用している場合を考えてください。次に、新しいノードを作成するときに、おそらく既に存在する親ノードにイベントハンドラーをアタッチできます。そのため、既存のノードに関連付けられているハッシュを変更する必要があります。 2)入力フィールド用のオートコンプリートモジュールを設計しているとします。ユーザーがキーを押すたびに、提案を得るためにサーバーを呼び出すことができます。これは簡単です。しかし、今それを少し最適化したいと思います。一致するすべての結果fooがわかっている場合は、一致するすべての結果を再度要求しても意味がありませんfoobar。前者をフィルタリングできます。そのため、何らかのキャッシュを作成する必要があります。このキャッシュは、ユーザーが以前に入力した単語のスーパーセットではない新しい単語を挿入するたびに更新されます。繰り返しますが、キャッシュをどのようにモデル化するのですか?最も合理的な方法は、単語を結果にマッピングするハッシュマップのようですが、変更可能である必要があります。 ユーザーの操作による変更を機能設計に組み込むのを容易にするいくつかのパターンを提案できますか?

2
ステートフルアプリと非ステートフルアプリ[終了]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 昨年休業。 ステートフルアプリと非ステートフルアプリについて学習してきましたが、このトピックについてはまだ少し混乱しています。 たとえば、ユーザーがsocket.io経由で接続するとすぐにランダムルームに割り当てられるNodeで実行しているアプリがあるとします。これらは4の部屋であり、永続的なものではありませんが、ハッシュマップとしてグローバル変数に格納されます。私はdb(クエリが多すぎる)やredis(高すぎる)を使用していません。 これはステートフルアプリの例ですか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.