方法没有构造对象时的链接

时间:2015-01-11 20:37:43

标签: c# fluent-interface

在我目前的Net Framework 4项目中,我这样做了:

  • 将我的类构造函数定义为private
  • 调用静态类方法来获取该类的对象
  • 调用新构造的对象的方法,可能会失败

这看起来如下:

MyClassName obj = MyClassName.GetObject("Name").DoJob().Close();

,其中

  • GetObject是一个静态方法,它返回MyClassName的实例OR NULL(我特别想在创建失败时返回null,因为没有其他方法可以想到)
  • DoJob()和Close()是实例方法,它们返回this并在GetObject失败时抛出System.NullReferenceException,或者其间的任何内容都失败。

问题:是否可以按照我想要的方式设计,没有try-catch块?我希望有许多一个衬垫而不是try - lineOfCode - catch。每一行都将是另一个执行其特定任务并摧毁自身/被遗忘的对象。我也不需要使用MyClassName obj =部分。

2 个答案:

答案 0 :(得分:3)

您可以返回null对象作为Null Object pattern的一部分,而不是返回null值。

在这种情况下,当DoJobClose被调用并且只返回时,此对象将不执行任何操作。

可能需要定义某种简单的类层次结构来实现此模式。当你现在只有一个班级时,这似乎有点矫枉过正。

答案 1 :(得分:0)

zerkms建议的第二个选项是使用某种Option类型而不是可以为空的值。

因此,使用Option library进行C#。您的代码可能类似于:

// simplified skeleton
class MyClassName
{
    private MyClassName() {}

    public MyClassName GetObject(string name)
    {
        return new MyClassName();
    }

    public MyClassName DoJob() { return this; }
    public MyClassName Close() { return this; }
}

Option<MyClassName> obj = MyClassName.GetObject("Name").ToOption().Select(x=>x.DoJob()).Select(x=>x.Close());

if (obj.HasValue)
{
    // can work with obj.Value
}
else
{
    // somewhere was null
}

是的,我同意有一些噪音,但这些都是语言的限制。

相关问题