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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Delegates

Delegatesとは、オブジェクト指向型プログラミングにおいて、あるオブジェクトの操作を一部の他のオブジェクトに代替させる手法のこと。オブジェクトは他のデリゲートに頼って関数を実行することができます。

C#

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

4回答

1686閲覧

C#プログラミングはメソッドが少ない方が良いのか。

Toto_GG.

総合スコア9

Delegates

Delegatesとは、オブジェクト指向型プログラミングにおいて、あるオブジェクトの操作を一部の他のオブジェクトに代替させる手法のこと。オブジェクトは他のデリゲートに頼って関数を実行することができます。

C#

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

2グッド

2クリップ

投稿2020/09/18 15:41

編集2020/09/18 23:08

前提・実現したいこと

UnityにてC#プログラミングの勉強をしています。
練習問題のようなものを出題され、自分で考えて書いてみたら結果は同じだったのですがコードが違いました

私の方がメソッドが一つ多いので、良くなさそうというのはなんとなく分かります。
しかし、私はいまだ勉強中のため、大きなプロジェクトを作った経験がなく、この一見小さな違いが後々どう影響してくるのかが分かりません

そこで、質問なのですが、この違いが後々どのように影響してきますか
また、プログラミングはどのような形を目指していけば良いのですか?(例えば、同じことを書かない、メソッドは少なく等)

発生している問題

プログラミングの書き方を学んでいる最中だが、最終的にどのような形を目指していけば良いのか知らないことに気づいた。
より簡潔に、よりシンプルに、というのを目指していく事はなんとなく聞いたことがあるが、それがどんな形かは知らない。

該当のソースコード

C#

1//私の書いたもの 2public class Main : MonoBehaviour 3{ 4 public delegate void Teleport(); 5 public static event Teleport onTeleport; 6 7 public void Teleporting() 8 { 9 if (onTeleport != null) 10 { 11 onTeleport(); 12 } 13 } 14 15 private void Update() 16 { 17 if (Input.GetKeyDown(KeyCode.Space)) 18 { 19 Teleporting(); 20 } 21 } 22}

C#

1//私が書いたもの 2public class Cube : MonoBehaviour 3{ 4 private void Start() 5 { 6 Main.onTeleport += ChangePosition; 7 } 8 9 public void ChangePosition() 10 { 11 GetComponent<Transform>().position = new Vector3(5, 2, 0); 12 } 13}

C#

1//公式の答え 2public class Main : MonoBehaviour 3{ 4 public delegate void Teleport(Vector3 pos); 5 public static event Teleport onTeleport; 6 7 private void Update() 8 { 9 if (Input.GetKeyDown(KeyCode.Space)) 10 { 11 if (onTeleport != null) 12 { 13 Vector3 pos = new Vector3(5,2,0); 14 onTeleport(pos); 15 } 16 17 } 18 } 19}

C#

1//公式の答え 2public class Cube : MonoBehaviour 3{ 4 private void Start() 5 { 6 Main.onTeleport += ChangePosition; 7 } 8 9 public void ChangePosition(Vector3 pos) 10 { 11 transform.position = pos; 12 } 13}
seastar3, i_zna👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

こんにちは。

なかなか微妙なケースと思います。このケースではどちらの記述でもOKと思います。
ただし、Update()関数が大きくなってきた時に差がでます。
行数の多い関数は分割した方が良い場合が多いのですが、ケースバイケースです。

大きなプログラムの多くは寿命が長く、かつ、関わる人も増えてきます。なので書いた人と別の人がメンテナンスすることも多々あります。
例えば今回のTeleporting()はたかだか数行の非常に小さな関数ですので、もしUpdate()関数の中に直接記述してあれば、そのまま読めば済みます。しかし別関数として定義してあると初めての人はインタフェースを把握する余分の手間を強いられます。

今回は引数も戻り値もないので問題ないですが、3~4個程度の引数は頻繁にあります。それらをきちんと把握する負担はなかなかのものです。その挙げ句、2~3行しか実行コードがなかったら、その関数を把握する手間の大半はインタフェースの把握で消費されます。これはなかなかに悲しいことです。
ですので、1箇所からしか呼ばれない数行程度の小さな関数は呼び出し元に直接記述した方が好ましい場合が多いです。

大きな関数を分割する目的は見通しをよくすることです。小さすぎる関数を多発させるなど、それに反するような分割はしないことをお勧めします。

「どのように記述すると見通しが良くなるか」は、分かりやすい文章を書くスキルと同じようなものです。
読みにくいコードに出会う度に何が原因か考えつつ、経験を積むことが効果的と思います。

投稿2020/09/18 16:51

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

うーん、どうでしょうね。
個人的には、メソッドに分割したほうが良い事のほうが多いです。
もちろん、メソッド名が適切である事、処理の分け方が適切である事が前提ですが、
メンテナンスしやすさ、コードの読みやすさはメソッド分割のほうが高いです。
ただ、提示された程度のコードの長さだとどっちでも良いのかなと思います。

実際のゲームのコードはもっと長くて複雑になって来ますから、1つのメソッドの行数が増えて、
そこに複数の処理が入って来たら、メソッドを分割しないとダメです。

メソッドの分け方とかは、知識よりも経験則のほうが大きい事が多いように思います。
苦労した経験があって初めて分割のメリットを理解できるというか。
なので、ある程度複雑で長い行数のコードを書いて、それをメンテナンスする=(仕様変更や機能追加)経験を繰り返して、やっぱりコードは分割したほうがいいなという経験をしてから自然と答えにたどり着くような気もしています。

投稿2020/09/18 15:54

mingos

総合スコア4190

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

  • DRY("Don't Repeat Yourself")……同じ知識は繰り返し書くな
  • YAGNI("You ain't gonna need it")……機能は実際に必要となるまでは追加するな
  • KISS("Keep it simple, stupid")……シンプルにしておけ

といった道しるべはあります。

ただし具体的に、処理Aと処理Bが似ていたときそれが「同じ知識」なのか「たまたま似ているだけ」なのか判断したり、いま「実際に必要」な機能は何なのかを見つけたり、シンプルさと便利さのトレードオフのバランスをどこに取るか決めたりするのに必要なのは経験だと思います。

あと特に紙媒体の場合は特にありがちですが、公式解答は紙面に収めなければならなかったり、問題解決のポイントを強調したりするために理想的とは言えないコードになっていることもあるので、あまり細かい部分まで気にしなくてもいいと思います。

投稿2020/09/18 16:51

ku__ra__ge

総合スコア4524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C#やJava等のオブジェクト指向言語は、メソッドを細かく分割していくのが基本です。
なので、メソッドの数は多くなる傾向にあると思います。

私は、if文を可能な限り少なく、if文の中にif文を入れないように気を付けています。
メソッドの長さや数よりも、複雑にならないようにしています。

大事なことは、保守性が下がった時にリファクタリングすることです。
この後どんな影響があるかは、誰にもわかりません。
分からないことは、今どれだけ考えても分からないです。
影響が出た時に、影響が出ないように修正する事の方が大事だと思います。

今できることは、リファクタリングの時にバグが発生しないように単体テストコードを
作っておくことではないでしょうか。

投稿2020/09/19 14:02

Kaiser

総合スコア295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問