【初めてのJava】まずはコーディングしてみた（インターフェース）

## はじめに
インターフェースの実装練習として、
前回作成したBMI計算機にBMR（基礎代謝量）を計算する機能を付けてみました。

## 機能
　身体のパラメーター値（身長、体重、年齢など）をセットすると、BMI、BMRの計算結果を出力するツールです。
 （値の入力はハードコーディング）

## ソースコード
※長いので、折りたたんでいます。

<details><div>

```java:App.java
public class App{
    public static void main(String[] args){

        try{
            Person person = new Person();
            if(!person.setParameter("John", 1.7, 60.5, 30, Person.Sex.MALE)){
                return;
            };

            Bmi bmi = new Bmi();
            Bmr bmr = new Bmr();

            bmi.calculation(person);
            bmr.calculation(person);

            person.display();
            bmi.explain();
            bmr.explain();

        }catch(Exception e){
            System.out.println("計算できませんでした");
            System.out.println("入力した値を確認してください");
        }
    }
}
```
```java:BodyComposition.java
public interface BodyComposition {
    void calculation(Person person);
    void explain();
}
```
```java:Bmi.java
public class Bmi implements BodyComposition {
    public void calculation(Person person){

        try{
            person.setBmi(person.getWeight() / person.getHeight() / person.getHeight()); 
        }catch(Exception e){
            System.out.println("入力値を確認してください");
        }        
    }

    public void explain(){
        System.out.println("======= BMIの算出 =======");
        System.out.println("体重kg ÷ (身長m)2");
        System.out.println("18.5未満 痩せ/ 25以上 肥満");
    }
}
```
```java:Bmr.java
public class Bmr implements BodyComposition{
    public void calculation(Person person){

        try{
            if(person.getSex() == Person.Sex.MALE){
                person.setBmr((0.1238 + (0.0481 * person.getWeight()) + (0.0234 * person.getHeight()*100) - (0.0138 * person.getAge()) - 0.5473) * 1000 / 4.186);
            }else{
                person.setBmr((0.1238 + (0.0481 * person.getWeight()) + (0.0234 * person.getHeight()*100) - (0.0138 * person.getAge()) - 0.5473 * 2) * 1000 / 4.186);
            }
        }catch(Exception e){
            System.out.println("入力値を確認してください");
        }        
    }

    public void explain(){
        System.out.println("======= BMRの算出 =======");
        System.out.println("(0.1238＋（0.0481 × 体重kｇ）＋（0.0234 × 身長cｍ）－（0.0138 × 年齢）－性別指数）× 1000 ÷ 4.186");
        System.out.println(" ※ 性別指数　男：0.5473　女：0.5473 × 2");
    }    
}
```
```java:Person.java
public class Person {
    private String name;
    private double height = 0.0;
    private double weight = 0.0;
    private int age = 0;
    public enum Sex{
        MALE,
        FEMALE
    }
    private Sex sex = Sex.MALE;
    private double bmi = 0.0;
    private double bmr = 0.0; // 基礎代謝量

    public static final double HEIGHT_MAX = 3.0;
    public static final double WEIGHT_MAX = 700.0;
    public static final int AGE_MAX = 150;

    public boolean setParameter(String name, double height, double weight, int age, Sex sex){

        if(!isValidHeight(height) || !isValidWeight(weight) || !isValidAge(age)){
            return false;
        }
        this.name = name;
        this.height = height;
        this.weight = weight;
        this.age = age;
        System.out.println("正しくセットされました");
        return true;
    }

    public void display(){
        System.out.println("名前: " + this.name);
        System.out.println("身長: " + this.height);
        System.out.println("体重: " + this.weight);
        System.out.println("BMI: " + this.bmi);
        System.out.println("BMR: " + this.bmr);
    }

    private boolean isValidHeight(double height){
        if((0 > height) || (height > HEIGHT_MAX)){
            System.out.println("身長の値を間違えています。");
            System.out.println("身長の単位はmでセットしてください。");
            System.out.println("（" + HEIGHT_MAX + "mまで）");
            return false;
        }
        return true;
    }
    private boolean isValidWeight(double weight){
        if((0 > weight) || (weight > WEIGHT_MAX)){
            System.out.println("体重の値を間違えています。");
            System.out.println("体重の単位はkgでセットしてください");
            System.out.println("（" + WEIGHT_MAX + "kgまで）");
            return false;
        }
        return true;
    }
    private boolean isValidAge(double age){
        if((0 > age) || (age > AGE_MAX)){
            System.out.println("年齢の値を間違えています。");     
            System.out.println("（" + AGE_MAX + "才まで）");
            return false;
        }
        return true;
    }
    
    // setter / getter
    public double getHeight() {
        return this.height;
    }
    public double getWeight() {
        return this.weight;
    }
    public int getAge() {
        return this.age;
    }
    public Sex getSex() {
        return this.sex;
    }
    public void setBmi(double bmi) {
        this.bmi = bmi;
    }
    public void setBmr(double bmr) {
        this.bmr = bmr;
    }
}
```
</div></details>

## 結果
```:
$ java App
正しくセットされました
名前: John
身長: 1.7
体重: 60.5
BMI: 20.93425605536332
BMR: 1445.4252269469664
======= BMIの算出 =======
体重kg ÷ (身長m)2
18.5未満 痩せ/ 25以上 肥満
======= BMRの算出 =======
(0.1238＋（0.0481 × 体重kｇ）＋（0.0234 × 身長cｍ）－（0.0138 × 年齢）－性別指数）× 1000 ÷ 4.186
 ※ 性別指数　男：0.5473　女：0.5473 × 2
```

## 感想
今回も作成に2時間くらいかかりました。
課題を考えること自体、理解を深める作業になりました。
実際の業務では BMIとBMRの計算をクラス分けする必要性はないのかもしれません。
もう少しうまい課題を作れたらなと感じました。