問題タブ [program-flow]
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.
javascript - javascriptイベント処理はプログラムフローの内部または外部で発生しますか?
この質問はJavascriptイベント処理とフロー制御に関連していますが、それは一歩先を進んでいます。未解決のままの質問は、イベントが発生して制御がブラウザーに戻されたときに、ブラウザーが他のイベントを最初に処理することを決定できるか(他のスクリプトまたはユーザーアクションによって発生する)(A)、または常に私のイベントを直接処理するかどうかです。 (B)?
(B)の場合、イベントの発生とイベントハンドラーの間で何も変更されていないという事実に頼ることができますが、(A)は何も保証しないため、この質問は重要です。
私の最初の推測は(B)ですが、stopPropagation()とpreventDefault()は他にどのように機能しますか?しかし、考え直してみると、それは確かな証拠ではありません。
この問題の実際の例。リッチテキストエディター(ハロー)を変更していますが、次の仕様が必要です。
- 編集可能なテキスト(#txt)をクリックするとエディターがアクティブになり、#txtの外側をクリックすると非アクティブになります。halloは、これを実現するために#txtでぼかしイベントとフォーカスイベントを使用します。
- エディターをアクティブ化するとツールバーが開きます。ツールバーをマウスダウンすると(ボタンではなく)、#txtのblurイベントがエディターを非アクティブ化するのを防ぐフラグが設定されます。ツールバーはフォーカスを#textに戻します。
- ツールバーボタンをマウスダウンすると、エディターが非アクティブ化されなくなりますが、最初にクリックイベントまで待機し、アクションを実行してから、フォーカスを#txtに戻す必要があります。一部のアクションは即時(太字または斜体)ですが、他のアクションは追加のユーザー入力(ドロップダウンからの選択)が必要です。
- これらのボタンのいくつかはダイアログを開きます。
- ...そして、これらすべての要素(エディター、ツールバー、ダイアログ)をモジュール化して、簡単に拡張できるようにしたいです。
これで、ほとんどの場合、ダイアログを閉じるときに、フォーカスを#txtに戻す必要があります。ただし、ダイアログを開いてページ上の別の場所をクリックすると、エディターが閉じてツールバーが呼び出され、ダイアログも含まれます。この場合、ダイアログがフォーカスをエディターに戻すと、エディターが再度アクティブになります。
私が今理解している限り、イベント処理の順序は少なくとも決定論的です。一部のイベントが遅延し、他のイベントがより早く処理されることはありません。これが「同期」の意味です。例外はもちろん、ファイルのロードなどのイベントです。
プログラムコンポーネント、たとえばダイアログの観点からは、状況はまったく予測できない可能性があります。ハンドラーをopenイベントにバインドしてから、dialog( "open")を呼び出すことができますが、エディターが同じイベントにイベントハンドラーを持っているという理由だけで、呼び出しとハンドラーの間で何かが発生する可能性があります。
したがって、私の結論は、1)はい、予測可能ですが、2)これを実装するには高度なアーキテクチャが必要です。
java - リスナーと検証/再描画
だから私はこの問題を抱えています。ファイルを作成してロードするプログラムがあります。
プログラムにファイルをロードするとき、特定のコンポーネントがいつ「いっぱい」になるかを通知するコンポーネント リスナーに依存し、それに従ってすべてのコンポーネントを移動します。
各コンポーネントを一番上に追加し、親コンポーネントが「いっぱい」になったときにリスナーを登録し、一番下のコンポーネントをそれが作成する新しい親に移動します。これは、100 ページの MSWord 文書の先頭に新しいテキスト行を追加するものと考えてください。
そのリスナーは GUI の設定にも依存しています。メモリ内のすべてが画面に描画されていない場合、間違ったコンポーネントの高さ (通常は 0) を取得し、それらを計算に使用すると、結果が間違ってしまい、すべてが台無しになります。
これが私のプログラムのその部分のフローチャートです:
(すべての処理は JFrame の JPanel で行われます)
これが再描画/検証される理由は、addComponent メソッドと同様に、リスナーに他の関数があり、再描画/検証のための唯一の (最適な) 場所である他の場所で呼び出されるためです。
問題は、JFrame が操作メソッドでの最後の (最終) 検証/再描画呼び出しまで再描画されないことです。これを証明するために、(検証/再描画の後) コードのいくつかの場所に Thread.sleep(1000) を追加しようとしました。
また、私の知る限り、コンポーネントリスナーがトリガーされると、それをトリガーした行で停止し、それ自体を実行してから、その行から続行しますよね?
これを修正するにはどうすればよいですか? 新しいコンポーネントが追加されるたびにプログラムを再描画/検証するように強制するにはどうすればよいですか?
最初の 2 つのコメントへの返信: まず、Thread.sleep(1000) は問題を診断するためのものでした。Thread.sleep(1000) メソッドが repaint/validate メソッドであった直前に、reapint() が呼び出された直後にプログラムを一時停止すると、一時停止するたびに GUI が再描画され、新しい要素が追加されたことがわかりますが、そうではありませんでした。ケース。
第二に、長い計算に関しては、それらの計算はそれほど長くはありません (20 個のコンポーネントでこれを実行すると、望ましい結果ではありませんが、一時的な結果が得られます)。また、その計算では、GUI からコンポーネントを頻繁に (10 ~ 20 行ごとに) 削除および追加する必要があるため、その中に SwingWorker を組み込むことはほとんど不可能であり、必要ありません。
第三に、あなたは全体の要点を逃したと思います。実行の長さはここでは本当の問題ではなく、GUI がフリーズすることもありません (これは実際には発生しませんが、とにかく目立つほど長くはありません)。問題は、repaint/validate がループ内でコンポーネントごとに合計 3 ~ 4 回 (20 個のコンポーネントを含むファイルを開くと約 60 ~ 80 回) 呼び出されたことです。最後に呼び出されたとき、ループの後...
再描画/検証の直前と直後に System.out.println("something") メソッドを配置しました。「何か」を2回出力しましたが、再描画/検証は行われませんでした。
gcc - NCC(nccgen/nccnav)の使い方は?
NCC というツールの使用方法を理解したい: http://students.ceid.upatras.gr/~sxanth/ncc/
その目的は、cflow/cscope と同様に、プログラム コール グラフと内部シンボルの依存関係を詳述することです。しかし、私はそれを機能させることができません。
tcpdump プロジェクトの git リポジトリのクローンを作成し、MakefileCC
を編集してnccgen -ncgcc -ncld -ncfabs
、CC = gcc
出力は次のとおりです。
make[1]: Entering directory `/home/rostamn739/Software/tcpdump'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/home/rostamn739/Software/tcpdump'
.nccout
ファイルは作成されていません
python - Python 変換計算機ループ / コード効率
以下は、学習演習として Python 2.7 で作成した単純なミルから度への変換計算機の (半) 完成版です。私はPythonが初めてで、まだ問題を解決しています。前提は、ユーザーがミルを度に、またはその逆に変換することを選択することです。ユーザーが選択した単位の方位角を入力すると、それが別の単位に変換されます。ユーザーが無効なメニュー オプションを選択すると、その旨が通知されます。範囲外の方位角 (度の場合は 1 ~ 360、ミルの場合は 1 ~ 6400) に入ると、通知され、最初からやり直す必要があります。問題は、ユーザーが無効な方位角 (たとえば 365 度) を入力すると、メニューに戻されることです。if/else ループで前のステップに戻る方法はありますか?フォーラムとドキュメントを検索しましたが、できないようです。また、私は Python を初めて使用するので、このコードをより効率的にするにはどうすればよいですか? 関数定義にifステートメントとelifステートメントを含める必要がありますか? または、エラーや冗長な出力を作成せずにそれらを組み合わせることができますか? 私はそうすることに成功していません。すべてのご意見を歓迎します。
function - if-else / switch-case ステートメントなしでプログラム フローを制御する
次のように定義された1000個の関数があるとしましょう
整数 n (n < 1000) を取り、必要に応じて n 番目のダミー関数 (10 の場合は、dummy10) を正確に n 個の引数 (引数は任意の整数にすることができます。0 としましょう) で呼び出す関数を作成します。これは、妥当ではない1000ケースのswitch caseステートメントを書くことで達成できることを私は知っています。
私の意見では、これは実行時に再コンパイルしないと実現できないため、Java、c、c++ などの言語ではそのようなことは決して起こりません。
うまくいけば、これを行う方法があります。もしそうなら、私は興味があります。
注: これは私が使用するものではありません。好奇心から質問しました。
python - 条件付きスクリプトの終了と制御の委任
終了するスクリプトの制御をプロセスのどこに置くべきか疑問に思っていますか?
スクリプトを続行するかどうかを決定するために関数が使用されている場合、結果に基づいて、呼び出し元または呼び出し先で制御する必要がありますか?
いずれかになる可能性のあるシナリオはありますか?
(この質問にはより広い意味があると確信しているので、プログラミングのより高いレベルの実践に答えを自由に拡張してください。それは実際には素晴らしいことです)
条件付きスクリプトの終了のオプションと、制御を委任するかどうかのオプションとして検討するいくつかの例を以下にリストします。
should_continue
提供された引数が有効であり、スクリプトを続行するにはその有効性が必要であることを確認していると想像してください。それ以外の場合は終了します。
c# - 例外を使用してプログラム フローを制御する
例を挙げましょう。AJAX 呼び出しに使用する aspx.cs ファイル内に次の Web メソッドがあります。
メソッドはQuizHelper.GetNextQuestion
データベースから新しい質問を生成し、特定のケースでは次の例外をスローします。
QuizNotFoundException
:指定されたクイズがquizGuid
データベースにない場合。QuizInvalidException
: セキュリティ目的でスローされます。たとえば、誰かが HTTP リクエストをハッキングしようとした場合などです。QuizOverException
: すべてのクイズには 10 の質問があり、ユーザーがQuizHelper.GetNextQuestion
メソッドを使用して 11 番目の質問を取得しようとすると、この例外がスローされます。QuestionTimedOutException
: 制限時間内に質問に答えなければなりません。そうしないと、この例外がスローされます。Exception
: 他のすべての例外は、UX の目的で、エラーが発生したことをユーザーに通知するという唯一の目的で、この下にグループ化されています。
次に、Javascript ファイル内でResponseMessage.Status
がチェックされ、対応するアクションが実行されます。
このコードで使用されている例外を使用してフローを制御するのは悪いことですが、このようにする方がより直感的で、はるかに簡単です。部外者にとってコードが理解しやすいという事実は言うまでもありません。
このコードをどのようにして例外なく「正しい方法」で書き直すことができるかはわかりませんが、同時にその単純さを維持できます。
何か不足していますか、アイデアはありますか?
更新: Enum を使用して操作のステータスを返すことを提案する回答もありますが、多くの操作があり、すべてが異なるシナリオになる可能性があります (つまり、すべての操作に同じ Enum を使用することはできません)。この場合、操作ごとに 1 つの Enum を作成することは、正しい方法ではないと感じられます。このモデルの改善点はありますか?
java - これはショートサーキットの例でしょうか?
ユーザーに int を入力するように依頼し、そのインデックスの配列をチェックして null でないかどうかを確認する前に、配列のインデックスの範囲内にあるかどうかを確認する必要がある場合、それは「短絡」の例でしょうか? 配列サイズが 5 しかなく、ユーザーが 15 を入力した場合、ArrayIndexOutOfBoundsException が発生するためです。しかし、数値入力が 0 ~ 4 を含むかどうかを最初に確認し、最後に配列インデックスを確認すると、0 ~ 4 を含むことが保証されます。私の質問は次のとおりです。これは「短絡」の例ですか? コードで言っていることを言い換えます...
c# - コードの先頭に戻るにはどうすればよいですか?
ボタンをクリックすると、作成したこのクラスを使用するため、要件を満たしていない場合はメッセージボックスが表示されますが、元に戻らないようにボタンを押し続けます。
たとえば、これらのメッセージ ボックスの 1 つが表示されたら、プログラムを元に戻したいとします。これで、クリックしたボタンを通過するだけです。
ボタン: