classの分割について(Java)

#classの分割の必要性
以下のような冗長なコードを記述していると可読性が悪化します。
実行部分とロジック部分を同じファイルに記述しているためです。
この記事では実行部分をMainクラス、ロジック部分をpersonクラスに分割する手順について以下の順で記述しております。

1. Personクラスの定義
1. Personクラスにロジック部分のメソッドを移動
1. Personクラスのメソッドを呼び出すように変更 

```Main.java
public class Main {
  public static void main(String[] args) {
    printData(fullName("Kate", "Jones"), 27, 1.6, 50.0);
    printData(fullName("John", "Christopher", "Smith"), 65, 1.75, 80.0);
  }
  
  public static void printData(String name, int age, double height, double weight) {
    System.out.println("私の名前は" + name + "です");
    System.out.println("年齢は" + age + "歳です");
    System.out.println("身長は" + height + "mです");
    System.out.println("体重は" + weight + "kgです");

    double bmi = bmi(height, weight);
    System.out.println("BMIは" + bmi + "です");

    if (isHealthy(bmi)) {
      System.out.println("標準値です");
    } else {
      System.out.println("標準値の範囲外です");
    }
  }

  public static String fullName(String firstName, String lastName) {
    return firstName + " " + lastName;
  }

  public static String fullName(String firstName, String middleName, String lastName) {
    return firstName + " " + middleName + " " + lastName;
  }
  
  public static double bmi(double height, double weight) {
    return weight / height / height;
  }

  public static boolean isHealthy(double bmi) {
    return bmi >= 18.5 && bmi < 25.0;
  }
}
```
#Personクラスの定義
上記のMain.javaは以下の構成で記述しています。

- 実行部分
 - mainメソッド
- ロジック部分
 - printDataメソッド
 - fullNameメソッド
 - bmiメソッド
 - isHealthyメソッド

まず、Person.javaを作成しPersonクラスを定義します

```Person.java
 class Person {
}
```

#Personクラスにロジック部分のメソッドを移動
次に、mainクラスのロジック部分をPersonクラスに移動させます。

- ロジック部分
 - printDataメソッド
 - fullNameメソッド
 - bmiメソッド
 - isHealthyメソッド

```Person.java
 class Person {
   public static void printData(String name, int age, double height, double weight) {
    System.out.println("私の名前は" + name + "です");
    System.out.println("年齢は" + age + "歳です");
    System.out.println("身長は" + height + "mです");
    System.out.println("体重は" + weight + "kgです");

    double bmi = bmi(height, weight);
    System.out.println("BMIは" + bmi + "です");

    if (isHealthy(bmi)) {
      System.out.println("標準値です");
    } else {
      System.out.println("標準値の範囲外です");
    }
  }

  public static String fullName(String firstName, String lastName) {
    return firstName + " " + lastName;
  }

  public static String fullName(String firstName, String middleName, String lastName) {
    return firstName + " " + middleName + " " + lastName;
  }
  
  public static double bmi(double height, double weight) {
    return weight / height / height;
  }

  public static boolean isHealthy(double bmi) {
    return bmi >= 18.5 && bmi < 25.0;
  }
}
```

```Main.java
public class Main {
  public static void main(String[] args) {
    printData(fullName("Kate", "Jones"), 27, 1.6, 50.0);
    printData(fullName("John", "Christopher", "Smith"), 65, 1.75, 80.0);
  }
}
```
#Personクラスのメソッドを呼び出すように変更
分割できましたが、このままMainクラスを実行するとエラーになります。
最後に、MainクラスにPersonクラスのメソッドを呼び出すための記述を以下のように追加します。

```Main.java
public class Main {
  public static void main(String[] args) {
    Person.printData(Person.fullName("Kate", "Jones"), 27, 1.6, 50.0);
    Person.printData(Person.fullName("John", "Christopher", "Smith"), 65, 1.75, 80.0);
  }
}
```
これで問題なく実行できます。