問題タブ [side-effects]
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.
functional-programming - 宣言型 I/O に対するこのアプローチの問題点があるとすれば、それは何か
これが「プログラム言語設計」ではなく「プログラミング」にどの程度当てはまるかは正確にはわかりません。しかし、問題はこれです:
簡単にするために、2 つの「特別な」リスト/配列/ベクトル/単に「ポート」と呼んでいるものは何でも、1 つは呼び出されstdIn
、もう1 つはstdOut
. これらはそれぞれ概念的に表します
- プログラムの実行中にプログラムに与えられたすべてのユーザー入力
- プログラムの実行中に端末に書き込まれたすべての出力
Haskell にインスパイアされた疑似コードでは、この完全に宣言的なプログラムを作成できるはずです。
どちらが期待どおりで、2 つの番号を要求し、製品を印刷します。トリックは、stdOut がプログラムの完了時に端末に書き込まれた文字列のリストを表し、stdIn が入力文字列のリストを表すことです。タイプエラーと、新しい行が入力された後に次の行のみを印刷するための安全策が必要であるという事実は、簡単にするためにここでは残しておきますが、おそらくそれを解決するのは簡単です.
では、このアイデアを実装する前に、私が見落としていた落とし穴はありますか? 私は似たような構造がすでに存在していることを認識していないので、私が見落としていた明らかな落とし穴があることを考慮しないのはナイーブです.
そうでなければ、私はもちろんそれを知っています:
これらの結果を上記と同様の方法で織り合わせる必要がある場合は、エラーになります。
unit-testing - 副作用に対して単体テストを行う方法はありますか?
どのコードも副作用をもたらす可能性があります。ほとんどの場合、副作用は設計が悪いことやリファクタリングが必要であることを示している可能性がありますが、単体テストを行うときは、それに対してテストするのが難しいと感じています。次の例を検討してください。
次の拡張機能をテストします。
テストはパスしますが、副作用に対するガードはありません。への呼び出しの効果は、PokeAround
まったく見過ごされます。
何が何であるかわからない場合、それは何でもかまいませんPokeAround
! - それを防ぐテストをどのように書くのですか? それはまったく可能ですか?
明確化:PokeAround
テストを作成する時点でソースがあるため、完全に不明である可能性が非常に低いシナリオ
について、いくつかのコメントがありました。しかし、私がこの質問をした理由は、後で追加される副作用を防ぐ方法を見つけるためでした. つまり、テストを書くとき、拡張メソッドは次のようになります。
テストに合格しました。すべて問題ありません。それから 1 か月後、私が休暇を取っているときに、同僚からPokeAround
電話がかかってきました。彼がやったので、私はすでに書いたテストが失敗することを望んでいます。
views - CouchApp と CouchDB を使用してバナー広告をローテーションするにはどうすればよいですか?
コンテキスト: これは HTML アプリであり、ブラウザー側の JavaScript はほとんどまたはまったくありません。簡単に変更できないので、サーバーでこれを行う必要があります。
CouchDB は、副作用がないように構築されています。これで十分です。しかし、ショー、ビュー、リストを使用して、後続のリクエストでユーザーに表示されるものを変更したり、データを書き込まずにユーザーオブジェクトに基づいて変更したりする方法はないようです。
また、ドキュメントの取得リクエストによって新しいレコードが作成される可能性はありますか? それは副作用ではないのではないかと思います。
しかし、可能であれば、ログを作成してから、以前の広告が表示されたときのログの変更によって影響を受ける広告を説明する一連のドキュメントから広告会社を選択するビューを作成することもできます。
実際に自分のサイトに広告を表示するつもりはありません。ヒント、記事の要約、およびページの読み込みごとに異なるマイナーな機能を紹介します。
任意の提案をいただければ幸いです。
必要な残りの機能のために穀物を操作する方法について頭を悩ませましたが、これはcouchdbの動作方法とは少し反対のようです。
unit-testing - 副作用のある単体テスト機能?
適切な URL でページに到達したかどうかを確認する関数を作成しているとします。ページには「正規の」スタブがあります。たとえば、ページは stackoverflow.com/questions/123 でアクセスできますが、(SEO の理由から) stackoverflow.com/questions/123/how-do にリダイレクトすることをお勧めします。 -i-move-the-turtle-in-logo - 実際のリダイレクトは独自のメソッド (redirectPage($url) など) に安全に含まれていますが、それを呼び出す関数を適切にテストするにはどうすればよいでしょうか?
たとえば、次の関数を使用します。
checkStub() 関数の単体テストを行う場合、リダイレクトが邪魔になりませんか?
これは、特定の関数が大きくなりすぎて、単体テストの領域を離れて統合テストの世界に入るように見える、より大きな問題の一部です。私の頭の中では、ルーターとコントローラーがこの種の問題を抱えているとすぐに思います。それらをテストすると、それら自体の機能だけに限定されるのではなく、必然的にページの生成につながるからです。
単体テストで失敗するだけですか?
.net - Rx:ObservablesはIEnumerableのように「繰り返し可能」ですか?そうでない場合、このコードはどのように機能しますか?
昨日、Wes DyerがReactiveExtensions(Rx)を使用してドラッグ'n'ドロップを実装する方法を示す、最初のRxアプリケーションの作成(チャネル9)のスクリーンキャストを見ました。私がまだ理解していないこと:
スクリーンキャストの終わりに向かって、WesDyerは次のように入力します。
簡単に言うとq
、マウスの移動座標デルタをサブスクライバーにプッシュするオブザーバブルです。
私が理解していないのは、どうすればうまくいくのかということですmm.Zip(mm.Skip(1), ...)
!?
私の知る限り、IObservable
そういう意味でIEnumerable
は列挙できません。の「プル」の性質のおかげでIEnumerable
、それは何度も何度も繰り返すことができ、常に同じアイテムを生み出します。(少なくとも、これはすべての正常に動作する列挙型に当てはまるはずIObservable
です。)動作は異なります。アイテムは一度サブスクライバーにプッシュされ、それだけです。上記の例では、マウスの動きは単一のインシデントであり、メモリに記録されていないと繰り返すことができません。
では、彼らが取り組んでいるマウスイベントは単一の再現不可能なインシデントであるため、との組み合わせはどのように機能する.Zip
可能性がありますか?この操作では、それを独立して2回「確認」.Skip(1)
する必要はありませんか?mm
参考までに、次のメソッドシグネチャを使用しObservable.Zip
ます。
PS:オペレーターには、非常に洞察に満ちた別のスクリーンキャストZip
があるのを見ました。
c++ - コンストラクターの外部副作用
このコードを見てください:
保存される場所を推測してみてくださいobject
... はい、あなたはそれを推測しました。これは魔法すぎると思います。 のようなものを書きたいobject.Save(file)
のですが、必須ではありません。明らかに、コンストラクターframework_i_hate.h
中に変更されるグローバル変数が内部にあります。file
コンストラクター内のこの副作用についてどう思いますか?
この動作をどのように隠すことができますか?
フレームワークを推測する人へのボーナス。
haskell - 呼び出し元には純粋に見えるが、内部的にミューテーションを使用する関数
Expert F#2.0のコピーを入手したところ、次のステートメントに出くわしました。
たとえば、必要に応じて、アルゴリズムの開始時に割り当てられたプライベートデータ構造に副作用を使用し、結果を返す前にこれらのデータ構造を破棄できます。その場合、全体的な結果は事実上副作用のない機能になります。F#ライブラリからの分離の一例は、ライブラリのList.mapの実装です。これは、内部でミューテーションを使用します。書き込みは、他のコードがアクセスできない内部の分離されたデータ構造で行われます。
さて、明らかにこのアプローチの利点はパフォーマンスです。不利な点があるかどうかだけ知りたいのですが、副作用を伴う可能性のある落とし穴はここに当てはまりますか?並列処理は影響を受けますか?
言い換えれば、パフォーマンスが確保されている場合List.map
、純粋な方法で実装することが望ましいでしょうか?
(明らかにこれは特にF#を扱っていますが、私は一般的な哲学にも興味があります)
c++ - シーケンスされていない値の計算(別名シーケンスポイント)
このトピックをもう一度開いて申し訳ありませんが、このトピック自体について考えると、未定義動作が発生し始めました。明確に定義された動作のゾーンに移動したい。
与えられた
上記の表現を(この順序で)次のように考えます
ここでの動作については、 C++0xからの重要な引用です。
$ 1.9 / 12-「式(または部分式)の評価には、一般に、値の計算(左辺値評価のためのオブジェクトのIDの決定と、右辺値評価のためにオブジェクトに以前に割り当てられた値のフェッチを含む)と副作用の開始の両方が含まれます。 。」
$ 1.9 / 15-「スカラーオブジェクトの副作用が、同じスカラーオブジェクトの別の副作用、または同じスカラーオブジェクトの値を使用した値の計算に比べて順序付けされていない場合、動作は定義されていません。」
[注:異なる引数式に関連する値の計算と副作用は順序付けられていません。—エンドノート]
$ 3.9 / 9-「算術型(3.9.1)、列挙型、ポインター型、メンバー型へのポインター(3.9.2)、std :: nullptr_t、およびこれらの型のcv修飾バージョン(3.9.3)はまとめて呼び出されますスカラー型。」
Expr1では、式
i
(最初の引数)の評価は、式(副作用があります)の評価に関して順序付けられていませんoperator++(i)
。したがって、Expr1の動作は未定義です。
Expr2では、式
i
(最初の引数)の評価は、operator++(i, 0)
(副作用がある)式の評価に関して順序付けられていません。したがって、Expr2の動作は未定義です。
Expr3では、 outerが呼び出される
operator++(i)
前に、lone引数の評価を完了する必要があります。operator++
したがって、Expr3の動作は明確に定義されています。
Expr4では、式
i
(最初の引数)の評価は、operator[](operator++(i, 0)
(副作用があります)の評価に関して順序付けられていません。したがって、Expr4の動作は未定義です。
この理解は正しいですか?
PSOPのように式を分析する方法が正しくありません。これは、@ Potatoswatterのように、次のように述べているためです。「13.6節は適用されません。13.6/ 1の免責事項を参照してください。」これらの候補関数は、13.3.1.2で説明されている演算子のオーバーロード解決プロセスに参加し、他の目的には使用されません。 「これらは単なるダミーの宣言です。組み込み演算子に関しては、関数呼び出しのセマンティクスは存在しません。」
python - グローバルを変更してもエラーが発生しないのはなぜですか?
なぜPythonは関数内のグローバル宣言されたリストを変更できないのですか?
再更新
同じ名前の変数に割り当てを行うと、追加された行ではなく、その行の前のアクションがエラーになります(バイトコードコンパイラがそれを見つけたと思います)。