2011-01-30 7 views
1

私は最近、我々はチェスボードで動作し、ボード上の女王の数を置くことになっていた宿題の質問がありました。アレイ:Javaの倫理

質問は難易度の面で些細だったが、私がお聞きしたかったことは、このでした:

私はちょうどブール2次元配列を作成し、1に女王が含まれているすべての位置を変更したり、私がすべきであるべきインスタンス変数としてx座標とy座標を持つクイーンを表すプライベートクラス?

これは非常に重要または緊急思えないかもしれませんが、私は、Javaを使用していますし、それはちょっとOOプログラミングの概念の中核になります。 Javaのモジュラー機能を使用しない場合、なぜJavaを使用するのですか? CやPythonでも同じことを書いているかもしれません。

これは一般的にはより適切でしょうか?意見や個人的な好みとは対照的に、あなたの答えを理由で裏付けられたものに限定することができれば、私はそれを感謝します。

+8

これは倫理とは関係ありません。 –

+0

@Stephenそれでは、あなたはそれをどのように分類すべきですか? – efficiencyIsBliss

+0

私はそれが適切なデータ構造の設計、またはプログラミングスタイルについての質問だと思います。 – sleske

答えて

5

ブーリアン2次元配列を作成し、クイーンを含むすべての位置を1に変更するか、xとy座標をインスタンス変数として持つクイーンを表すプライベートクラスを作成する必要がありますか?

、このような質問への単一の一般的な答えはありません。いずれの方法も特定の状況に適しており、特定の問題を解決することができます。

Javaのモジュラー機能を使用しない場合は、Javaを使用する理由は何ですか? CやPythonでも同じことを書いているかもしれません。

Javaはオブジェクト指向言語であるという事実は、我々が定義し、私たちが表現するために必要なデータのすべての部分のためのクラスとオブジェクトを使用しなければならないという意味ではありません。

私が正しくあなたの質問を理解していれば、あなたは、実装の詳細について尋ねています。オブジェクト指向プログラミングは、が、重要なドメイン概念をよく表す適切なインタフェースの背後にある実装の詳細をカプセル化することを懸念しているため、特定の実装の詳細についてそれほど心配していません。したがって、クラスのクライアントは、そのインプリメンテーションの詳細を知る必要もなく、インタフェースによって表されるより高いレベルの抽象についてのみ考える必要もない。

+0

私は設定要件がないことに同意しますが、もしどちらかが適切であればどちらが妥当か疑問に思っていました。私は同様の状況に遭遇しました。ツリー構造のデータ構造を実装したり、ツリーを表現するためのプライベートクラスを作成するか、すべてを行ったクラスを1つだけ作成するか(ツリーの定義とツリー上のオペレーションを実行するメソッド) 。 – efficiencyIsBliss

+0

また、それは宿題の問題であるため、私は講師がそれぞれの宿題のために最適な言語を教えたくないと推測しています。 (これはまた、あなたがしばしば、タスクの理想的な言語から遠い言語で何かを実装することを余儀なくされている現実の世界を準備します。) – Catchwa

+0

@効率、それは実際に使用するアルゴリズム、特定の時間/そのような詳細がなければ、質問に答えることはできません。 –

2

私はブール2-Dアレイ を行い、 1にクイーンが含まれているか、私は ようにx、y座標を有し、女王を表すプライベートクラス、 する必要があることをすべての位置を変更する必要がありますインスタンス変数?

それはあなたのニーズによって異なります。例えば、あなたがボード上を反復し、各スクエアをチェックしてクイーンがあるかどうかを定義する必要がある場合、私は最初のアプローチを選択しますが、2,3人のクイーンがいて、クラスクイーンのフィールドとして私にとってより良いアイデアになるだろう。

これは非常に重要な押すか 思えないかもしれませんが、私は、Javaを使用していますし、それが ちょっとOOプログラミングの概念 のコアになります。 Javaのモジュラー機能を使用しない場合、なぜ Javaを使用するのですか?我々は、 もCやPythonで同じことを書いているかもしれません。

OOPを使用できることは、常に最適なソリューションであることを意味するわけではありません。プリミティブ型を使用するのではなく、別のクラスを作成すると、複雑になり、コードをサポートしにくくなります。

+0

あなたは有効なポイントをたくさん作ったので、アップヴォート。ピーターが最初にそこに着いたので、私は正しい答えを記した。 – efficiencyIsBliss

1

