错误方法太复杂,无法通过数据流算法进行分析

con*_*nor 9 css java android

这是导致问题的方法.我正在创建一个BMI计算器,它使用年龄,体重和身高来计算最终结果.我不确定我的逻辑是否错误或是否还有其他问题

public void calculateClickHandler(View view) {   
    String Outcome;
    Outcome = null;

    age = Float.parseFloat(txtHowOld.getText().toString());
    feet = Float.parseFloat(txtFt.getText().toString());
    inches = Float.parseFloat(txtIn.getText().toString());
    pounds = Float.parseFloat(txtWeight.getText().toString());
    height = (feet * 12) + inches;
    double BMI1 = (pounds / (height * height)) * 703.0;


    if (btnF.isChecked()) {
        if (age >= 20 && age <= 40) {
            if (BMI1 < 21) {
                Outcome = "Underweight";
            } else if (BMI1 >= 21 && BMI1 <= 33) {
                Outcome = "Healthy";
            }
            else if (BMI1 > 33 && BMI1 <= 39) {
                Outcome = "Overweight";
            } else if (BMI1 > 39) {
                Outcome = "Obese";
            } else if (age >= 41 && age <= 60) {
                if (BMI1 < 23) {
                    Outcome = "Underweight";
                } else if (BMI1 >= 23 && BMI1 <= 35) {
                    Outcome = "Healthy";
                } else if (BMI1 > 35 && BMI1 <= 40) {
                    Outcome = "Overweight";
                } else if (BMI1 > 40) {
                    Outcome = "Obese";
                }
            } else if (age >= 61 && age <= 79) {
                if (BMI1 < 24) {
                    Outcome = "Underweight";
                } else if (BMI1 >= 24 && BMI1 <= 36) {
                    Outcome = "Healthy";
                } else if (BMI1 > 36 && BMI1 <= 42) {
                    Outcome = "Overweight";
                } else if (BMI1 > 42) {
                    Outcome = "Obese";
                }

            }
        }

        if (btnM.isChecked()) {
            if (age >= 20 && age <= 40) {
                if (BMI1  < 8) {
                    Outcome = "Underweight";
                } else if (BMI1  >= 8 && BMI1  <= 19) {
                    Outcome = "Healthy";
                } else if (BMI1  > 19 && BMI1  <= 25) {
                    Outcome = "Overweight";
                } else if (BMI1  > 25) {
                    Outcome = "Obese";
                }
            } else if (age >= 41 && age <= 60) {
                if (BMI1  < 11) {
                    Outcome = "Underweight";
                } else if (BMI1  >= 11 && BMI1  <= 22) {
                    Outcome = "Healthy";
                } else if (BMI1  > 22 && BMI1  <= 27) {
                    Outcome = "Overweight";
                } else if (BMI1  > 27) {
                    Outcome = "Obese";
                }
            } else if (age >= 61 && age <= 79) {
                if (BMI1  < 13) {
                    Outcome = "Underweight";
                } else if (BMI1  >= 14 && BMI1  <= 25) {
                    Outcome = "Healthy";
                } else if (BMI1  > 25 && BMI1  <= 27) {
                    Outcome = "Overweight";
                } else if (BMI1  > 27) {
                    Outcome = "Obese";
                }
            }


            BMI2.setText(Outcome);
        }
    }
}

}
Run Code Online (Sandbox Code Playgroud)

Bar*_*ett 10

你的逻辑很好.Android Studio(或其他什么?)只是抱怨有太多的分支来计算方法的数字复杂性.

如果您想减轻错误,请创建一个新类来解析BMI值(也许是性别的布尔值或枚举(我假设这是btnM的意思))到一个单独的类或方法中.

---编辑

您可以在下面的代码中看到,通过首先找到适当的边界,然后将边界和BMI1评估为结果来消除冗余范围检查代码.

在制作这些内容的过程中,您还会注意到您的爷爷系列中有一个错误(13/14)并且没有19岁或80岁以上的计算.

public void calculateClickHandler(View view) {
    boolean male = btnM.isChecked() && !btnF.isChecked();
    age, feet, inches, pounds, BMI1 = whatever;
    String outcome = findOutcome(male, BMI1);
    // display outcome somewhere
}

static final int[] bmiRangesLady = { 21, 33, 39 };
static final int[] bmiRangesMom = { 23, 35, 40 };
static final int[] bmiRangesGma = { 24, 36, 42 };

static final int[] bmiRangesMan = { 8, 19, 25 };
static final int[] bmiRangesDad = { 11, 22, 27 };
static final int[] bmiRangesGpa = { 13, 25, 30 };

public static String findOutcome(boolean male, double bmi) {

    int[] bmiRangesToUse;

    if (!male) {
        if (age >= 20 && age <= 40) {
            bmiRangesToUse = bmiRangesLady;
        } else if (age > 40 && age <= 60) {
            bmiRangesToUse = bmiRangesMom;
        } else if (age > 60) {
            bmiRangesToUse = bmiRangesGma;
        }
    } else {
        if (age >= 20 && age <= 40) {
            bmiRangesToUse = bmiRangesMan;
        } else if (age > 40 && age <= 60) {
            bmiRangesToUse = bmiRangesDad;
        } else if (age > 60) {
            bmiRangesToUse = bmiRangesGpa;
        }
    }
    // if you still get hi complexity, the above code can be moved into another method.

    // fge suggests converting the below (or the bmiRanges themselves) into a RangeMap.
    if (bmi < bmiRangesToUse[0]) {
        outcome = "Underweight";
    } else if (bmi >= bmiRangesToUse[0] && bmi <= bmiRangesToUse[1]) {
        outcome = "Healthy";
    } else if (bmi > bmiRangesToUse[1] && bmi <= bmiRangesToUse[2]) {
        outcome = "Overweight";
    } else if (bmi > bmiRangesToUse[2]) {
        outcome = "Obese";
    }

    return outcome;
}
Run Code Online (Sandbox Code Playgroud)