【问题标题】:Empty interface for Null Object pattern空对象模式的空接口
【发布时间】:2019-01-11 09:32:43
【问题描述】:

我有一些用于使用 WCF 传输数据的 DTO 对象。

public class Foo
{
    //Many fields
}

WCF 服务方法返回这个对象,我有 valid 这个对象应该为空的情况。

我想使用 null 对象模式返回一些东西而不是 null 以使这段代码更清晰。

所以,我将其实现为:

public interface IFoo
{
   //empty
}


public class NoFoo : IFoo
{
   //empty
}

public class Foo : IFoo
{
    public static IFoo NoFoo { get; } = new NoFoo();

    //Many fields
}

在空检查之外使用 Foo 类不需要 IFoo。 但我觉得空界面肯定是一种代码味道。但是如果我将Foo 的所有(或任何)成员添加到IFoo,这些成员将永远不会被使用。因为接口仅用于空对象模式。 所以,我不明白,在这种情况下正确的方法是什么?

【问题讨论】:

  • 它被称为标记接口,然而这是各种重复
  • 我知道它是怎么调用的,它是关于空对象模式的。因此,从标记到空对象本身的可能异常已经打破了一些规则。这就是我问的原因。
  • “空对象”并不意味着“空接口”。它只是意味着“一个在语义上等同于 nothing 的对象值”。
  • 你考虑过可选吗?这对您的问题有意义吗?

标签: c# interface null-object-pattern


【解决方案1】:

所以我找到了更好的方法来实现我想要的。我将Foo 放在实现空对象模式的IResult 容器中。

public interface IResult
{
    Foo Foo { get; }
}

public class Result : IResult
{
    public static IResult NoResult = new NoResult();

    public Foo Foo { get; private set; }

    public Result(Foo foo)
    {
       Foo = foo;
    }

    private class NoResult : IResult
    {
        public Foo Foo => throw new NotImplementedException("Null object!");
    }
}

【讨论】:

  • 好吧,你只需实现它properly as wiki suggest。否则除了你之外没有人能猜到IResult 包装器(问题太抽象了)。你能解释一下优点吗?我想您的解决方案应该有一些缺点,例如如果你有 Foo 变量,你必须以丑陋的方式设置它,而早些时候你可以有 IFoo (但正如你所说,如果接口为空,那么这种类型的可用性非常低)不需要强制转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
相关资源
最近更新 更多