問題タブ [design-rationale]

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.

0 投票する
7 に答える
2940 参照

c# - C#(または .NET) で静的/共有メソッドをインターフェイス内に配置できないのはなぜですか?

C#(または .NET) で静的/共有メソッドをインターフェイス内に配置できないのはなぜですか?

ここから重複しているようです。しかし、私の考えは少し異なります。プラグイン(インターフェース)のヘルパーを置きたいだけです

C# は少なくともこのアイデアを許可すべきではないでしょうか?

0 投票する
13 に答える
17556 参照

c++ - キーが存在しない場合、std::map operator[] がオブジェクトを作成するのはなぜですか?

私はすでにこの質問をどこかで見たと確信しています(comp.lang.c ++?Googleもそこで見つけられないようです)が、ここで簡単に検索しても見つからないようなので、ここにあります:

キーが存在しない場合、std::map operator[] がオブジェクトを作成するのはなぜですか? わかりませんが、他のほとんどの operator[] (std::vector など) と比較すると、これは直感に反するように思えます。使用する場合は、インデックスが存在することを確認する必要があります。std::map でこの動作を実装する理由は何だろうと思っています。私が言ったように、ベクトルのインデックスのように振る舞い、無効なキーでアクセスしたときにクラッシュする方が直感的ではないでしょうか (未定義の動作だと思います)。

答えを見た後に質問を絞り込む:

わかりましたこれまでのところ、基本的に安いので、なぜそうしないのか、または同様のことを言う多くの回答を得ました. 私はそれに完全に同意しますが、そのために専用の関数を使用しないのはなぜですか(Javaにはoperator []がなく、関数はputと呼ばれるとコメントの1つが言ったと思います)?私のポイントは、なぜ map operator[] がベクトルのように機能しないのですか? ベクトルの範囲外のインデックスで operator[] を使用すると、たとえ安価であっても要素を挿入したくありません。これは、おそらくコードのエラーを意味するためです。私のポイントは、なぜそれがマップと同じではないのかということです。つまり、私にとって、マップで operator[] を使用することは、このキーが既に存在することを知っていることを意味します (何らかの理由で、挿入しただけで、どこかに冗長性があります)。その方が直感的にわかりやすいと思います。

そうは言っても、現在の動作を operator[] で実行する利点は何ですか? 多分それはそのようにより明確なコードを与えるでしょうか?知らない。

別の答えは、それはすでにそのように存在していたので、なぜそれを保持しないのですか? したがって、私の質問は基本的に次のとおりです。なぜそのように実装することを選択するのか、つまり、他の演算子[]との一貫性がやや欠けていることを意味します。どのようなメリットがありますか?

ありがとう

0 投票する
3 に答える
33483 参照

delphi - Delphi: Application.Handle とは何ですか?

とはTApplication.Handle?

  • それはどこから来たのですか?
  • なぜそれが存在するのですか?
  • そして最も重要なのは、なぜすべてのフォームがそれを親ウィンドウ ハンドルとして持っているのでしょうか?

Delphi のヘルプには次のように書かれています。

TApplication.ハンドル

アプリケーションのメイン フォーム (ウィンドウ) のウィンドウ ハンドルへのアクセスを提供します。

説明

親ウィンドウ ハンドルを必要とする Windows API 関数を呼び出す場合は、Handle を使用します。たとえば、独自のトップレベルのポップアップ ウィンドウを表示する DLL には、アプリケーションでウィンドウを表示するための親ウィンドウが必要です。Handle プロパティを使用すると、そのようなウィンドウがアプリケーションの一部になるため、アプリケーションで最小化、復元、有効化、および無効化できます。

「アプリケーションのメイン フォームのウィンドウ ハンドル」という言葉に注目し、それをアプリケーションのメイン フォームのウィンドウ ハンドルと解釈すると、次のように比較できます。

  • 「アプリケーションのメイン フォームのウィンドウ ハンドル」、
  • MainFormのウィンドウハンドルApplication

しかし、それらは同じではありません:

だから何Application.Handleですか?

  • それはどこから来たのですか?
  • どの Windows® ウィンドウ ハンドルですか?
  • の Windows® ウィンドウ ハンドルである場合、一致しないApplicationMainFormはなぜですか?
  • のウィンドウ ハンドルでない場合、それは何ですか?ApplicationMainForm
  • さらに重要なのは、なぜそれがすべてのフォームの最終的な親所有者なのかということです。
  • そして最も重要なのは、フォームを親から外して所有しないようにしようとしたり (タスクバーに表示できるようにするため)、または IProgressDialog のようなものを使用しようとすると、すべてがうまくいかないなぜですか?

