タグ付けされた質問 「language-agnostic」

このタグは、プログラミング言語または環境に固有ではない質問用です。

7
設計:親クラスへのコールバック
子を持つオブジェクトをモデリングするとき、親クラスのメンバーとして、構成を介して子を含めるのが一般的です。ただし、子が親に何かを伝える必要がある場合もありますが、親の関数を呼び出す必要があります。C ++を使用してこれをどのように達成できますか?いくつかのオプションは次のとおりです。 親クラスをグローバルにします。したがって、子オブジェクトは親オブジェクトのメンバー関数を呼び出すことができます。 すべての子オブジェクトに、親オブジェクトをポインターまたは参照として注入します。子が親オブジェクトに何かを伝える必要がある場合、使用できるメンバー変数があるため、子は常にそうすることができます。 これを行う他の方法は何ですか?この種の一般的なデザインパターンや名前はありますか? 他のオブジェクト指向言語では詳細が異なるため、C ++のアイデアとソリューションに興味があることに注意してください。たとえば、上記のポイント2では「ポインターまたは参照」に言及しており、両方ともC ++でのみ可能です。C ++には他の言語にはない言語機能があるため、問題の解決策を実装すると、これらの言語機能が組み込まれる可能性があり、他の言語で考えられるソリューションとは異なるソリューションになります。

3
ライブラリの可視性を処理する一般的な方法は何ですか?
クラスでprivateを使用するタイミングとprotectedを使用するタイミングに関するこの質問に、私は考えました。(この質問は関連しているため、最終クラスとメソッドにも拡張します。Javaでプログラミングしていますが、これはすべてのOOP言語に関連すると思います) 受け入れられた答えは次のとおりです。 良い経験則は、すべてをできるだけプライベートにすることです。 そしてもう一つ: すぐにサブクラス化する必要がない限り、すべてのクラスを最終クラスにします。 サブクラス化してすぐにオーバーライドする必要がない限り、すべてのメソッドをfinalにしてください。 メソッドの本体内で変更する必要がある場合を除き、すべてのメソッドパラメーターを最終的なものにします。 これは非常に単純明快ですが、アプリケーションではなく主にライブラリ(GitHubのオープンソース)を書いている場合はどうでしょうか。 多くのライブラリとシチュエーションに名前を付けることができます。 開発者が考えもしなかった方法でライブラリが拡張されました これは、可視性の制約のため、「クラスローダーマジック」およびその他のハックを使用して行う必要がありました。 ライブラリは構築されていない方法で使用され、必要な機能は「ハッキング」されました 可視性の低下により変更できない小さな問題(バグ、機能の欠落、「間違った」動作)のため、ライブラリを使用できませんでした 修正できなかった問題は、単純な関数(プライベートまたは最終)をオーバーライドするのに役立つ巨大でhugeいバグのある回避策につながりました。 そして、質問が長くなりすぎるまでこれらの名前を付け始め、それらを削除することにしました。 必要以上のコード、必要以上の可視性、必要以上の抽象化を持たないというアイデアが好きです。そして、これはエンドユーザー向けのアプリケーションを書くときに機能するかもしれません。その場合、コードはそれを書く人だけが使用します。しかし、コードが他の開発者によって使用されることを意図している場合、これはどのように持続しますか?元の開発者があらゆる可能なユースケースを事前に考え、変更/リファクタリングが困難/不可能である可能性は低いですか? 大きなオープンソースライブラリは新しいものではないので、オブジェクト指向言語を使用したこのようなプロジェクトで可視性を処理する最も一般的な方法は何ですか?

