【初めてのJava】まずはコーディングしてみた（クラス）

## はじめに

HelloWorldの次として、BMI計算機を書いてみることにしました。

## 機能
　標準入力で身長、体重を入力すると、BMIの計算結果を出力するだけのツールです。
  メインメソッドで終わってしまう内容ですが、目的はJavaを理解するためのコーディングなので  BMIを計算するクラスを別に立てています。

## ソースコード(初回投稿時)
<details><div>
```java:App.java
import java.util.Scanner;

public class App{
    public static void main(String[] args){

        calcBmi bmi = new calcBmi();
        Scanner scanner = new Scanner(System.in);
        double height = 0.0;
        double weight = 0.0;

        try{
            System.out.println("身長を入力してください");
            height = scanner.nextDouble();

            System.out.println("体重を入力してください");
            weight = scanner.nextDouble();
        }catch(Exception e){
            System.out.println("数値を入力してください");
            return;
        }finally{
            scanner.close();
        }
        if(!bmi.setBmiParameter(height,weight)){
            return;
        };
        if(!bmi.calculationBmi()){
            return;
        };
        if(!bmi.bmiResultDisplay()){
            return;
        };
    }
}
```

```java:calcBmi.java
public class calcBmi {
    protected double height;
    protected double weight;
    protected double bmi;

    protected static double HEIGHT_MAX;
    protected static double WEIGHT_MAX;

    calcBmi(){
        initHeightAndWeight();
        HEIGHT_MAX = 3.0;
        WEIGHT_MAX = 700.0;
    }

    protected void initHeightAndWeight(){
        this.height = 0.0;
        this.weight = 0.0;
    }

    boolean setBmiParameter(double height, double weight){

        if(!checkHeight(height) || !checkWeight(weight)){
            initHeightAndWeight();
            return false;
        }
        this.height = height;
        this.weight = weight;
        System.out.println("正しくセットされました");
        return true;
    }

    boolean calculationBmi(){
        this.bmi = (this.weight / this.height / this.height);
    
        return true;
    }

    boolean bmiResultDisplay(){
        System.out.println("身長" + this.height);
        System.out.println("体重" + this.weight);
        System.out.println("BMI" + this.bmi);

        return true;
    }

    protected boolean checkHeight(double h){
        if((0 >= h) || (h >= HEIGHT_MAX)){
            System.out.println("身長の値を間違えています。身長の単位はmでセットしてください");
            return false;
        }
        return true;
    }
    protected boolean checkWeight(double w){
        if((0 >= w) || (w >= WEIGHT_MAX)){
            System.out.println("体重の値を間違えています。体重の単位はkgでセットしてください");     
            return false;
        }
        return true;
    }
}
```
</div></details>

## ソースコード（修正）
※コメントを参考にしたり、後から気づいた改善点を反映したものです

```java:Body.java
/*
初回からの主な変更点
・メソッドの戻り値 Booleanをboolean型に変更
・クラス名calcBmiをBodyに変更
・メソッド名check〜をisValid〜に変更
・クラスBodyの変数(height,weight,bmi)や一部のメソッドの戻り値について、protectedをprivateに変更
　（カプセル化したい目的に対して実装が間違えていた）
・HEIGHT_MAX、WEIGHT_MAXを定数とするため、finalを設定
*/

public class Body {
    private double height;
    private double weight;
    private double bmi;

    protected static final double HEIGHT_MAX = 3.0;
    protected static final double WEIGHT_MAX = 700.0;

    Body(){
        this.height = 0.0;
        this.weight = 0.0;
    }

    boolean setParameter(double height, double weight){

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

    void calculation(){
        bmi = weight / height / height;    
    }

    void display(){
        System.out.println("身長" + this.height);
        System.out.println("体重" + this.weight);
        System.out.println("BMI" + this.bmi);
    }

    private boolean isValidHeight(double h){
        if((0 >= h) || (h >= HEIGHT_MAX)){
            System.out.println("身長の値を間違えています。身長の単位はmでセットしてください");
            return false;
        }
        return true;
    }
    private boolean isValidWeight(double w){
        if((0 >= w) || (w >= WEIGHT_MAX)){
            System.out.println("体重の値を間違えています。体重の単位はkgでセットしてください");     
            return false;
        }
        return true;
    }
}
```
```java:App.java
/*
初回からの主な変更点
・try with-resources文を使ってScannerオブジェクトを自動的にクローズするように変更
・変数やクラスBodyのオブジェクト生成場所をtryの中に入れて　スコープを限定
*/

import java.util.Scanner;
public class App{
    public static void main(String[] args){
        try(Scanner scanner = new Scanner(System.in)){
            double height;
            double weight;
            Body bmi = new Body();

            System.out.println("身長を入力してください 単位[m]");
            height = scanner.nextDouble();

            System.out.println("体重を入力してください 単位[kg]");
            weight = scanner.nextDouble();

            if(!bmi.setParameter(height,weight)){
                return;
            };
            bmi.calculation();
            bmi.display();

        }catch(Exception e){
            System.out.println("数値を入力してください");
        }
    }

}
```

## 結果
```:正しい入力時
$ java App
身長を入力してください
1.7
体重を入力してください
66
正しくセットされました
身長1.7
体重66.0
BMI22.837370242214536
```
```:間違いのある入力時
$ java App
身長を入力してください
170
体重を入力してください
55
身長の値を間違えています。身長の単位はmでセットしてください
```
## 感想
作成に2時間くらいかかりました。
BMIの計算結果は間違えていないようです。
まずは慣れていくことが重要だと思いますので、続けていこうと思います。