私が勉強した本では継承やインターフェースの実装は現実の関係と同じようにしないといけないというようなことが書いてありました。例えばモンスタークラスがアイテムクラスを継承したりしてはいけないなどです。
私は今シューティングゲームを作っているのですが、メインループを実装するためにプレイヤークラスがRunnableを継承するのはオブジェクト指向的にはあまり良くないのでしょうか?
回答よろしくおねがいします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
継承やインターフェースの実装は現実の関係と同じようにしないといけない
あまりこだわらなくて大丈夫です。
投稿2020/06/23 22:06
総合スコア146018
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
「論より証拠」です。実際のコード例をたくさん読んでクラスの構成法の定石を学んでいきましょう。JavaやC#の標準ライブラリには多くのヒントが隠されています。積極的にJavaの標準ライブラリについて学びましょう。ちなみにJavaの標準ライブラリはJavaクラスライブラリというらしいです。
AOJ(Aizu Online Judge)などのコードにも学ぶことは多いです。標準ライブラリをユーザー側から多用するためです。簡潔な表現をしようとすれば、必ず標準ライブラリを正しく運用することが求められます。AOJはAtCoderなどと異なり、他人の書いたコードを見ることができます。このことによりプログラミング初心者のスキルを底上げすることができるでしょう。
あと、Java言語に慣れてきたらEffective Javaを読んでくださいね。本屋で立ち読みしたり図書館から借りてくるので可です。
投稿2020/06/25 08:37
編集2020/06/25 08:42総合スコア667
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
継承やインターフェースの実装は現実の関係と同じようにしないといけない
話の前後があるかもしれませんが、恐らくそれは間違いです。
むしろ、現実と同じような関係性をオブジェクト指向に適用すると混乱が生じます。
実際のアプリケーション開発において、現実の関係をオブジェクトで表現することはほとんどないからです。
シューティングゲームを作っているのですが、メインループを実装するためにプレイヤークラスがRunnableを継承するのはオブジェクト指向的にはあまり良くないのでしょうか
いくつか気になるので箇条書きでコメントします。
- メインループを実装する目的が「ターン制のゲームにおけるターンの管理」「画面の描画」などであれば、それをプレイヤークラスが持つのは好ましくありません。その目的を行うにふさわしいクラス(例えば、ゲーム全体の流れを管理するクラス)が持つべきです。プレイヤークラスは残機や移動速度などの状態(フィールド)を持ち、移動や攻撃などの振る舞い(メソッド)を持つのが一般的にふさわしいと思います。
- Runnableは和訳すると「(処理を)動作することができる、(足で)走ることができる」です。「~することができる」という表現に継承を用いるのは適切ではないでしょう。なぜなら、そのクラスが実処理を持っているからです。ですから、その実処理の内容に合わせてクラスを命名すべきです。(役割が大きくなりがちですが、GameManagerとでも命名したクラスを定義して、そこでメインループを作り、ゲームの流れを管理する方がわかりやすいと思います)
- Runnableを残すのであれば、それは実処理を持たせず、インタフェースであるなら適切だと思います。
java
1interface Runnable { 2 void run(); //実処理をもたず、できることだけ明示しておく 3} 4 5class GameManger implements Runnable{ 6 public void run(){ 7 //メインループ等の実処理 8 //NOTE: 果たして、runという名前だけでメインループを行う処理であると周りは分かるのだろうか? 9 } 10} 11 12class Player{ 13 //残機や移動速度などの状態(フィールド)を持ち、移動や攻撃などの振る舞い(メソッド)を持つ 14}
オブジェクト指向的にはあまり良くないのでしょうか?
メソッドやクラスの命名から中のコードを見なくても何をしているのか**「すぐに」「大体」わかることが大切**です。
例えば「このメソッドの実装、どうなっていたっけな…。せや、中を見たろ!」となった時点で命名が正しくされていないことになります。
今回の場合は「プレイヤーがメインループを持って何かをすること」を分かりやすいと思うかどうかに着目すると良いでしょう。
私は ayorih さんのコードを見る限り「PlayerがRunnableを継承しているのなんでや」とか「Runnableなのになぜ実処理を持ってるねん」とかを疑問に感じました。そして、その疑問を解決するためにPlayerの中の実処理を確認すると思います。
ただし、私がそう認識しているだけですから、ayorih さんが作っていてそれで分かりやすいなら、あなたの中で思うオブジェクト指向的になんら問題ないということになります。そして、一人で開発されていて、かつ命名規則がきちんと整理されているのであれば、それで進めても問題ないのではと思います。
問題は色々な人と開発している場合で、あなたとそれ以外の人で「正しい命名」の基準がズレているとオブジェクト指向的にあまり良くないのではないかと思います。
そこは、世の中のコーディングルール(どのように命名を決めているか)や、アプリケーション(github等で公開されているコードの命名がどうか)を見て基準を理解することでズレを修復できると思います。
投稿2020/06/25 08:25
編集2020/06/25 08:44総合スコア2663
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
私が勉強した本では継承やインターフェースの実装は現実の関係と同じようにしないといけないというようなことが書いてありました。
恐らく誤読しています。
「現実の関係」という表現の「現実」を文字通り捉えると、
例えばモンスタークラスがアイテムクラスを継承したりしてはいけないなどです。
という例は出てきません。(「現実」にはモンスターなんていない)
オブジェクトの分析・設計上の話なら、そのクラスは概念上のis-a関連が存在するか?
というところが焦点になるはずです。
「アイテム is モンスター」は成立しないでしょうから、その継承関係がおかしい、というのは合ってますが。
私は今シューティングゲームを作っているのですが、メインループを実装するためにプレイヤークラスがRunnableを継承するのはオブジェクト指向的にはあまり良くないのでしょうか?
Runnableがどんなクラスなのかわかりませんが「メインループを処理するクラス」であれば、is-a関係が成り立つとは思えませんので、オブジェクト指向的には誤っています。
投稿2020/06/24 01:28
総合スコア8947
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/25 06:45
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。