Пример с оператором if из книги

206
22 февраля 2019, 23:20

Из книги: Давайте изменим метод dive() в классе Fish, чтобы ограничить сотней метров глубину, на которой может плавать наша рыбка:

public class Main {
    public static void main(String[] args) {
        Fish myFish = new Fish();
        myFish.dive(50);
    }
}


public class Fish  {
    int currentDepth = 0;
    public int dive(int howDeep) {
        currentDepth = currentDepth + howDeep;
        if (currentDepth > 100) {
            System.out.println("Я маленькая рыбка и не могу плавать глубже 100 метров");
            currentDepth = currentDepth - howDeep;
        } else {
            System.out.println("Я погружаюсь еще на " + howDeep + " метров");
            System.out.println("Я на глубине " + currentDepth + " метров");
        }
        return currentDepth;
    }
}

Всё работает, но я не понял зачем вот эта строчка:

currentDepth = currentDepth - howDeep;

Просто мы сначала простыми словами делаем так: 0 = 0 + введенное число; Если (currentDepth больше 100) то вывести ... иначе ...

Ну вот только не пойму зачем строчка currentDepth = currentDepth - howDeep; То есть изначально у нас значение myFish.dive(50); = 50;

А currentDepth = currentDepth - howDeep; // это будет 50 = 50 - 50; Если и без неё прекрасно всё работает(вроде как). Объясните пожалуйста! Где тут логика? Или меня понесло не в ту сторону?

Answer 1
  • По условию задачи предполагается, что currentDepth не должно превышать 100
  • Первым действием в методе происходит увеличение currentDepth на заданное значение (howDeep). Например, currentDepth было 80, howDeep - 50, в итоге currentDepth стало 130
  • Если получившееся значение больше максимально допустимого (например, currentDepth = 130), то нужно отменить уже произведённое увеличение currentDepth. Для этого, собственно, из него и вычитается уже добавленное значение, чтобы currentDepth снова стало равно 80

Вообще, это несколько проблемный подход (из-за необходимости откатывать значение, что является усложнённым вариантом дублирования кода). На мой взгляд, проще и понятнее проверять, не выйдет ли новое значение за границы, и изменять текущее только в том случае, если новое значение допустимо:

public int dive(int howDeep)
{
    int newDepth = currentDepth + howDeep;
    if (newDepth > 100)
    {
        System.out.println("Я маленькая рыбка и не могу плавать глубже 100 метров");
    }
    else
    {
        currentDepth = newDepth;
        System.out.println("Я погружаюсь еще на " + howDeep + " метров");
        System.out.println("Я на глубине " + currentDepth + " метров");
    }
    return currentDepth;
}
Answer 2

Возвращаем currentDeep к исходному значению, если рыбка не нырнула, т.к. конечная глубина была бы больше, чем рыбка может.

Если же в if поставить

    if ((currentDepth + howDeep) > 100)

то строчка currentDepth = currentDepth - howDeep; не потребуется, потому что значение currentDeep не будет изменено.

READ ALSO
найти элемент по тексту в теге span

найти элемент по тексту в теге span

Подскажите, как найти элемент по тексту в теге span?

202
Области видимости пакетов внутри java project в Eclipse

Области видимости пакетов внутри java project в Eclipse

Не до конца понимаю, в чем разница между java проектами и пакетами в Eclipse IDEСкажем, есть два проекта: ProjectA и ProjectB

166
Стили в vaadin 8

Стили в vaadin 8

Недавно начал работать c vaadin 8, и все никак не получается менять стилиНапример я пишу свой стиль в файл mytheme

188
Что значит аннтотация @XmlType

Что значит аннтотация @XmlType

Есть класс, который я хочу сериализовать в XML:

199