4
すべての通貨(ドル、ユーロ、ポンドとは異なる通貨も含む)で機能する単一のデータ表現はありますか?
ある通貨で金額を表すために使用するライブラリに関する多くの質問を見つけることができます。そして、なぜ通貨をIEEE 754浮動小数点数として保存すべきではないのかという古くからの問題についてです。しかし、私はこれ以上何も見つけられないようです。確かに、実際の使用での通貨についてもっと知る必要があります。物理的な使用で表現するために知っておく必要があるものに特に興味があります(たとえば、ドルでは、0.01未満の精度はなく、整数のセントとして表現できます)。 しかし、あなたが知っている唯一の通貨が西洋の人気通貨(ドル、ユーロ、ポンドなど)である場合、プログラムがどれほど汎用性があるかを推測するのは困難です。純粋にプログラム的な観点で関連する知識は他に何ですか?私は変換のトピックについて心配していません。 特に、ある通貨で値を保存して印刷できるようにするには、何を知る必要がありますか?

3
「メソッドは値を返すか副作用があるはずですが、両方ではありません」の起源
私は一度、メソッドには戻り値があり(参照的に透過的)、または副作用がありますが、両方ではないことを読みました。このルールへの参照は見つかりませんが、それについてもっと学びたいです。 このアドバイスの起源は何ですか?どの人またはコミュニティからそれが生じましたか? 追加クレジット:このアドバイスに従うことの利点は何ですか?

5
おそらく役に立たない例外処理でコードを強化する
コードの別の部分が正しくコーディングされていない場合に備えて、無駄な例外処理を実装することをお勧めしますか? 基本的な例 単純なものなので、私は皆を失うわけではありません:)。 データベースから抽出されたデータを人の情報(名前、住所など)を表示するアプリを書いているとしましょう。私がUI部分をコーディングしている人で、他の誰かがDBクエリコードを書いているとしましょう。 ここで、アプリの仕様で、人の情報が不完全な場合(データベースに名前がないなど)、クエリをコーディングしている人が、不足しているフィールドに「NA」を返すことでこれを処理する必要があると考えているとします。 クエリのコーディングが不十分で、このケースを処理できない場合はどうなりますか?クエリを作成した人が不完全な結果を処理し、情報を表示しようとすると、コードが空のものを表示する準備ができていないため、すべてがクラッシュするとどうなりますか? この例は非常に基本的なものです。私はあなたのほとんどが「あなたの問題ではない、あなたはこのクラッシュの責任を負わない」と言うと信じています。ただし、クラッシュするのは依然としてコードの一部です。 もう一つの例 今、私がクエリを書いている人だとしましょう。仕様は上記と同じではありませんが、「挿入」クエリを作成する人は、データベースに人を追加するときにすべてのフィールドが完全であることを確認して、不完全な情報を挿入しないようにする必要があります。UIの人に完全な情報を提供するために、「選択」クエリを保護する必要がありますか? 質問 仕様に「この人がこの状況を処理する責任者である」と明示的に述べていない場合はどうなりますか?第三者が別のクエリ(最初のクエリに似ていますが、別のDB上にある)を実装し、UIコードを使用してそれを表示しますが、コードでこのケースを処理しない場合はどうなりますか? 私が悪いケースを処理することになっていない場合でも、起こりうるクラッシュを防ぐために必要なことをすべきですか? 私はここで衝突を解決していないので、「(彼)がクラッシュの原因である」などの答えを探していません。私の責任ではない状況からコードを保護する必要があります処理する?ここでは、単純な「空の場合は何かを行う」で十分です。 一般に、この質問は冗長な例外処理に取り組んでいます。私がそれを求めているのは、私がプロジェクトで一人で作業するとき、「万が一に備えて」何か間違ったことをして、悪いケースを通過させるために、連続する関数で同様の例外処理を2〜3回コーディングする可能性があるためです。


8
小さな繰り返しコードセグメントの関数/メソッドを作成するときの適切なコードプラクティスは何ですか?
大規模なプログラムの作成中に何度も、コピーまたは貼り付けの回数を関数またはメソッドにコードを入れるのが理にかなっていて、良い経験則は何かを疑問視しています。私は4行以上の経験則を使用しており、2回以上表示され、そのコードを含む単純な関数/メソッドを作成します。より良いプラクティスを考えたり、何か指針を提供できますか?これは、言語固有の質問というよりも、一般的なデザインパターンの質問です。

