C# 掷骰子……看,但不要';触摸不到

C# 掷骰子……看,但不要';触摸不到,c#,oop,C#,Oop,有没有人想过将完整对象作为变量传递,而不是仅仅指向完整对象函数的指针 例如,我有一个骰子对象,有两种方法: RollDice(),使骰子计数随机化 GetCount(),检索该值 现在,我需要利用骰子不仅仅是玩家移动,其他物体也需要能够看到骰子。现在,在我看来,将整个骰子对象传递给这些其他对象是错误的,因为从技术上讲,这些对象可以重新掷骰子。只将GetCount函数指针传递给这些其他对象是好还是坏编程?基本上是说“我不会给你骰子,但我会教你怎么读。” 想法?为什么不给它们传递一个整数呢?这意

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

例如,我有一个骰子对象,有两种方法:

  • RollDice(),使骰子计数随机化
  • GetCount(),检索该值
现在,我需要利用骰子不仅仅是玩家移动,其他物体也需要能够看到骰子。现在,在我看来,将整个骰子对象传递给这些其他对象是错误的,因为从技术上讲,这些对象可以重新掷骰子。只将GetCount函数指针传递给这些其他对象是好还是坏编程?基本上是说“我不会给你骰子,但我会教你怎么读。”


想法?

为什么不给它们传递一个整数呢?这意味着它们与骰子分离


如果您使用依赖项注入将骰子注入到每个移动的服务对象中,那么创建一个只包含GetCount()方法的接口。

为什么不给它们传递一个整数?这意味着它们与骰子分离


如果您使用依赖项注入将骰子注入到每个移动的服务对象中,那么创建一个只包含GetCount()方法的接口。

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

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

听起来骰子对象应该具有DiceValue或FaceValue属性。您可以传递该值,而不是传递骰子本身。这可以控制对骰子行为的访问,还可以避免仅传递面的整数值而产生的代码气味。它还可以使骰子值更抽象,以便以后可以使用数字以外的值,如特殊面值等。

听起来骰子对象应该具有DiceValue或FaceValue属性。您可以传递该值,而不是传递骰子本身。这可以控制对骰子行为的访问,还可以避免仅传递面的整数值而产生的代码气味。它还可以使骰子值更抽象,以便以后可以使用数字以外的值,如特殊面值等。

使用观察者模式(GoF)似乎是一个极好的机会

公共类骰子
{
非公开名单观察员;
公共无效注册表观察者(IDiceObserver观察者)
{
this.observer.Add(observer);
}
私人Int32计数;
公共Int32计数
{
得到
{
返回这个.count;
}
专用设备
{
this.count=值;
foreach(此.obsers中的IDiceObserver观察者)
DiceRolled(新的DiceParameters(this.count));
}
}
公共无效滚动骰子()
{
this.Count=new Random(DateTime.Now.毫秒).Next();
}
公众骰子()
{
this.obsers=新列表();
}
}

您是否需要关于模式或其他类实现的任何进一步解释???

使用观察者模式(GoF)似乎是一个极好的机会

公共类骰子
{
非公开名单观察员;
公共无效注册表观察者(IDiceObserver观察者)
{
this.observer.Add(observer);
}
私人Int32计数;
公共Int32计数
{
得到
{
返回这个.count;
}
专用设备
{
this.count=值;
foreach(此.obsers中的IDiceObserver观察者)
DiceRolled(新的DiceParameters(this.count));
}
}
公共无效滚动骰子()
{
this.Count=new Random(DateTime.Now.毫秒).Next();
}
公众骰子()
{
this.obsers=新列表();
}
}

您需要关于模式或其他类实现的进一步解释吗???

什么编程语言?另外,如果您不想将函数指针传递给
GetCount
函数,为什么不将di(c)e的值作为一个数字传递呢?@Matt-我正在用c#处理这个问题,我很欣赏大家对这个问题的见解。什么编程语言?另外,如果您不想将函数指针传递给
GetCount
函数,为什么不将di(c)e的值作为一个数字传递呢?@Matt-我正在用c#处理这个问题,我很欣赏大家对这个问题的见解。您的意思是用一个不可变的实现来扩展Dice,从而消除RollDice吗?在我看来,这打破了Liskov替换原则,因为RollDice不再具有调用类所期望的行为。@Martin-你的观点是正确的。“我认为对于这样的事情,委托体系结构要干净得多。@Martin-经过更多的思考,我认为只要稍微改变一下子类型,子类型建议就可以干净地工作:使(可变)骰子类成为不可变类的子类。”。我不认为如果超类没有指定它是不可变的,而只是提供了没有掷骰子的方法,那么打破LSP就可以了。这肯定解决了这个特殊的问题:)“不需要更多,承诺不会更少”。我个人更喜欢下面的解决方案,因为我认为它更接近真实世界,但你的解决方案很好。@Martin-我同意。您的解决方案更加优雅。您的意思是用一个不可变的实现来扩展Dice,从而消除RollDice吗?在我看来,这打破了Liskov替代原理,因为RollDice不再具有e的行为
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>();
    }
}