Java のメソッドを分けると何が良い?メリットを理解しよう
新人
「Java でメソッドを分けると、どんな良いことがありますか?」
先輩
「メソッドを分けることで、プログラムの見やすさや再利用性が向上するんだ。詳しく説明していくよ!」
1. Java のメソッドとは?(基本的な説明)
Java の「メソッド」とは、プログラムの処理をまとめた機能のことです。メソッドを使うことで、同じ処理を何度も書かずに使い回すことができます。
メソッドの基本構造
メソッドは以下のような構造を持っています。
public class MethodExample {
public static void main(String[] args) {
sayHello();
}
public static void sayHello() {
System.out.println("こんにちは!");
}
}
こんにちは!
このように、sayHello というメソッドを作り、main メソッド内で呼び出すことで、プログラムを整理できます。
2. メソッドを分ける基本的な考え方
メソッドを分けることで、プログラムの構造をシンプルにできます。特に、以下のような場合にはメソッドを分けると便利です。
メソッドを分けるべきケース
- ✔ 同じ処理を何度も使う場合
- ✔ 1 つのメソッドが長すぎる場合
- ✔ プログラムの見通しを良くしたい場合
メソッドを分けた場合の例
例えば、三角形の面積を求めるプログラムを考えてみましょう。
public class TriangleArea {
public static void main(String[] args) {
double area = calculateArea(5, 10);
System.out.println("三角形の面積: " + area);
}
public static double calculateArea(double base, double height) {
return (base * height) / 2;
}
}
三角形の面積: 25.0
このように、calculateArea メソッドを作ることで、面積を計算する処理を分かりやすく整理できます。
3. メソッドを分けることでコードが読みやすくなる理由
メソッドを適切に分けることで、プログラムの可読性が向上します。コードが整理され、処理の流れが明確になり、保守がしやすくなります。
メソッドを分けない場合の問題点
例えば、以下のようなコードは 1 つのメソッド内に処理が詰め込まれており、可読性が低くなっています。
public class WithoutMethod {
public static void main(String[] args) {
int a = 5, b = 3;
int sum = a + b;
System.out.println("合計: " + sum);
int product = a * b;
System.out.println("積: " + product);
int difference = a - b;
System.out.println("差: " + difference);
}
}
合計: 8
積: 15
差: 2
このコードでは、足し算・掛け算・引き算の処理がすべて main メソッドに詰め込まれており、後から読む人には理解しづらくなっています。
メソッドを分けることで整理する
以下のようにメソッドを分けると、処理が明確になり、コードが読みやすくなります。
public class WithMethod {
public static void main(String[] args) {
int a = 5, b = 3;
System.out.println("合計: " + add(a, b));
System.out.println("積: " + multiply(a, b));
System.out.println("差: " + subtract(a, b));
}
public static int add(int x, int y) {
return x + y;
}
public static int multiply(int x, int y) {
return x * y;
}
public static int subtract(int x, int y) {
return x - y;
}
}
合計: 8
積: 15
差: 2
このように、add、multiply、subtract の 3 つのメソッドに処理を分けることで、それぞれのメソッドが何をしているのかが分かりやすくなります。
4. メソッドを再利用するとどんなメリットがあるのか
メソッドを作成することで、同じ処理を何度も書かずに済み、再利用性が向上します。
メソッドを使わない場合
例えば、2 つの数の平均を求めるプログラムを考えてみましょう。メソッドを使わない場合、同じ計算式を何度も書くことになります。
public class WithoutReuse {
public static void main(String[] args) {
double avg1 = (10 + 20) / 2.0;
System.out.println("平均: " + avg1);
double avg2 = (30 + 40) / 2.0;
System.out.println("平均: " + avg2);
}
}
平均: 15.0
平均: 35.0
このように、同じ計算を複数回書くと、コードが冗長になり、修正が大変になります。
メソッドを使って再利用する
メソッドを作成すれば、平均を求める処理を 1 つのメソッドにまとめて再利用できます。
public class WithReuse {
public static void main(String[] args) {
System.out.println("平均: " + calculateAverage(10, 20));
System.out.println("平均: " + calculateAverage(30, 40));
}
public static double calculateAverage(double x, double y) {
return (x + y) / 2;
}
}
平均: 15.0
平均: 35.0
メソッドを作ることで、1 回定義すれば何度でも呼び出せるので、コードの修正やメンテナンスがしやすくなります。
5. 実際にメソッドを分けてみよう(サンプルコード付き)
ここまでの内容を活かして、実際にメソッドを使ってプログラムを整理する方法を見ていきましょう。
メソッドを分ける前のコード
例えば、文字列を大文字に変換し、文字数をカウントするプログラムを作るとします。
public class WithoutMethods {
public static void main(String[] args) {
String text = "java programming";
// 大文字に変換
String upperText = text.toUpperCase();
System.out.println("大文字変換: " + upperText);
// 文字数を数える
int length = upperText.length();
System.out.println("文字数: " + length);
}
}
大文字変換: JAVA PROGRAMMING
文字数: 16
このコードでは、変換処理とカウント処理が main メソッド内に混ざっていて、分かりにくくなっています。
メソッドを分けて整理する
次に、文字列の大文字変換と文字数カウントをメソッドとして分けてみましょう。
public class WithMethods {
public static void main(String[] args) {
String text = "java programming";
String upperText = convertToUpperCase(text);
System.out.println("大文字変換: " + upperText);
int length = getStringLength(upperText);
System.out.println("文字数: " + length);
}
public static String convertToUpperCase(String str) {
return str.toUpperCase();
}
public static int getStringLength(String str) {
return str.length();
}
}
大文字変換: JAVA PROGRAMMING
文字数: 16
このようにメソッドを分けることで、convertToUpperCase は文字列を大文字に変換する役割、getStringLength は文字数をカウントする役割と明確に分けられ、コードが整理されました。
6. メソッドを使った効率的なプログラムの書き方
メソッドを活用すると、コードの再利用がしやすくなり、無駄な重複を減らすことができます。
メソッドを使わない場合の問題
例えば、複数の商品の価格を税込価格に計算するプログラムを考えてみます。
public class WithoutMethods {
public static void main(String[] args) {
double price1 = 1000;
double tax1 = price1 * 0.1;
System.out.println("税込価格: " + (price1 + tax1));
double price2 = 2000;
double tax2 = price2 * 0.1;
System.out.println("税込価格: " + (price2 + tax2));
double price3 = 3000;
double tax3 = price3 * 0.1;
System.out.println("税込価格: " + (price3 + tax3));
}
}
税込価格: 1100.0
税込価格: 2200.0
税込価格: 3300.0
同じ計算式を何度も書いているため、コードが冗長になり、修正が必要になったときに手間がかかります。
メソッドを使って効率化する
次に、税込価格を計算するメソッドを作成し、複数の商品の価格計算に活用してみましょう。
public class WithMethods {
public static void main(String[] args) {
System.out.println("税込価格: " + calculateTaxedPrice(1000));
System.out.println("税込価格: " + calculateTaxedPrice(2000));
System.out.println("税込価格: " + calculateTaxedPrice(3000));
}
public static double calculateTaxedPrice(double price) {
return price * 1.1;
}
}
税込価格: 1100.0
税込価格: 2200.0
税込価格: 3300.0
このように、メソッドを作ることでコードの重複を減らし、修正が容易になります。
7. メソッドを分けるとバグを防ぎやすくなる理由
メソッドを適切に分けることで、バグが発生しにくくなり、修正も簡単になります。
メソッドを使わない場合の問題
例えば、商品の合計金額を計算するプログラムで、ミスがある場合を考えます。
public class WithoutMethods {
public static void main(String[] args) {
double price1 = 1500;
double price2 = 2500;
double price3 = 3500;
double total = price1 + price2 * 1.1 + price3 * 1.1; // 計算ミス
System.out.println("合計金額: " + total);
}
}
合計金額: 8250.0
本来はすべての商品に税率をかけるべきですが、price1 に税率が適用されていません。このようなミスを防ぐには、計算処理をメソッドとしてまとめるのが有効です。
メソッドを使ってバグを減らす
税込価格を計算するメソッドを作り、正しい計算を行うように改善します。
public class WithMethods {
public static void main(String[] args) {
double total = calculateTotalPrice(1500, 2500, 3500);
System.out.println("合計金額: " + total);
}
public static double calculateTaxedPrice(double price) {
return price * 1.1;
}
public static double calculateTotalPrice(double p1, double p2, double p3) {
return calculateTaxedPrice(p1) + calculateTaxedPrice(p2) + calculateTaxedPrice(p3);
}
}
合計金額: 8250.0
このように、計算をメソッドとして分けることで、処理が明確になり、ミスを防ぎやすくなります。
8. メソッドを適切に分けるためのポイント
メソッドを適切に分けることで、可読性やメンテナンス性が向上します。ここでは、メソッドを適切に分けるためのポイントを紹介します。
1. 1 つのメソッドは 1 つの役割を持たせる
1 つのメソッドに複数の処理を詰め込むと、可読性が低下します。以下のような例を見てみましょう。
public class BadExample {
public static void main(String[] args) {
displayUserInfo("田中", 30);
}
public static void displayUserInfo(String name, int age) {
System.out.println("名前: " + name);
System.out.println("年齢: " + age);
System.out.println("こんにちは、" + name + "さん!");
}
}
名前: 田中
年齢: 30
こんにちは、田中さん!
このメソッドは「ユーザー情報の表示」と「挨拶」の 2 つの処理を行っています。役割を分けると、より分かりやすくなります。
2. 共通する処理はメソッドにまとめる
処理を再利用する場合は、メソッドとして分けるのが効果的です。
public class GoodExample {
public static void main(String[] args) {
displayUserInfo("田中", 30);
greetUser("田中");
}
public static void displayUserInfo(String name, int age) {
System.out.println("名前: " + name);
System.out.println("年齢: " + age);
}
public static void greetUser(String name) {
System.out.println("こんにちは、" + name + "さん!");
}
}
名前: 田中
年齢: 30
こんにちは、田中さん!
このように、役割を分けることで、コードの再利用性と可読性が向上します。