問題タブ [design-decisions]
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.
c# - System.Drawing Rectangle、Point、Sizeなどがクラスではなく可変構造体であるのはなぜですか?
Microsoftがこれらの構造体を作成することを決定した理由はありますか?
3つすべてが変更可能です。それらが不変であるか、参照型である場合、それらははるかに扱いやすいと思います。
それらが構造体でなければならない理由がある場合、なぜそれらは可変ですか?
java - クイズ ゲーム - IF ステートメントと考えられる Else If?
私はこれに非常に慣れていないので、誰かが私を助けることができるかどうか疑問に思っていました. 特定の質問に対する回答が得られた後、コードで質問を停止できるようにしたいと考えています。オウムやエミューなどの最初のもので動作するようになりましたが、他のものを追加できないようです. 私が間違っていることを教えてください。
これまでのコードは次のとおりです。
artificial-intelligence - 目標に到達するために必要なステップを決定するために逆方向に作業できるプロローグ プログラムを作成する方法
正確に何を尋ねようとしているのかわかりません。初期状態と最終状態といくつかのルールを簡単に取り、そこに到達するためのパス/選択肢を決定できるコードを作成できるようにしたいと考えています。
たとえば、スタークラフトのようなゲームを考えてみてください。工場を建設するには、兵舎と司令センターがすでに建設されている必要があります。もし何も持っていなくて工場が欲しいなら、「司令センター」→「兵舎」→「工場」と言うかもしれません。それぞれのことには時間とリソースが必要であり、パスで注意して考慮する必要があります。工場を 5 分にしたい場合は、10 分にしたい場合よりも選択肢が少なくなります。
また、エンジンは利用可能なリソースを計算し、それらを効果的に利用できる必要があります。これらの 3 つの建物には、合計で 600 のミネラルが必要になる可能性がありますが、エンジンは、200 になるときにコマンド センターを計画する必要があります (またはコストがかかります)。
これは最終的に、10 海兵 @ 5 分、歩兵の武器のアップグレードは 6:30、30 海兵は 10 分、工場 @ 11 などと同様の要件になります。
では、このようなことをするにはどうすればよいでしょうか。私が最初に考えたのは、何らかの手続き型言語を使用して、すべての決定をゼロから行うことでした。システムと分岐をシミュレートし、さまざまな選択を行うことができました。最終的に、いくつかの選択はすぐに目標を達成することを不可能にします (もし私が 20 の補給所を建設したとしても、その工場を時間通りに作れない可能性があります.)
それでは、関数型言語はこのために設計されたものではないと思いましたか? プロローグを書こうとしましたが、時間や距離の計算などに問題がありました。そして、「計画」を返す最良の方法がわかりません。
私は書くことができると思っていました:
ここで私は混乱します。この関数とクエリを構築して、必要なものに近いものを取得する方法がわかりません。建設中に鉱物が収集される速度や、追加の金で他の可能な経路をどうにかして説明する必要があります. 10 分間に 1 人の海兵隊員だけが必要な場合は、10 分で 1 人の海兵隊員で終了する方法がたくさんあるため、エンジンに多くの計画を生成してもらいたいと思います (あまりにも多くの後にそれをカットするかもしれません。プロローグでそれをどのように行うかわかりません)。 )。
この道を進む方法についてのアドバイス、または他のオプションについてのアドバイスを探しています。ハノイの塔や AI の祖先の例よりも役立つものを見つけることができなかったので、プロローグを使用して実際のことを行う方法を説明するいくつかの優れた記事でさえ素晴らしいでしょう. そして、どうにかしてこれらのルールを便利な方法で設定できる場合、ハノイのすべての塔の例のように標準出力に書き込む以外に、プロローグが思いついた(クエリを解決する方法)「計画」を取得する方法はありますか?それともそれが好ましい方法ですか?
私の他の質問は、私のメイン コードは ruby (および潜在的に他の言語) であり、prolog と通信するためのオプションは、ruby 内から私の prolog プログラムを呼び出すこと、prolog 内から仮想ファイル システムにアクセスすること、またはある種のデータベース構造 (可能性は低い) です。 )。私は SWI-Prolog atm を使用しています。これを Ruby で手続き的に行う方がよいでしょうか、それとも prolog や haskall のような関数型言語でこれを構築する方が、統合に余分な労力をかける価値があるでしょうか?
これが不明確な場合は申し訳ありません。お役に立てれば幸いです。不明確な点については、もう一度言い直します。
sql - コースノート/中サイズのテキストをデジタルで保存する最良の方法 - 必要条件: 効率的、Web 上での表示が容易、柔軟
私は自分の Web サイトを構築しており、そこにコースノートを保存したいと考えています。私のコースノートは現在紙に書かれているので、タイプアップします。各コースを次のような構造の独自の XML ファイルに保存することを考えています。ダッシュはタグを表し、数字は無視します。
私のウェブサイトのアイデアは、ユーザーがコース1のリンクをクリックすると、私のプログラムはXMLがそれを解析してその内容を表示することを見つけます。
これに XML を使用することは良い設計上の決定ですか? それとも、もっとうまくやれるでしょうか?XML が適切な設計上の決定である場合: コースごとに 1 つの XML という現在の設計を維持する必要がありますか?それとも、コース用のフォルダーを作成し、トピックごとに 1 つの XML を使用する必要がありますか? XML 以外に、他にどのようなオプションがありますか?
うまくいけば、これはあまりにも主観的ではありません...
c++ - 唯一の派生クラスが追加の変数を追加しない場合、仮想デストラクタを省略する
(const int) の単なるラッパーであるクラス Literal があります。Literal から継承する 2 番目のクラス PositiveLiteral が必要ですが、その値が正であることをアサートするコンストラクターがあります。
このように、正のリテラルを期待する関数は、単純に PositiveLiteral を引数として取ることができます。そうすれば、明示的なアサーションをコードに入れる必要がなくなります。さらに、それらのアサーションが失敗する場合は、その理由がすぐにわかります。
この 1 つのケースを除いて、Literal から継承することは期待していません。それでも、継承があるため、PositiveLiteral には Literal にはない余分な情報が関連付けられていないため、ばかげているように見える未定義の動作を避けるために、Literal に仮想デストラクタを指定する必要があります。これは、明示的にせずにアサーションを維持する方法にすぎません。
単純なラッパー クラスであるはずの仮想メソッドを必要とせずに、同じタスクを達成する別の方法は何ですか?
c# - 参照型を const として宣言すると便利ですか?
なぜ誰かがするのでしょうか:
Eric Lippert は、機能はデフォルトでは実装されておらず、すべての可能性がテスト、保守などにさらに労力を加えると述べています...参照型の null 値が定数として必要になるのはなぜですか?
ruby - なぜ Array#slice と Array#slice なのか! 振る舞いが違う?
Ruby では、 Array#slice
andがandとArray#slice!
は異なる動作をする理由を理解できませんでした (1 つは新しい配列で結果を返し、もう 1 つは現在のオブジェクトで動作します)。Array#sort
Array#sort!
最初のもの (強打なし)ではsort
、現在の配列の並べ替えられたコピーを返し、現在の配列を並べ替えますsort!
。
slice
、指定された範囲の配列を返し、指定された範囲を現在のオブジェクトからslice!
削除します。
Array#slice!
現在のオブジェクトを指定された範囲の配列にするのではなく、このように動作する理由は何ですか?
例:
出力:
.net - .NET Tuple and Equals のパフォーマンス
これは、今日まで気が付かなかったことです。どうやら、よく使用されるタプル クラス ( など) の .NET 実装により、Tuple<T>
等価ベースの操作が実行されるときに、値の型に対してTuple<T1, T2>
ボクシング ペナルティが発生するようです。
クラスがフレームワークにどのように実装されているかを次に示します (ソースは ILSpy 経由)。
私が見る問題は、2 段階のボックス化とボックス化解除が発生することです。1つはアイテムをどのボックスEquals
で呼び出すか、2 つは非ジェネリック呼び出しで、内部的にアイテムを元のタイプにボックス化解除する必要があります。comparer.Equals
EqualityComparer<object>
Equals
代わりに、なぜ彼らは次のようなことをしないのでしょうか:
.NET タプル クラスでこのように等価性が実装されているのを見て驚きました。辞書の 1 つでタプル型をキーとして使用していました。
最初のコードに示すようにこれを実装する必要がある理由はありますか? その場合、このクラスを使用するのは少しお勧めできません。
コードのリファクタリングと重複しないデータが大きな懸念事項になるべきではなかったと思います。同じ非ジェネリック/ボクシングの実装も遅れていIStructuralComparable
ますが、IStructuralComparable.CompareTo
あまり使用されていないため、頻繁に問題になることはありません。
上記の 2 つのアプローチを、次のように負担の少ない 3 番目のアプローチでベンチマークしました (要点のみ)。
いくつかのTuple<DateTime, DateTime>
フィールドでは、1000000Equals
が呼び出されます。結果は次のとおりです。
最初のアプローチ (元の .NET 実装) - 310 ミリ秒
2 番目のアプローチ - 60 ミリ秒
3 番目のアプローチ - 130 ミリ秒
デフォルトの実装は、最適なソリューションよりも約 4 ~ 5 倍遅くなります。
precision - IEEE-754 の単精度および倍精度形式はどのように決定されますか?
これらがどのように決定されるかに興味があります:
- 単精度は次のとおりです。e は 8 ビット、残り (23 ビット) は仮数部です。
- 倍精度: e の 11 ビットと残り (52 ビット) は c の仮数で、符号は 1 ビットです。
では、仮数のビット数と e のビット数はどのように決定されるのでしょうか。これは初心者の質問だと思いますが、答えを知りたいです。
java - 単一の EJB セッション Bean が複数のインターフェースを持つことができるのはなぜですか?
EJB 3 in Actionという本から EJB 3.0 について学んでいます。セッション Bean の解剖学のセクションでは、次のことが言及されています。
クライアントが Bean を呼び出すためのインターフェースは、ビジネス インターフェースと呼ばれます。このインターフェースは基本的に、特定のアクセスメカニズムを介したアクセスに適した Bean メソッドを定義します。ここで注目すべき興味深い点は、1 つの EJB が複数のインターフェースを持つことができるという事実です。つまり、EJB 実装クラスは多態的である可能性があります。つまり、さまざまなインターフェイスを使用するさまざまなクライアントがそれらをまったく異なる方法で使用できます。
単一の EJB が複数のインターフェースを持つことができる理由を設計上の決定の理由を理解したいですか? ここでの概念を理解するのに役立つ例は非常に役立ちます。