はじめに
インターフェースの実装練習として、
前回作成したBMI計算機にBMR(基礎代謝量)を計算する機能を付けてみました。
機能
身体のパラメーター値(身長、体重、年齢など)をセットすると、BMI、BMRの計算結果を出力するツールです。
(値の入力はハードコーディング)
ソースコード
※長いので、折りたたんでいます。
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("入力した値を確認してください");
}
}
}
BodyComposition.java
public interface BodyComposition {
void calculation(Person person);
void explain();
}
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以上 肥満");
}
}
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 × 体重kg)+(0.0234 × 身長cm)-(0.0138 × 年齢)-性別指数)× 1000 ÷ 4.186");
System.out.println(" ※ 性別指数 男:0.5473 女:0.5473 × 2");
}
}
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;
}
}
結果
$ 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 × 体重kg)+(0.0234 × 身長cm)-(0.0138 × 年齢)-性別指数)× 1000 ÷ 4.186
※ 性別指数 男:0.5473 女:0.5473 × 2
感想
今回も作成に2時間くらいかかりました。
課題を考えること自体、理解を深める作業になりました。
実際の業務では BMIとBMRの計算をクラス分けする必要性はないのかもしれません。
もう少しうまい課題を作れたらなと感じました。