本当に私が求めているのは、Application.Handleを存在させる設計上の根拠は何ですか? その理由を理解できれば、その方法が明らかになるはずです。


20 の質問のゲームを通して理解を更新します。

所有者を作成することによってウィンドウをタスクバーに表示する解決策について話す際にnullPeter Below は 2000 年に次のように述べています。

これにより、セカンダリ フォームから表示されるモーダル フォームで問題が発生する可能性があります。

モーダル フォームが起動しているときにユーザーがアプリから切り替えて、それを表示していたフォームに戻ると、モーダル フォームがフォームの下に隠れる場合があります。モーダルフォームが親であることを確認することで、これに対処することができます [sic; 彼はそれを示したフォームに所有することを意味しました( params.WndParent上記のように使用)

Dialogsしかし、これはunit およびexceptionからの標準ダイアログでは不可能であり、それらを正しく機能させるにはより多くの努力が必要です (基本的に、 を処理し、 Application viaApplication.OnActivateを親とするモーダル フォームを検索し 、それらを Z オーダーの最上位に移動する via ) 。 .GetLastActivePopupSetWindowPos

  • モーダル フォームが他のフォームの後ろに隠れてしまうのはなぜですか?
  • 通常、モーダル フォームを前面に表示するメカニズムは何ですか?ここでは機能しないのはなぜですか?
  • Windows® は、ウィンドウを積み重ねて表示する役割を果たします。Windows® が正しいウィンドウを表示しないのはなぜですか?

彼はまた、ウィンドウを強制的にタスク バーに表示する新しい Windows 拡張スタイルを使用することについても話しました (ウィンドウを非所有にする通常のルールが不十分、非現実的、または望ましくない場合)、WS_EX_APPWINDOW拡張スタイルを追加することによって:

しかし、彼は次のように警告します。

別のアプリがアクティブなときにセカンダリ フォーム タスクバー ボタンをクリックすると、すべてのアプリケーション フォームが前面に表示されます。したくない場合はオプションがあります

フォームの所有者がまだApplication.Handle. アプリケーションはこれを行っていますか? なぜこれを行うのですか?こうするより、こうすべきではないこれを行わないことの欠点は何ですか。これを行うことのマイナス面がわかりました(システム メニューが正しく機能しない、タスクバー ボタンのサムネイルが不正確である、Windows® シェルがウィンドウを最小化できないなど)。


を扱った別の投稿でApplicationMike Edenfield は、親ウィンドウが他のウィンドウの最小化、最大化、および復元メッセージを送信すると述べています

これにより、フォームにタスクバー ボタンが追加されますが、他にも処理すべき細かい点がいくつかあります。最も明白なのは、フォームが親フォーム (アプリケーションのメイン フォーム) に送信される最小化/最大化を引き続き受信することです。これを回避するには、次のような行を追加して WM_SYSCOMMAND のメッセージ ハンドラーをインストールします。

このハンドラは、最小化メッセージを渡さないように、アプリケーションの残りの > 部分とは独立して動作させたいもののPARENT形式になることに注意してください。> SC_MAXIMIZE、SC_RESTORE などに同様のコードを追加できます。

Windows® ウィンドウの最小化/最大化/復元メッセージがウィンドウに表示されないのはなぜですか? これは、ウィンドウ宛てのメッセージが Windows® によってウィンドウの所有者に送信されるためでしょうか? この場合、Delphi アプリケーションのすべてのフォームはApplication?によって「所有」されています。それは所有者をnullにするという意味ではありませんか:

ウィンドウ ハンドルが削除され、フォームに干渉しなくなりますApplication。Windows はもう一度、最小化/最大化/復元メッセージを送信する必要がありますか?


おそらく、「通常の」Windows アプリケーションが実行することと、Borland が最初に Delphi アプリケーションを実行するように設計した方法を比較対照すると、このApplicationオブジェクトとメイン ループに関してです。

  • Applicationオブジェクトはどのソリューションを解決していましたか?
  • これらの同じ問題が存在しないようにするために、Delphi の新しいバージョンではどのような変更が加えられましたか?
  • それ以降のバージョンの Delphi での変更は、最初のアプリケーション設計が解決しようと懸命に試みた他の問題を引き起こしませんでしたか?
  • これらの新しいアプリケーションは、アプリケーションがそれらに干渉することなく、どのように機能し続けることができるでしょうか?

明らかに、Borland は初期設計の欠陥に気付きました。彼らの最初の設計は何でしたか、どのような問題を解決しましたか、どのような欠陥がありましたか、どのような再設計が行われたか、どのように問題を解決しましたか?

0 投票する
4 に答える
5898 参照

c++ - 標準ライブラリに find と find_if があるのはなぜですか?

find_ifの過負荷になることはできませんfindか?それが方法std::binary_searchであり、友人はそれを行います...

0 投票する
2 に答える
4211 参照

c++ - ネストされたテンプレートパラメータを使用することは、型以外の引数で部分的に特殊化することが許可されていないのはなぜですか

私はこのコードを持っています

つまり、でN割り切れる数値5の場合、コンパイラは部分的な特殊化を使用する必要があります。ただし、コンパイラはその部分的な特殊化を受け入れません。これは、標準では、部分的な特殊化の非型引数がパラメータを参照し、単なるパラメータではない(たとえば、A<N, N>有効である)コードを拒否することを要求しているためです。しかし、そうする理由は何ですか?

コードをもっとわかりやすい例に変更するだけで、有効であることに注意してください。

型以外のパラメータではなくなったため、これで問題ありません。しかし、仕様がより単純な部分的特殊化を禁止している理由は何ですか?

0 投票する
3 に答える
382 参照

c++ - std::setを使用しない理由::消去はconst_iteratorを取りますか?

ISO 14882 2003(別名C ++の聖なる標準)によると、パラメータとして(ではなく)std::set<K, C, A>::eraseを使用しているようです。iteratorconst_iterator

23.3.3から[2]

void erase(iterator position);

また、VS2008に付属しているSTLの実装では、const_iterator別のコンパイラでコードをコンパイルしようとすると、消去に時間がかかり、不快な驚きが生じたことも注目に値します。さて、私のバージョンはをとるので、(それが自明ではなかったかのように)const_iterator消去を実装することが可能です。const_iterator

標準化委員会は、を取得するために消去を必要とするいくつかの実装(または手元にある既存の実装)を念頭に置いていたと思いますiterator

  • これが事実であることに同意する場合、削除される予定の要素を変更する必要がある実装について説明してくださいset::erase(私はできません)。
  • 同意できない場合は、なぜ彼らがこの決定を思い付くのか教えてください。つまり、要素を消去することは、ポインタを再配置することです。

編集

イテレータの場合でも、セット内の要素を変更できないことに気づきました。しかし、疑問はまだ残っています-特に、ある意味で同等である場合は、const_iteratorを使用しないのはなぜですか?

0 投票する
2 に答える
271 参照

compiler-construction - モジュールがファイルで明示的に指定されているのはなぜですか?

D言語リファレンスから:

モジュールは、ソースファイルと1対1で対応しています。モジュール名は、パスと拡張子が削除されたファイル名です。

ただし、モジュール名は引き続きファイルで明示的に指定されます。

これのポイントは何ですか?モジュールがファイルに対応している場合、コンパイラがファイル名からそれらが何と呼ばれているのかを推測できないのはなぜですか?

0 投票する
3 に答える
333 参照

operator-overloading - opAssign がクラスに対してオーバーロードできないのはなぜですか?

この表は、割り当てのオーバーロードはクラスではなく構造体に対してのみ可能であることを示しています。これは私を驚かせます。A = B無害の構文糖ではありませんか? 構造体に制限する設計上の根拠は何ですか?

0 投票する
4 に答える
81 参照

java - オーバーライドされたメソッドでパラメーターの型を緩めることができないのはなぜですか?

このコードは無効です:

everyStringは明らかに であるためObject、このコードは完全に問題ないと思いますfoo()String実際foo()Object.

ただし、メソッド シグネチャは、オーバーライドするメソッドのシグネチャと同一でなければならないようです。なんで?

0 投票する
2 に答える
1792 参照

c++ - operator[] が char& を返すのに、data() と c_str() が char const* を返すのはなぜですか?

変更可能な文字への参照を返すのに、 const charへのポインターを返すstd::string::dataのはなぜですか?std::string::c_str()std::string::operator[]

なぜ返さないstd::string::data()のですか、またはなぜ返さないのですか?std::string::c_str()char*std::string::operator[]char const&

この背後にある理論的根拠は何ですか?