この場合、クイーンズ(別のクラスですが、x、y座標を含まない)またはブール値(クイーンの有無を示す)の2D配列が正しい選択である必要があります。 理由は次のとおりです。

  • クイーンズはそのようなポジションを持っていません。オブジェクト(POJO)は、使用する場所から独立して設計し、独自に関連するプロパティのみをクラスメンバーとして含める必要があります。
  • ポジショニングデータはクイーンズとは関係がないため、クイーンズから分離する必要があります。簡単な言葉で言えば、彼女の立場を支配するのはクイーンズの仕事ではなく、外部のパーティー(プレーヤー、プログラムなど)の仕事です。これはの責任の分離と呼ばれています。
  • 使用したいアルゴリズムの多くは実装が難しく、論理的に読みやすく、論理的には非常に難しいでしょう。ボードの単純な反復は不可能になります(少なくとも無駄になります)。

あなたがはっきりと働きやすい両方の拡張可能&だ方法でそれを設計できるようにするために、システム内の各オブジェクトの役割を定義する必要があります。それぞれのオブジェクトが正確に何をしているかについての良い考えがないと、経路のどこかで間違った決定が導かれる可能性があります。最初からやり直すことに決めました:)

+0

* "クイーンズはそのような立場を持っていません" *私にとっては、これはあなたの個人的な視点ではなく、事実ではないようです(もちろん、個人的な意見は問題ありません。私たちは、私たちが望むやり方でオブジェクトをモデル化することは自由です(もちろん、結果もあります)。実際、あなたのクイーンオブジェクトにポジションがない場合、実際にどのような状態になっていますか?そして、それがその位置を気にかけなければ、それは実際にどのような責任がありますか? –

+0

まあ、それは私の一種のポイントでした。メモリ内の一意のオブジェクトへの有効な参照とは別に、それはまったく責任を負う必要はありません。もし問題のドメインがそれを必要とするならば、ステートレスであるかもしれませんが、読みやすさのためにのみ提供されます - クイーン[] []はブール型ボードを持つ以上の話をします。 これは個人的な意見かもしれませんが、MapEntryクラスのようなものです。状態(キー+値)はありますが、マップ内の実際の位置は決してありません。 – pnt

1

私はあなたが意見を求めたくないと知っていますが、とにかくあなたに1つを与えるつもりです。一般的なケースはありません。ソフトウェア設計の技術は、アプリケーションの仕様に応じてデータとコード構造を適切に選択できることにあります。 OO言語は、より表現力豊かなパレットをデザインすることができますが、あらゆる状況に適用される厳格で速いルールはありません。

それは意見です。さて、あなたの具体例に。私が自分自身に質問するかもしれない質問は:もっと有用なのは何ですか?それがボード上のどこにあるかを知っている個々の作品、または各作品がどこにあるのかを知っているボードですか?ボードの別の概念、つまりピースを含む2D配列の形式を持たない場合は、ピースを使用して何かを行う必要があるたびに、すべてのピースを尋ねなければなりません。これはおそらくあなたが数ピースを持っていればうまくいくかもしれませんが、それはあなたが持っているより多くの部分を非効率にします。

逆に言えば、500x500という非常に大きなチェス盤があり、その上に数個しかない場合、2D配列は非常に非効率的なため、データ構造が疎である可能性が高くなります。

もう1つの方法:それ以上のものがあれば、ある種のデータ構造、おそらく配列、2D配列、リンクされたリスト、またはリンクされたリストの配列、または何でも。どのようなデータ構造を選択しようとしていますか、なぜですか?

+0

ご質問ありがとうございました。この特定のケースでは、作業が簡単になりました。 – efficiencyIsBliss

0

説明した方法のいずれかを使用して、ボードの状態を適切に表すことができます。最もの適切なの方法は、私たちに言われていないシステムの希望のの動作に依存します。

0

私はブール2-Dアレイ を行い、 1にクイーンが含まれているか、私は ようにx、y座標を有し、女王を表すプライベートクラス、 する必要があることをすべての位置を変更する必要がありますインスタンス変数?

これは実際には2つの質問です:

  1. 私は、単一の2次元配列内の女王のポジションを保存すべきか、私はX/Yが各女王の座標を保存する必要がありますか?
  2. シンプルなデータ構造、またはこのデータを保持するクラスを使用する必要がありますか?

1に対する答えは、他の回答によって指摘されているとおりです。必要なアルゴリズムに最も簡単なデータ構造を使用してください。

答えは2です:はい、私は常にクラス内のデータ構造(使用する座標、リストのリスト)をラップします。クラスが些細なものになっても、クラスを使用すると、ポジションを格納していることがすぐに分かります。 2D配列だけを使用している場合、人々はそれが何をしているのだろうと思うでしょう。さらに、クラス内で適切なメソッドを使用したり、インバリアントを適用することができます(例:< 10クイーン)...すべてのオブジェクト指向の良さ:-)

関連する問題