7
なぜ学校はデバッガをカバーしないのですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 SO に関するさらに別の宿題の質問の後。大部分の学生は、デバッガーとは何か、またはデバッガーの使い方を知らないようです。デバッガの使用方法を知ることは、他のプログラミングの基礎とほぼ同じくらい重要だと思います。 問題はデバッグするべきではなく、プログラミングの基礎と一緒に最新のデバッグツールを使用する方法を教えますか?そうでない場合、なぜそうではない。

5
関数型プログラミングはまったく違うのですか、それとも実際にはもっと難しいのですか?
関数型プログラミングはまったく違うのですか、それとも実際にはもっと難しいのですか? プログラミングをまったく学んだことがなく、関数型プログラミングを教えられた人のことを言ってください。vsプログラミングをまったく学んだことがなく、命令型プログラミングを教えられた人。彼はどちらが厳しいでしょうか?または同じ? 私の質問:今の問題は入力をキャメルケースにすることだと言って、 そのようにqwe_asd_zxc_rty_fgh_vbnなるqweAsdZxcRtyFghVbn 手順は次のとおりです。 に沿って分割する _ 最初の項目をスキップして配列をループします エントリごとに最初の文字を大文字にします 結果を結合する 機能的な方法は次のとおりです。 _返品が見つからない場合input input最初に沿ってカットします_(取得するqweおよびasd_zxc_rty_gfh_cvb) の最初の文字を大文字にし、headそれを連結しますf(tail) あなたが持っている場合は[OK]を機能的なバックグラウンドをと手続きプログラミングにおける豊富な経験を持って、私はお願いしたいと思います:それは、手続きの方法を見つけ出すにお時間がかかりますか、それは機能的な方法を把握するためにあなたのために長い時間がかかりますか? あなたが持っている場合は、手続き-背景をが、機能、プログラミングで長年の経験を持って、私は同じ質問をしたいと思います:それは、手続きの方法を見つけ出すにお時間がかかりますか、それは、機能を把握するために、あなたのために時間がかかります仕方?

