未构造对象时的方法链接

本文关键字:方法 链接 对象 | 更新日期: 2023-09-27 18:37:12

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

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

这看起来如下所示:

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

哪里

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

问题是:是否可以按照我想要的方式设计它,没有 try-catch 块?我想有很多很多一个衬里而不是try - lineOfCode - catch.每条线都将是另一个物体在执行其特定任务并摧毁自己/被遗忘。我也不需要使用MyClassName obj =部分。

未构造对象时的方法链接

您可以返回一个空对象作为空对象模式的一部分,而不是返回null值。

在这种情况下,当调用 DoJobClose 时,此对象将不执行任何操作,而只是返回自身。

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

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

因此,使用 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
}

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