为了账号安全,请及时绑定邮箱和手机立即绑定

实现不违反封装的 OOP 委托

实现不违反封装的 OOP 委托

慕标琳琳 2021-11-17 14:39:51
这是一个关于赌博的简单场景。有一个赌徒和骰子。赌徒可以掷骰子。然后骰子的值会改变对于上述场景,我创建了这个类图如上图赌徒可以掷骰子, 在赌徒掷骰子时在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 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

你的设计基本上是正确的。唯一的就是-前面缺少的faceValue属性。我不确定缺少的指标是否默认为某些内容(乍一看无法找到和指示)。无论如何,您应该添加它以使其明确。

此外,Dice应重命名为Die(singular)。

最后(更深入地研究您的代码)您需要一个Die包含 2 个元素的数组,而不仅仅是一个元素,dice并且您需要同时掷两个骰子。


查看完整回答
反对 回复 2021-11-17
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

我认为骰子不是赌徒的一部分,赌徒只有掷骰子的行为。我认为下面的实现会更好:


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];

     }

}

当然,这取决于实际需求。


查看完整回答
反对 回复 2021-11-17
  • 2 回答
  • 0 关注
  • 136 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信