メニューボタン
IBMi海外記事2024.04.10

プロシージャー主導型RPGと、オブジェクト指向プログラミングの柱の導入

Gregory Simmons 著

オブジェクト指向プログラミング(OOP)の4つの柱である、抽象化、カプセル化、継承、ポリモーフィズムは、ある時一度に生み出されたわけではありません。様々な研究者やプログラマーからの貢献によって、何年かを掛けて徐々に進化してきたものです。以下に、それらの進化について概要を示します。

1.抽象化

  • 抽象化という概念は、アラン・ケイ(Alan Kay)氏が、1960年代にSimulaから発想を得て提唱したとされています。
  • 抽象化は、1970年代にSmalltalkの開発で、さらに注目を集めるようになりました。

2.カプセル化

  • デイビッド・パーナス(David Parnas)氏が、1972年の論文「On the Criteria To Be Used in Decomposing Systems into Modules(システムをモジュールに分解する際に使用すべき基準について)」で、情報隠蔽およびデータ保護の重要性を強調することによって、カプセル化の基礎を築きました。
  • カプセル化は、1980年代および1990年代にC++やJavaのような言語の開発で、OOPのコア原則となりました。

3.継承

  • 継承という概念も、Simulaに起源があります。
  • 継承は、C++やJavaのようなオブジェクト指向言語で広く使われるようになり、開発者は既存のクラスをベースにして新しいクラスを作成できるようになりました。

4.ポリモーフィズム

  • ポリモーフィズムは、1970年代にLispやSmalltalkのような言語で登場しました。
  • ポリモーフィズムは、C++やJavaのようなOOP言語の重要な特徴となり、様々なオブジェクトが、同じメッセージに様々な方法で応答することを可能にしました。

プログラム開発におけるOOPの重要性

OOPには、従来の手続き型プログラミング パラダイムに比べて、以下のような利点があります。

  • モジュール性の向上:OOPは、開発者がコードをオブジェクトと呼ばれるより小さな自己完結型のユニットに分割することを可能にし、コードを理解、保守、再利用しやすくします。
  • コードの再利用性の向上:既存のクラスから継承することによって、開発者はコードを再利用することができ、冗長なロジックを書かずに済みます。
  • カプセル化:カプセル化は、不正なアクセスおよび修正からデータを保護し、プログラムをより堅牢でセキュアなものにします。
  • 保守性の向上:OOPコードは、モジュール性およびカプセル化のおかげで、一般に、保守および修正をより簡単に行えます。
  • 柔軟性および拡張性:OOPプログラムは、既存のコードを継承し、改変して流用できるため、柔軟性および拡張性が高くなります。

RPGLEは、オブジェクト指向プログラミングのすべての基本原則を完全に取り入れているわけではありませんが、4つの柱のうち、以下の2つをサポートしています。

カプセル化

カプセル化は、データと、そのデータを操作するコードを単一のユニットにバンドルすることで、外部からの修正からデータを保護し、モジュール性を高めます。RPGLEは、以下のようにしてカプセル化を実装します。

  • プロシージャー:RPGLEプロシージャーは、コードとデータを効率的にカプセル化し、別々に再利用および管理できる自己完結型のユニットとして機能します。
  • プロトタイプ:プロトタイプは、プロシージャーの設計図としての役割を果たし、それらの構造およびアクセス性を定義し、さらにカプセル化を適用します。

継承

継承は、新しいクラス(RPGLEにおけるデータ タイプ)が、既存のクラス(データ タイプ)からプロパティおよびメソッドを継承することを可能にし、コードの再利用性および階層関係を促進します。RPGLEは、以下のようにして継承を実装します。

  • データ タイプ:RPGLEは、サブ データ タイプを通じて継承をサポートし、新しいデータ タイプが、ベース タイプから特性(フィールドおよびサブフィールド)を継承することを可能にします。

以下に、継承の例を示します。

1	**FREE
2	Ctl-Opt Main(demonstrate_inheritance);

3	dcl-ds Parent Qualified Template;
4	  Name char(30);
5	  Age int(10);
6	end-ds;

7	dcl-ds Child Qualified;
8	  base_Info likeds(Parent);
9	  Grade Char(2);
10	end-ds;

11	dcl-proc demonstrate_inheritance;

12	  dcl-ds ParentObj likeds(Parent);
13	  dcl-ds ChildObj  likeds(Child);

14	  ParentObj.Name = 'John Doe';
15	  ParentObj.Age = 40;

16	  ChildObj.base_Info.Name = 'Jane Smith';
17	  ChildObj.base_Info.Age = 10;
18	  ChildObj.Grade = 'A';

19	  dsply ('Parent Name: ' + ParentObj.Name);
20	  dsply ('Parent Age: '  + %char(ParentObj.Age));

21	  dsply ('Child Name: '  + ChildObj.base_Info.Name);
22	  dsply ('Child Age: '   + %Char(ChildObj.base_Info.Age));
23	  dsply ('Child Grade: ' + ChildObj.Grade);

24	end-proc demonstrate_inheritance;

上の例では、3行目に、「Name」および「Age」サブフィールドを持つ単純なデータ構造「Parent」があります。7行目には、「Child」というデータ構造があり、これは「Parent」と同じサブフィールドを持つことになりますが、さらに、「Grade」サブフィールドもあります。このようにして、データ構造「Child」は、最初の2つのサブフィールドをデータ構造「Parent」から継承すると言うことができます。いつも受講生に言っていることですが、「ただし、私の言うことを鵜呑みにするだけでなく、自分自身でコーディングし、デバッグして綿密に調べるようにしてください。」

まとめると、RPGLEは、完全なオブジェクト指向プログラミング体験を提供しているわけではありませんが、カプセル化と継承のサポートにより、開発者は、コードの再利用性、モジュール性、組織化など、OOPのメリットを享受することができます。

あわせて読みたい記事

PAGE TOP