【问题标题】:implement OOP delegation that does not violate Encapsulation实现不违反封装的 OOP 委托
【发布时间】:2019-03-18 22:46:57
【问题描述】:

这是一个关于赌博的简单场景。
有一个赌徒和骰子。 赌徒可以掷骰子。然后骰子值会改变

对于上述场景我创建了这个类图

如上图所示
赌徒可以掷骰子,它在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 类时 Gamblerroll() 方法对吗?

【问题讨论】:

  • 您的Gambler 正确地将roll 委托给Dice(尽管您仍然需要一种方法来检索Gambler 中的值)。我关心的是为什么 Dice 是有状态的(即为什么它有一个面值而不是返回它滚动的值)。
  • 因为 faceValue 属性是描述骰子状态的东西,该状态属于骰子类,这就是为什么 faceValue 类变量在骰子类中
  • “2”代表模具数还是卷数?
  • @NicholasK 骰子数
  • @Vivick 我的骰子都是有状态的。除非发生地震,否则我上次扔它们时,它们会保持正面朝上。

标签: java oop uml encapsulation ooad


【解决方案1】:

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

另外,Dice 应重命名为 Die(单数)。

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

【讨论】:

  • 只是好奇,因为有 2 标记表示骰子的数量,我们不应该以某种方式合并它们吗?
  • @NicholasK 他们很好。在实现这一点时,您可能会使用具有 2 个元素的数组来执行此操作。但是,实现 die1die2 也可以。
【解决方案2】:

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

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

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

【讨论】:

  • 赌徒和骰子类之间有关联关系。关联意味着链接。这就是为什么在 Gambler 类中有一个用于 dice 对象的类变量。
  • 根据您的实现,没有关联,但 Gambler 和 Dice 之间存在依赖关系
  • Gambler 需要与Dice 的关联(拥有的财产)(应该正确命名为Die),因为他还能如何滚动它们?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多