реализовать делегирование ООП, которое не нарушает инкапсуляцию - PullRequest
0 голосов
/ 14 октября 2018

это простой сценарий с азартными играми.
есть игрок и игральные кости.игрок может бросить кубик. затем значение кости изменится

. Для вышеописанного сценария я создал диаграмму классов

enter image description here

, как показано на рисункеприведенная выше диаграмма
игрок может бросить кости, он реализован в Gambler.roll() методе
когда игрок бросает кости, значение кости меняется, он реализован в Dice.roll() методе

реализовать описанный выше сценарий, используяjava-код, как показано ниже, обратите внимание на этот код как псевдокод, синтаксис может быть неправильным

class Gambler{
  private Dice dice;

  Gambler(Dice dice){
    this.dice = dice;
  }

  public void roll(){
    dice.roll();//delegation call
  }
}

/* --------------------------- */

import java.util.Random;
class Dice{
  private int faceValue;

  public int getFaceValue(){
    return faceValue;
  }


  public void roll(){
    //get random value between 1 ,6
    Random random = new Random();
    this.faceValue =  random.nextInt((6 - 1) + 1) + 1;
  }
}

Я хочу знать
Соответствует ли моя реализация рекомендациям OOAD и не нарушает инкапсуляцию?

специально при делегировании броска игральных костей от Gambler до Dice класса это правильно Gambler имеет roll() метод?

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

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

Кроме того, Dice следует переименовать в Die (в единственном числе).

Наконец (более подробно изучив ваш код) вам нужномассив Die с двумя элементами вместо одного dice, и вам нужно бросить оба кубика.

0 голосов
/ 14 октября 2018

Я думаю, что игра в кости не является частью игрока. У игрока есть только игра в кости. Я думаю, что реализация ниже будет лучше:

class Gambler{
    //some field

    public int roll(Dice dice){
        return dice.roll();
    }
}

/* --------------------------- */

import java.util.Random;
class Dice{
     private int[] values = new int[]{1,2,3,4,5,6};

     public int roll(){
         //get random value between 1 ,6
         Random random = new Random();
         return values[random.nextInt((6 - 1) + 1) + 1];
     }
}

Конечно, это зависит отфактическое требование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...