質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

解決済

殆どの処理は同じだが、一部だけ処理が違う場合どのような構成で書けばよいのでしょう?

mushipan0929
mushipan0929

総合スコア56

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

2回答

0評価

1クリップ

426閲覧

投稿2022/01/16 07:38

編集2022/01/19 11:41

-- 回答者様から目的が不鮮明とのご指摘を受けましたので、下記により具体的な質問を付け加えました。--

殆どの処理は同じだが、一部だけ処理が違う場合どのような構成で書けばよいのでしょう?
下に良く使う方法を2つ挙げました。
2,3種類の場合は2を使い、それ以上になると1を使っています。
ですがどちらにしろ面倒な事には変わりなくもっと良い方法があれば御教授願いたいです。

あと余談ですが、プレビュー画面の文字が全て黒色になっているのですがこれは私だけですか?

1: 共通している処理を基底クラスにして違う部分を派生クラスに記載する
〇: それぞれの派生クラスの中に処理が書けるので見て分かりやすい
×: これらを管理する時に一つずつOverrideされた関数を呼ぶのが面倒。宣言も面倒。

C#

public class Main : MonpBehaviour { private ClassA classA; private ClassB classB; private ClassC classC; private void Start() { classA = new ClassA(); classB = new ClassB(); classC = new ClassC(); } private void Update() { classA.ManagedUpdate(); classB.ManagedUpdate(); classC.ManagedUpdate(); } } public class BaseClass { protected void Hoge() { } public virtual void ManagedUpdate() { } } public class ClassA : BaseClass { public override void ManagedUpdate() { } } public class ClassB : BaseClass { public override void ManagedUpdate() { } } public class ClassC : BaseClass { public override void ManagedUpdate() { } }

2:すべて同じクラスを使用し、Enumの値によって処理を変える
〇: 呼び出しは簡単。
×: ManagedUpdateの中身がすごく長くなる

public class Main : MonpBehaviour { private BaseClass[] baseClasses = new BaseClass[3]; private void Start() { baseClass[0] = new BaseClass(TYPE.A); baseClass[1] = new BaseClass(TYPE.B); baseClass[2] = new BaseClass(TYPE.C); } private void Update() { foreach(BaseClass baseClass in baseClasses) { baseClass.ManagedUpdate(); } } } public class BaseClass { private TYPE type; public BaseClass(TYPE type) { this.type = type; } private void Hoge() { } public void ManagedUpdate() { switch(type) { // それぞれに異なる処理を書く case TYPE.A: break; case TYPE.B: break; case TYPE.C: break; } } } public enum TYPE { A, B, C }

-----------------------------追記-------------------------------
・条件
プレイヤーはDキーを押すとMoveUIが頭上に出現する
プレイヤーはAキーを押すとStopUIが頭上に出現する
一度に出せるUIは1種類/1つのみ
!___既に同じUIが出ている場合は何も起こらない
!___違うUIが出ている場合はそのUIを消してから新しいUIを出す
各UIは出現/消滅時に演出をする

UIを扱うPlayerがどうしても冗長になってしまっています。
また今後プレイヤーが扱うUIの種類が増えるとさらに長くなってしまいます。
どうにかここをシンプルに出来ないでしょうか?

public class UiManagement { private MoveUI[] moveUIs; private StopUI[] stopUIs; public MoveUI FindNotUseMoveUI() { foreach(MoveUI moveUI in moveUIs) { if (moveUI.IsEnable == false) return moveUI; } return null; } public StopUI FindNotUseStopUI() { foreach (StopUI stopUI in stopUIs) { if (stopUI.IsEnable == false) return stopUI; } return null; } } public class Player : MonoBehaviour { private UiManagement uiManagement; private MoveUI moveUI; private StopUI stopUI; private void Update() { if(Input.GetKeyDown(KeyCode.A)) { if (stopUI != null) return; if (moveUI != null) { moveUI.Disable(); moveUI = null; } stopUI = uiManagement.FindNotUseStopUI(); stopUI.Enable(); } if (Input.GetKeyDown(KeyCode.D)) { if (moveUI != null) return; if (stopUI != null) { stopUI.Disable(); stopUI = null; } moveUI = uiManagement.FindNotUseMoveUI(); moveUI.Enable(); } if (moveUI != null) moveUI.ManagedUpdate(); else if (stopUI != null) stopUI.ManagedUpdate(); } } public class MoveUI : BaseUI { public void ManagedUpdate() { Debug.Log("MoveUI出現中"); } } public class StopUI : BaseUI { public void ManagedUpdate() { Debug.Log("StopUI出現中"); } } public class BaseUI { public bool IsEnable { get; private set; } public void Enable() { IsEnable = true; } public void Disable() { IsEnable = false; } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

gentaro

2022/01/16 07:55

「処理」だけに着目するなら、「ちゃんと動くならどんな設計でもOK」という回答にしかならない。「ちゃんと動く」ものに対して「良い、悪い」という判断がしたいなら、それはどんな基準で考えるべきなのかの提示がないと無理。 例えばオブジェクト指向設計的に良いのか悪いのか、という話なら、こんな抽象的な例ではクラス分けが適切なのかわかるわけがないので、回答不能。 「関数を呼ぶのが面倒。宣言も面倒。」みたいなレベルで考えるなら、あなたが一番楽なやり方が正解、という話にしかならないので、他者は答えられない。
ikapy

2022/01/16 08:42

gentaroさんに賛同します。
mushipan0929

2022/01/16 10:14

確かに具体性が足りませんでした。申し訳ない。 追記しましたので再度ご確認をお願いいたします。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。