手続き型言語、オブジェクト指向言語
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
- 初期化:basicコードをコピーする
10 LET x = 0
x
を0に初期化します。これがキャラクターの初期位置を示します。
- 位置の表示:basicコードをコピーする
20 PRINT "Character X Position: "; x
- 現在の
x
の値(キャラクターの位置)を表示します。
- 現在の
- 位置の更新:basicコードをコピーする
30 LET x = x + 1
x
の値を1増加させます。これでキャラクターが1ステップ右に移動します。
- 位置のリセット:basicコードをコピーする
40 IF x > 10 THEN LET x = 0
x
が10を超えた場合、x
を0にリセットします。これにより、キャラクターが画面の端に到達したら左端に戻ります。
- ループ:basicコードをコピーする
50 GOTO 20
- 行20に戻り、再び位置を表示して更新します。このループにより、キャラクターの位置が連続的に更新され続けます。
BASICの制限
このシンプルなプログラムにはいくつかの制限があります。
- 手動での変数管理:
- 変数
x
を手動で管理し、更新しています。プログラムの制御フローに依存しており、エラーが発生しやすいです。
- 変数
- 再利用性の欠如:
- コードは特定のタスクに対して固定されており、再利用が難しいです。例えば、もう一つキャラクターを追加するには、同様のコードをもう一度書く必要があります。
- メンテナンスの難しさ:
- プログラムが大きくなると、どの変数がどの機能を持つかを追跡するのが難しくなり、メンテナンスが困難です。
このように、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();
}
}
オブジェクト指向のメリット
- データと機能の統合:
- BASICではデータとその処理が分離しており、手動で変数を更新する必要があります。
- オブジェクト指向では、データ(プロパティ)とその操作(メソッド)が一つのオブジェクトに統合され、カプセル化されています。これにより、コードの管理と理解が容易になります。
- 再利用性:
- BASICのコードは特定のタスクに直接結びついており、再利用が難しいです。
- オブジェクト指向では、クラスを定義しておくことで、複数のインスタンスを作成し、同じクラスを異なるコンテキストで再利用できます。
- 拡張性:
- BASICのコードを拡張するには、新しい変数やコードの追加が必要です。
- オブジェクト指向では、クラスを継承したり、メソッドを追加することで容易に拡張できます。
- メンテナンス性:
- 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
改善点の説明
- サブルーチンの導入:
- 各機能(初期化、位置の表示、位置の更新)をサブルーチンとして分離し、コードの再利用性と可読性を向上させました。
- コメントの追加:
- 各サブルーチンの目的をコメントで説明し、コードの理解を容易にしました。
- 明確な制御フロー:
- メインループで各サブルーチンを順次呼び出すことで、プログラムの制御フローを明確にし、ループ構造を簡潔にしました。
リファクタリング後の各部分の詳細
メインループ:
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
の値を更新し、必要に応じてリセットします。
このようにサブルーチンを使用することで、コードの再利用性と可読性を向上させることができます。
ディスカッション
コメント一覧
まだ、コメントがありません