Есть ли способ сделать этот код короче? - PullRequest
0 голосов
/ 11 мая 2018

Это простой код, однако, я хочу знать, смогу ли я как-то сделать его короче, я не знаю так много, чтобы даже знать, что искать, поэтому я не ищу кого-то, чтобы переписать, если бы яЯ только хочу, чтобы кто-то сказал мне, какие методы мне следует использовать, как я вызываю переменную, написанную пользователем вне if, или такие вещи, которые могут мне помочь.Я новичок в кодировании, так что извините, если я задаю глупый вопрос.

    System.out.println("Write name: ");
    name = s.nextLine();
    System.out.println("Write last name: ");
    lastName = s.nextLine();
    System.out.println("Write id: ");
    id = s.nextInt();
    System.out.println("Write your average GPA: ");
    average = s.nextDouble();

    System.out.println("Your name is:" +name+ "\nYour last name is: " 
   +lastName+ "\nYour GPA is: " +average+ "\nYearly tuition is: " 
   +tuitionCost);

    if(average >= 9.0){
        System.out.println("Your discount is: 20% off.");
        d = 100-20;
        total = (d * tuitionCost)/100;
        System.out.println("Your yearly tuition is: " +total);
    }
    else if(average <= 8.99 && average >= 8.5){
        System.out.println("Your discount is: 10% off.");
        d = 100-10;
        total = (d * tuitionCost)/100;
        System.out.println("Your yearly tuition is: " +total);
    }
    else if(average <= 8.49 && average >= 8.0){
        System.out.println("Your discount is: 5% off.");
        d = 100-5;
        total = (d * tuitionCost)/100;
        System.out.println("Your yearly tuition is: " +total);
    }
    else{
        System.out.println("You have no discount. Your yearly tuition is: " 
   +tuitionCost);
    }

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Да, вы можете упростить на

int discount = -1;
if(average >= 9.0){
    discount = 20;
}
else if(average <= 8.99 && average >= 8.5){
    discount = 10;
}
.
.

 System.out.printf("Your discount is: %d%% off.%n", discount);
 d = 100-discount;
 total = (d * tuitionCost)/100;
 System.out.println("Your yearly tuition is: " +total);

Примечание

if-else может быть лучше как образец

0 голосов
/ 11 мая 2018

Вы можете превратить ваши скидки в класс:

class Discount {
    private final List<Tier> tiers = List.of(
        new Tier(0.0, 0), new Tier(8.0, 5), new Tier(8.5, 10), new Tier(9.0, 20));

    private class Tier {
        private final double gpa;
        private final int discount;
    }

    private int discount(double gpa) {
        return tiers.stream().filter(t -> t.gpa <= gpa)
            .mapToDouble(t -> t.discount).max().getAsDouble();
    }

    public double tuition(double gpa, double base) {
        return (1.0 - discount(gpa)/100.0) * base;
    }

    public String discountMessage(double gpa) {
        if (discount(gpa) == 0)
            return "You have no discount";
        else
            return "Your discount is " + discount(gpa) + "%";
    }
}

Я пропустил некоторые детали, но вы поняли.

Это может быть излишним - это будет зависеть от того, какчасто уровни могут меняться.Но он удовлетворяет принципу СУХОЙ (не повторяйте себя).Это делает ваш код более устойчивым: менее вероятно, что вы измените свой код в одном месте и забудете изменить его в другом месте.

Вы упоминаете, что делаете свой код короче.Я согласен с принципом, что вы должны искать ясности перед краткостью.

0 голосов
/ 11 мая 2018

Ну, логика, конечно, могла бы быть упрощенной немного: если вы осторожно пишете последовательность if..else if в порядке убывания, ваша логика может быть просто:

 /* CAUTION: KEEP IN DESCENDING ORDER!  ... yes, add this comment! */
 if (average >= 9.0) {
 }
 else if (average >= 8.5) {
 }

... и так далее. (что также делает каждое из if -условий непротиворечивым.)

Теперь, будьте очень осторожны, чтобы ваше дело else сделало все то же, что и все остальные дела: ему следует присвоить значения d и total.Он должен «выглядеть точно так же, как и все остальные».

Кроме того, я, вероятно, не изменил бы ни одной вещи, и вот почему: логика теперь «довольно очевидна на первый взгляд» и каждый из случаев явно независим.Если «отдел маркетинга» неожиданно выдвигает грандиозную новую идею, которая применима только к некоторым случаям, но не к другим ... (а отделы маркетинга всегда так) ... вы застрахованы.Будущие программисты могут просто «делать небольшие целевые коммиты» для этой логики, и им никогда не придется переписывать ее.

...