手続き型言語、オブジェクト指向言語

Unityは、C#でコードを書きます。これはオブジェクト指向言語と呼ばれています
では、それと対比される手続き型言語との違いは何でしょうか

オブジェクト指向を使っていないBASICを例に説明します

BASICの例

まず、BASICで簡単なゲームのキャラクターを管理する方法を考えます。以下はBASICでキャラクターの位置を更新する例です。

以下のコードは、キャラクターのX位置を更新するBASICプログラムです。このプログラムでは、キャラクターの位置 x を表示し、更新して、一定の条件(位置が10を超える)に達したら位置をリセットするという操作を行います。

10 LET x = 0
20 PRINT "Character X Position: "; x
30 LET x = x + 1
40 IF x > 10 THEN LET x = 0
50 GOTO 20
  1. 初期化:basicコードをコピーする10 LET x = 0
    • x を0に初期化します。これがキャラクターの初期位置を示します。
  2. 位置の表示:basicコードをコピーする20 PRINT "Character X Position: "; x
    • 現在の x の値(キャラクターの位置)を表示します。
  3. 位置の更新:basicコードをコピーする30 LET x = x + 1
    • x の値を1増加させます。これでキャラクターが1ステップ右に移動します。
  4. 位置のリセット:basicコードをコピーする40 IF x > 10 THEN LET x = 0
    • x が10を超えた場合、x を0にリセットします。これにより、キャラクターが画面の端に到達したら左端に戻ります。
  5. ループ:basicコードをコピーする50 GOTO 20
    • 行20に戻り、再び位置を表示して更新します。このループにより、キャラクターの位置が連続的に更新され続けます。

BASICの制限

このシンプルなプログラムにはいくつかの制限があります。

  1. 手動での変数管理:
    • 変数 x を手動で管理し、更新しています。プログラムの制御フローに依存しており、エラーが発生しやすいです。
  2. 再利用性の欠如:
    • コードは特定のタスクに対して固定されており、再利用が難しいです。例えば、もう一つキャラクターを追加するには、同様のコードをもう一度書く必要があります。
  3. メンテナンスの難しさ:
    • プログラムが大きくなると、どの変数がどの機能を持つかを追跡するのが難しくなり、メンテナンスが困難です。

このように、BASICのプログラムはシンプルで直接的ですが、大規模なアプリケーションや複雑なロジックを扱うには適していません。オブジェクト指向プログラミングはこれらの制限を克服し、より整理された、拡張可能でメンテナンスしやすいコードを書くための強力な方法を提供します。

オブジェクト指向の例

次に、同じ動作をオブジェクト指向を使ってUnityで実装してみましょう。以下はC#でキャラクタークラスを定義し、その位置を更新する方法です。

using UnityEngine;

public class Character
{
    public float x;

    public Character()
    {
        x = 0;
    }

    public void UpdatePosition()
    {
        x++;
        if (x > 10) x = 0;
    }

    public void PrintPosition()
    {
        Debug.Log("Character X Position: " + x);
    }
}

public class Game : MonoBehaviour
{
    private Character character;

    void Start()
    {
        character = new Character();
    }

    void Update()
    {
        character.UpdatePosition();
        character.PrintPosition();
    }
}

オブジェクト指向のメリット

  1. データと機能の統合:
    • BASICではデータとその処理が分離しており、手動で変数を更新する必要があります。
    • オブジェクト指向では、データ(プロパティ)とその操作(メソッド)が一つのオブジェクトに統合され、カプセル化されています。これにより、コードの管理と理解が容易になります。
  2. 再利用性:
    • BASICのコードは特定のタスクに直接結びついており、再利用が難しいです。
    • オブジェクト指向では、クラスを定義しておくことで、複数のインスタンスを作成し、同じクラスを異なるコンテキストで再利用できます。
  3. 拡張性:
    • BASICのコードを拡張するには、新しい変数やコードの追加が必要です。
    • オブジェクト指向では、クラスを継承したり、メソッドを追加することで容易に拡張できます。
  4. メンテナンス性:
    • BASICのコードは規模が大きくなると管理が困難になります。
    • オブジェクト指向では、クラスやオブジェクト単位でコードを整理できるため、メンテナンスが容易です。

このように、BASICとオブジェクト指向の違いを具体的な例を通じてみていくことで、オブジェクト指向の利点を理解しやすくなります。

おまけ

Basicのサンプルコードのリファクタリング

10 GOSUB 1000 ' Initialize
20 GOSUB 2000 ' Print Position
30 GOSUB 3000 ' Update Position
40 GOTO 20 ' Repeat

1000 ' Initialize Subroutine
1010 LET x = 0
1020 RETURN

2000 ' Print Position Subroutine
2010 PRINT "Character X Position: "; x
2020 RETURN

3000 ' Update Position Subroutine
3010 LET x = x + 1
3020 IF x > 10 THEN LET x = 0
3030 RETURN

改善点の説明

  1. サブルーチンの導入:
    • 各機能(初期化、位置の表示、位置の更新)をサブルーチンとして分離し、コードの再利用性と可読性を向上させました。
  2. コメントの追加:
    • 各サブルーチンの目的をコメントで説明し、コードの理解を容易にしました。
  3. 明確な制御フロー:
    • メインループで各サブルーチンを順次呼び出すことで、プログラムの制御フローを明確にし、ループ構造を簡潔にしました。

リファクタリング後の各部分の詳細

メインループ:

10 GOSUB 1000 ' Initialize
20 GOSUB 2000 ' Print Position
30 GOSUB 3000 ' Update Position
40 GOTO 20 ' Repeat

初期化、位置の表示、位置の更新を順次呼び出し、これらをループさせます

初期化サブルーチン:

1000 ' Initialize Subroutine
1010 LET x = 0
1020 RETURN

変数 x を初期化します。

位置表示サブルーチン:

2000 ' Print Position Subroutine
2010 PRINT "Character X Position: "; x
2020 RETURN

変数 x の現在の値を表示します。

位置更新サブルーチン:

3000 ' Update Position Subroutine
3010 LET x = x + 1
3020 IF x > 10 THEN LET x = 0
3030 RETURN

変数 x の値を更新し、必要に応じてリセットします。

このようにサブルーチンを使用することで、コードの再利用性と可読性を向上させることができます。

C#,Unity

Posted by hidepon