没有构造对象时的方法链接
Method Chaining when no object was constructed
在我当前的 Net Framework 4 项目中,我这样做了:
- 将我的 class 构造函数定义为私有
- 调用了静态 class 方法来获取那个 class
的对象
- 调用了新构造的对象的方法,可能会失败
看起来如下所示:
MyClassName obj = MyClassName.GetObject("Name").DoJob().Close();
哪里
- GetObject 是 return MyClassName 的实例或 NULL 的静态方法(我特别想 return 在创建失败时为 null,因为没有想到其他方法)
- DoJob() 和 Close() 是实例方法,它们 return
this
并且会在 GetObject 失败时抛出 System.NullReferenceException
,或者两者之间的任何失败。
问题是:是否可以按照我想要的方式设计它,而无需 try-catch 块?我想要很多很多一个衬垫而不是 try - lineOfCode - catch
。每一行都是另一个对象执行其特定任务并销毁自身/被遗忘。我也不需要使用 MyClassName obj =
部分。
您可以 return 空对象作为 Null Object pattern 的一部分,而不是 returning null
值。
在这种情况下,当 DoJob
和 Close
被调用时,这个对象什么都不做,只是 return 本身。
可能的问题可能是需要定义某种简单的 class 层次结构来实现此模式。当你现在只有一个 class 时,这似乎有点过分了。
zerkms 建议的第二个选项是使用某种 Option
类型而不是可空值。
因此,对 C# 使用 Option library。您的代码可能类似于:
// 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
}
是的,我同意有些杂音,但这是语言的局限性。
在我当前的 Net Framework 4 项目中,我这样做了:
- 将我的 class 构造函数定义为私有
- 调用了静态 class 方法来获取那个 class 的对象
- 调用了新构造的对象的方法,可能会失败
看起来如下所示:
MyClassName obj = MyClassName.GetObject("Name").DoJob().Close();
哪里
- GetObject 是 return MyClassName 的实例或 NULL 的静态方法(我特别想 return 在创建失败时为 null,因为没有想到其他方法)
- DoJob() 和 Close() 是实例方法,它们 return
this
并且会在 GetObject 失败时抛出System.NullReferenceException
,或者两者之间的任何失败。
问题是:是否可以按照我想要的方式设计它,而无需 try-catch 块?我想要很多很多一个衬垫而不是 try - lineOfCode - catch
。每一行都是另一个对象执行其特定任务并销毁自身/被遗忘。我也不需要使用 MyClassName obj =
部分。
您可以 return 空对象作为 Null Object pattern 的一部分,而不是 returning null
值。
在这种情况下,当 DoJob
和 Close
被调用时,这个对象什么都不做,只是 return 本身。
可能的问题可能是需要定义某种简单的 class 层次结构来实现此模式。当你现在只有一个 class 时,这似乎有点过分了。
zerkms 建议的第二个选项是使用某种 Option
类型而不是可空值。
因此,对 C# 使用 Option library。您的代码可能类似于:
// 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
}
是的,我同意有些杂音,但这是语言的局限性。