■ メソッドを分けることについて
なぜ必要なのか
・可読性(読みやすさ)
・柔軟性(修正のしやすさ)
・再利用性(使いまわしやすさ)
mainメソッド内にすべてのソースコードを記述して把握しきれるような業務システムはまず存在しないだろう
例えばATMのシステムをイメージとして考えたときに
・受付(50行)
・残高問合せ(50行)
・入出金(50行)
・振込(50行)
という4つの仕事をするものとして、これらすべてのソースコードを、実行するmainメソッド内に記述し、修正が必要となった場合に、まずこれら200行のコードの中から修正箇所を探さなければならない
通常の数千、数万行にもなる業務システムでは尚更大変な作業となる
受付メソッドや残高問合せメソッドのように部品化しておくことで、修正範囲もある程度特定ができ、プログラム全体も分割した部品の組み合わせであるため見やすくなる
またコードを書いていて同じ作業をさせたい部分が出てくれば、同じメソッドを再利用して余計なコードを記述せず、手間も省くことができる、ということ
以下、渡した2つの引数を足して戻すだけの計算メソッド
public static void main(String[] args) {
int sum1 = calc(10, 20);
System.out.println(sum1);
int sum2 = calc(20, 40);
System.out.println(sum2);
public static int calc(int a, int b) {
int ans = a + b;
return ans;
}
}
■ クラス、パッケージに分ける
メソッド分けしても増えすぎれば読みづらいことには変わらないため、クラスやパッケージとしてまとめることで解消する
以下、mainメソッドのクラス、渡された引数で足し引きのみ行うクラス、掛ける割るのみ行うクラスに分類
【mainメソッドのクラス】
public class Calc {
public static void main(String[] args) {
int plus = Plussub.tasu(10, 20);
System.out.println(plus);
double division = Muldiv.waru(10, 20);
System.out.println(division);
}
}
【加算減算クラス】
public class Plussub {
public static int tasu(int a, int b) {
int plus = a + b;
return plus;
}
public static int hiku(int a, int b) {
int subtraction = a - b;
return subtraction;
}
}
【乗算除算クラス】
public class Muldiv {
public static int kakeru(int a, int b) {
int multiplication = a * b;
return multiplication;
}
public static double waru(double a, double b) {
double division = (a / b);
return division;
}
}
メソッドをクラス分けするとmainメソッドのクラスからはスコープの外になるため、クラス名.メソッド名で指定して呼び出す必要がある
また同じ要領でパッケージ分けした際にはパッケージ名.クラス名.メソッド名(完全修飾名)で呼び出すかインポートする必要がある
■ オブジェクト指向に沿った部品化
これまでは、あくまでmainメソッド内の作業を他のメソッドやクラスとして分割していただけだが、オブジェクト指向はより可読性、柔軟性、再利用性を向上させるために、ヒトやモノなど現実世界のものになぞらえてクラスに分割し、プログラムを作成するという考え方
各オブジェクトはそれぞれプログラムに対して負うべき責任を持ち、それに対してフィールド(属性)とメソッド(振る舞い)が定義される
部品化というが、正確には部品(オブジェクト)そのものではなく、クラスという設計図を定義する
mainメソッドを持つクラスはその設計図を生み出し(インスタンス化し)動かす。
以下、自己紹介をする人の設計図であるHumanクラスをmainメソッドを持つクラスでインスタンス化させ、TanakaとYamadaという2つ(人)のオブジェクトを生成させる
mainメソッドを持つクラス
public class Main {
public static void main(String[] args) {
Human h1 = new Human();
h1.name = "Tanaka";
h1.age = 25;
h1.address = "Tokyo";
h1.hp = 100;
h1.greet();
Human h2 = new Human();
h2.name = "Yamada";
h2.age = 28;
h2.address = "Kanagawa";
h2.hp = 130;
h2.greet();
{
{
【自己紹介するHumanクラス】
public class Human {
String name;
int age;
String address;
int hp;
public void greet() {
hp = hp - 10;
System.out.print("My name is " + name + ".");
System.out.print("I'm " + age + " years old.");
System.out.print("I live in " + address + ". ");
System.out.println("Current HP is " + hp + ".");
}
}
指定した情報を受け取って自己紹介を行うという「責務」を持つ