Лучший способ вернуть разные типы в Java - PullRequest
0 голосов
/ 17 марта 2011
public int attack(Bear bear)
{
    int newStamina=bear.getStamina() - 50;  
    bear.setStamina(newStamina);
    return bear.getStamina();
}

Чтобы расширить свой классный класс Bear, я решил реализовать метод attack (!).

У меня есть 2 экземпляра моего объекта медведя: Bear1 и Bear2.

В моей голове:

Bear1.attack(Bear2);

тогда мой код получает Bear2 текущее значение выносливости и забирает 50 из него, присваивая его переменной newStamina.

Bear2 затем получает эту новую переменную выносливости с помощью метода setStamina.

Затем я возвращаю текущую выносливость после атаки зверского медведя.

Это работает, вроде. Но я думаю, что есть гораздо лучший способ.

Anyhoo. Что я хотел бы сделать, это после:

int newStamina=bear.getStamina() - 50;

есть:

if(newStamina <= 0)
{
    // the bear is dead!
}

Теперь мой метод attack возвращает int, потому что если медведь не умрет, у него все еще есть HP, и я хотел бы вывести этот текущий HP на консоль или куда-либо еще.

Если у медведя нет выносливости, тогда мне нужно вернуть что-то, что означает это.

Что бы вы сделали? Я не могу вернуть false, и я не уверен, что это все равно сработает.

Ответы [ 7 ]

0 голосов
/ 17 марта 2011

, которые могут сделать работу за вас:

public int attack(Bear bear)
    {
        int newStamina=bear.getStamina() - 50;  
        bear.setStamina(newStamina);
        if(newStamina<=0)
        {
          bear.isDead=true;
        }
        return bear
    }

и в своей главной вы проверяете, есть ли у возвращенного медведя выносливость, если не ИГРА НАД ...

0 голосов
/ 17 марта 2011
public static void main()
{    
      Bear b1 = new bear();
      Bear b2 = new bear();
      while(!b2.IsDead())
      {
            b1.attack(b2);
            System.out.println(b2.getStamina());
      }

      System.out.println(b2.getName() + " is dead :(");
}



public class Bear
{
    private int _stamina;

    public int getStamina()
    {
          return _stamina;
    }

    public bool Isdead()
    {
          return _stamina == 0;
    }

    public void sufferAttack(int dommage)
    {
      _stamina = dommage > _stamina ? 0:(_stamina - dommage);
    }

    public void attack(Bear b)
    {
         b.sufferAttack(50);
    }
}

Теперь причина.

Прежде всего.Никогда не выставляйте внутренние атрибуты. Следуя закону Demeters, ничего, кроме самого объекта, не должно быть в состоянии изменить его текущее состояние.

Во-вторых, нет смысла возвращать int (выносливость b2).B1 атака b2 и метод b1, который возвращает выносливость b2?Нет. B1 несет ответственность за атаку b1 и b2, несет ответственность за то, чтобы выдержать атаку и предоставить способ раскрыть его текущее состояние.

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

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

0 голосов
/ 17 марта 2011

Вместо int вы можете вернуть Integer. Если медведь мертв, вы можете вернуть null.

public Integer attack(Bear attackedBear){
    Integer resultingStamina;
    ...
    if(resultingStamina<=0){
        resultingStamina = null;
    }
    return null;
}
0 голосов
/ 17 марта 2011

С точки зрения ООП, я бы отделил Объект «Медведь» с его атрибутом «Выносливость» от Объекта «Бой», который содержит двух медведей, управляет атакой и «все еще жив».Несколько недель назад я опубликовал несколько примеров для довольно похожего вопроса: помощь в преобразовании массивов в отдельные переменные в Java

0 голосов
/ 17 марта 2011

Хорошее правило: изменяйте только переменные экземпляра внутри методов набора .Это сделает ваш код более управляемым.

/**
 * reduce this bears stamina by the given amount
 */
public void reduceStamina(int reduction) {
    setStamina(getStamina() - reduction);
}

public void isDead() {
    return getStamina() < 0;
}

public void attack(Bear otherBear) {
    otherBear.reduceStamina(50);
    if(otherBear.isDead()) {
        this.victoryDance();
    }
}
0 голосов
/ 17 марта 2011

Примерно так:

return new Pair <Integer, Boolean> (newStamina, bear.isAlive());

Не очень хорошо: верните 2 целых, один из которых обозначает bool:

return new int [] {newStamina, bear.isAlive() ? 1 : 0};
0 голосов
/ 17 марта 2011

Я пробовал это - возвращать объект вместо целого.

public Bear attack(Bear bear)
{
        int newStamina=bear.getStamina() - 50;  
        bear.setStamina(newStamina);
        if(newStamina<=0)
        {
            bear.isDead=true;
        }
        return bear;
}

// in main
while(Bear2.isDead==false)
{
            Bear1.attack(Bear2);
            System.out.println(Bear2.getStamina());
}

if(Bear2.isDead)
{
    System.out.println(Bear2.getName() + " is dead :(");
}

, который, кажется, работает ..!будет интересно увидеть другие решения.

...