システム最構築
平成の時代になりA君も課長へ昇進していました。そして全システム再構築の指揮を取ることになったのです。あらためてシステムの概要を確認すると、プログラム数が500本ほどありまます。もちろんこの中にはA君が作成したX,Y,Zプログラムも健在です。そして、プログラムがどのような関係にあるのかベテラン課員しかわからなくなっており、プログラムを保守するのさえ困難な状況でした。
「Java、オブジェクト指向だな」A君が決断しました。再構築の方針をオブジェクト指向を導入し、プログラムの再利用可、保守性の向上としたのです。早速、課長であり技術リーダーであるA君がプロトタイプのプログラムを作成しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
package jp.ayax; public class Main { public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ System.out.println("---X処理開始"); X processx = new X(); } } //処理でベースとなるクラス class Base{ public Base(){ process1(); process2(); } //絶対に変更にならない処理1 public void process1(){ System.out.println("process1"); } //絶対に変更にならない処理2 public void process2(){ System.out.println("process2"); } } //X処理 class X extends Base{ public X(){ process3(); process4(); } //X処理独自処理 public void process3(){ System.out.println("process3"); } //X処理独自処理 public void process4(){ System.out.println("process4"); } } |
1 2 3 4 5 |
---X処理開始 process1 process2 process3 process4 |
extends
こちらのソースコードで注目して欲しいのは、11行目,26行目です。
11 |
class Base{ |
26 |
class X extends Base{ |
プログラム(クラス)BaseとXが定義されています。そして26行目の「extends Base」でプログラムXはプログラムBaseを継承します。継承することで、プログラムXはプロクラムBaseのメソッド( process1、 process1)や変数を利用できます。
「つまり、プログラムBaseは、共通処理ということ?」
ベテランのBはオブジェクト指向の導入に懐疑的なためか勉強会の最中、不満顔でA課長に聞いてきました。
「はい。今はそのようなイメージでいいです。」
トレース
確認のためプログラムをトレースしていきます。最初に動くのは、クラス(プログラム)Mainです。そして6行目で処理開始を表示しています。
3 4 5 6 7 8 9 |
public class Main { public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ System.out.println("---X処理開始"); X processx = new X(); } } |
7行目でクラスXを使えるようにして(new X())、変数processxに格納しています。
「プログラムを変数にして意味あるの?」
ベテランBが不思議そうに聞いてきます。
「変数を利用してメソッド(関数)を起動したりできます。例えばこんな感じです。」A課長がホワイトボートへ書き込みます。
1 2 |
processx.process1(); processx.process3(); |
「これで柔軟にプログラムを制御できるのです。」
「実行結果を見るとクラスXなどのメソッドが実行されているようなんですが、クラスMainで記述が見当たらないんです?」新人のCが尋ねてきました。
1 2 3 4 5 |
---X処理開始 process1 process2 process3 process4 |
「はい。ではトレースを進めていきましょう。」
7行目でクラスXが使えるようになりますが、それと同時にクラスXの一部のプログラムが実行されます。それが26行目~29行目です。
25 26 27 28 29 |
class X extends Base{ public X(){ process3(); process4(); } |
メソッドの記述をしていますが、このメソッドはクラス名(X)と同じ名前になっています。クラス名と同名のメソッドは、クラスを使えるようにした時に実行される特殊なメソッドなのです。
「つまり、7行目でクラスXをnewしているので、クラスのメソッドXが実行されるのですね。」
「はい。そうです。」
「でも、実行結果を見るとクラスBaseのprocess1、process2も動いているんだが?」
「クラスXはクラスBassを継承しているので、クラスBassの特殊なメソッド、Bassも同時に動きます。」
10 11 12 13 14 |
class Base{ public Base(){ process1(); process2(); } |
ベテランBも新人Cも納得したようです。ちなみにクラスをnewして使えるようにすることを「インスタンス化」、newした時に実行される特殊なメソッドを「コンストラクタ」と言います。