7
オブジェクト指向言語では、オブジェクトはいつ自分自身に対して操作を行う必要があり、いつオブジェクトに対して操作を行う必要がありますか?
Pageページレンダラーへの一連の指示を表すクラスがあるとします。そしてRenderer、画面上にページをレンダリングする方法を知っているクラスがあるとします。次の2つの異なる方法でコードを構成できます。 /* * 1) Page Uses Renderer internally, * or receives it explicitly */ $page->renderMe(); $page->renderMe($renderer); /* * 2) Page is passed to Renderer */ $renderer->renderPage($page); 各アプローチの長所と短所は何ですか?いつ良くなるのでしょうか?いつ他の方が良くなりますか? バックグラウンド もう少し背景を追加するには-同じコードで両方のアプローチを使用していることに気付きます。と呼ばれるサードパーティのPDFライブラリを使用していTCPDFます。私のコードのどこかに私が持って仕事にPDFレンダリングのため、以下を持っています: $pdf = new TCPDF(); $html = "some text"; $pdf->writeHTML($html); ページの表現を作成したいとします。次のようなPDFページスニペットをレンダリングするための指示を保持するテンプレートを作成できます。 /* * A representation of the PDF page snippet: * a …

3
%演算子を使用せずに、よく分散されたハッシュテーブルを実装することは可能ですか?
私は、C#で高速で十分に分散されたハッシュテーブルを実装したいと考えています。任意のハッシュコードを受け取り、それを「制約」して、バケットのインデックス作成に使用できるハッシュ制約関数の選択に問題があります。私がこれまでに見た2つのオプションがあります: 一方では、バケットに常に素数の要素があることを確認し、ハッシュを制約するには、単にバケットの数でモジュロします。実際、これは.NETの辞書が行うことです。このアプローチの問題は、%の使用が他の操作と比較して非常に遅いことです。あなたが見ればAgner霧命令テーブル、idiv(%のために生成されますアセンブリコードで)新しいIntelプロセッサのための〜25サイクルの命令のレイテンシを持っています。3の周りにこれを比較しmul、等をビット単位のオペレーションのための1 and、orまたはxor。 一方、バケットの数は常に2の累乗にすることができます。配列の外部でインデックスを作成しないようにハッシュのモジュラスを計算する必要がありますが、今回はより安価になります。2のべき乗のためのため% Nだけされ& (N - 1)、拘束のみ1~2サイクルかかるマスキング演算に低減されます。これはGoogleのsparsehashによって行われます。この欠点は、ユーザーに適切なハッシュを提供することを期待していることです。ハッシュをマスクすると、基本的にハッシュの一部が切り捨てられるため、ハッシュのすべてのビットを考慮しなくなります。ユーザーのハッシュが不均等に分散している場合、たとえば上位ビットのみが埋められるか、下位ビットが常に同じである場合、このアプローチの衝突率ははるかに高くなります。 私は、両方の長所を備えた使用可能なアルゴリズムを探しています。ハッシュのすべてのビットを考慮し、%を使用するよりも高速です。必ずしもモジュラスである必要はなく、範囲内0..N-1(Nはバケットの長さ)にあることが保証されているだけで、すべてのスロットに均等に分布しています。そのようなアルゴリズムは存在しますか? 助けてくれてありがとう。

3
なぜ言語はブロックの明示的なマーカーよりもインデントを好むのですか?
Haskellを学んでいますが、自動インデントツールを探していました。私はあまり見ていませんでしたが、Haskellでは(Pythonのように)インデントがブロックを意味することを学びました。その結果、{}(中括弧)やbegin endキーワードなどの明示的なマーカーを使用する、Cファミリの他の言語ほど強力な自動書式設定ツールを作成することは不可能だと推測しています。 読みやすくするためにインデントを強制する言語は気にしませんが、インデントの強制と明示的なマーカーの両方の利点を理解できないため、自動化ツールはどのブロックに属するかを理解できます。 ブロックをマークするインデントの設定が、コードの見栄えを良くするためのものである場合、その利点はまだ理解できません。タブやスペースが異なるエディターや異なるフォント(モノスペースフォントは見栄えが良いなど)で異なって表されることを考えると、プログラマーがコードを適切に提示することを期待することは不可能です。現在のテキストエディタを考慮に入れることができるツールは、コードを正しくフォーマットするためにはるかに適切です。 言語設計者が明示的なブロックマーカーよりもインデントを選択するのはなぜですか?

3
2つのノード間の相互接続中に分散デッドロックを回避するにはどうすればよいですか?
2つのピアノードがあるとします。最初のノードは2番目のノードに接続要求を送信できますが、2番目のノードは最初のノードに接続要求を送信できます。2つのノード間の二重接続を回避する方法は?この問題を解決するには、インバウンドまたはアウトバウンドTCP接続を作成するために実行される操作を連続して行うだけで十分です。 つまり、各ノードは、着信接続と発信接続の両方で、新しい接続作成操作を順番に処理する必要があります。この方法では、接続されたノードのリストを維持し、ノードからの新しい着信接続を受け入れる前、またはノードに接続要求を送信する前に、このノードがリストに既に存在するかどうかを確認するだけで十分です。 接続を作成する操作を順番に行うには、接続ノードのリストをロックするだけで十分です。実際、新しい接続ごとに、新しい接続ノードの識別子がこのリストに追加されます。このアプローチは、原因となることができればしかし、私は疑問に思う分散デッドロックを: 最初のノードは、2番目のノードに接続要求を送信できます。 2番目のノードは最初のノードに接続要求を送信できます。 2つの接続要求が非同期でないと仮定すると、両方のノードが着信接続要求をロックします。 どうすればこの問題を解決できますか? 更新:ただし、新しい(着信または発信)接続が作成されるたびにリストをロックする必要があります。他のスレッドがこのリストにアクセスする可能性があるため、デッドロックの問題が残ることになります。 更新2:あなたのアドバイスに基づいて、ログイン要求の相互受け入れを防ぐアルゴリズムを書きました。各ノードはピアであるため、新しい接続要求を送信するクライアントルーチンと、着信接続を受け入れるサーバールーチンを持つことができます。 ClientSideLoginRoutine() { for each (address in cache) { lock (neighbors_table) { if (neighbors_table.contains(address)) { // there is already a neighbor with the same address continue; } neighbors_table.add(address, status: CONNECTING); } // end lock // ... // The node tries to establish …

7
不変の参照またはラベルのみを持つ言語の名前変数の良い代替手段は何ですか?
たとえば、関数型言語では、変数は単一の割り当てであり、値は割り当てられると不変です。そのため、バインドされていない状態とバインドされた状態の2つがあり、一度バインドされると変更できません。 そのようなものに最も適した数学用語や他のコンピューター科学用語はありますか?意味的に分散や可変性を意味しないもの。 termなど存在しない場合、およびそのような構造を持つ言語を設計している場合、これらに使用するのは単語変数以外です。 私はアイデアを投票するつもりはありません。そのようなことに対して受け入れられている業界(業界)の用語があるかどうかを把握しようとしています。

3
グリッド上で有向グラフをランダムに生成します
ポケモンのアイススライディングパズルに似たパズルゲームを作成するために、有向グラフをランダムに生成しようとしています。 これは基本的に、http://bulbanews.bulbagarden.net/wiki/Crunching_the_numbers:_Graph_theoryをランダムに生成できるようにしたいものです。 xおよびy次元でグラフのサイズを制限できる必要があります。リンクに示されている例では、8x4グリッドに制限されます。 私が直面している問題は、グラフをランダムに生成するのではなく、ノードの反対側に何か(岩のようなもの)が必要なので、2D空間に適切にマップできるグラフをランダムに生成することですスライドを止めると視覚的に意味があります。これに伴う問題は、岩が他の2つのノード間のパスまたは場合によっては別のノード自体のパスになり、グラフ全体が破損することがあることです。 私が知っている少数の人々と問題について議論した後、解決策につながる可能性のあるいくつかの結論に達しました。 グリッドを構築するときに、グリッドの障害物をグラフの一部として含める。 完全に満たされたグリッドから始めて、ランダムなパスを描画し、そのパスを機能させるブロックを削除します。 問題は、追加の短いパスの導入を避けるために、どれを削除するかを判断することとなります。また、動的プログラミングアルゴリズムは有益であると考えていましたが、動的プログラミングアルゴリズムをゼロから作成するのに熟練している人はいませんでした。この問題が公式に呼ばれているものについてのアイデアや参考文献(公式のグラフの問題である場合)が最も役立ちます。 ブロックをランダムに配置し、選択した開始/終了からナビゲーショングラフを生成することで、これまでに達成したことの例をいくつか示します。アイデア(前のリンクで説明)は、緑のSから始めて緑のFに到達することです。これを行うには、上/下/左/右に移動し、選択する方向に移動し続けます。壁。これらの写真では、灰色が壁、白が床、紫色の線が開始から終了までの最小の長さであり、黒い線と灰色の点が可能な経路を表しています。 ランダムに生成されたグラフの悪い例は次のとおりです。 ランダムに生成された(または手で調整された)グラフの良い例を次に示します。 また、パズルとして実際にこれをプレイするときに、より難しいものが最小パスに沿って多くの高度なノードを持つものであることに気づいたようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.