滚动一些骰子......看,但不要碰

时间:2011-03-22 03:52:20

标签: c# oop

有没有人想过将完整对象作为变量传递而不是只指向完整对象的函数?

例如,我有一个Dice对象有两个方法:

  • RollDice(),随机化骰子计数
  • GetCount(),检索值

现在,我需要利用骰子而不仅仅是玩家移动,其他物体也需要能够看到骰子。现在,将整个Dice对象传递给其他对象似乎是错误的,因为那时这些对象“技术上”能够重新掷骰子。编程只是将GetCount函数指针传递给其他对象是好还是坏?基本上说“我不会给你骰子,但我会告诉你如何阅读它们。”。

思想?

4 个答案:

答案 0 :(得分:2)

这似乎是使用OBSERVER PATTERN(GoF)的绝佳机会;

public class Dice
{
    private List<IDiceObserver> observers;
    public void RegisterObserver(IDiceObserver observer)
    {
        this.observers.Add(observer);
    }

    private Int32 count;
    public Int32 Count
    {
        get
        {
            return this.count;
        }
        private set
        {
            this.count = value;
            foreach (IDiceObserver observer in this.observers)
                observer.DiceRolled(new DiceParameters(this.count));
        }
    }

    public void RollDice()
    {
        this.Count = new Random(DateTime.Now.Millisecond).Next();
    }

    public Dice()
    {
        this.observers = new List<IDiceObserver>();
    }
}

您是否需要有关模式或其他类实现的进一步说明????

答案 1 :(得分:1)

为什么不传递整数?这意味着他们与骰子脱钩。

如果您使用依赖注入将dice注入每次移动的服务对象,则创建一个仅包含GetCount()方法的接口。

答案 2 :(得分:1)

您可以为骰子创建一个包装类,使它们不可变。包装器可以通过委托或子类化和重写RollDice()来实现。然后,当你想保证它不会改变时,传递一个包装器对象而不是一个可变的Dice对象。

答案 3 :(得分:1)

听起来你的Dice对象应该有DiceValue或FaceValue属性。您可以传递此值而不是自己传递骰子。这可以控制对骰子行为的访问,并且还可以避免仅传递面部整数值所导致的primitive obsession代码气味。它还可以使您的骰子值更加抽象,因此您以后可以使用数字以外的值,例如特殊面值等。