未构造对象时的方法链接
本文关键字:方法 链接 对象 | 更新日期: 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
值。
在这种情况下,当调用 DoJob
和 Close
时,此对象将不执行任何操作,而只是返回自身。
可能的问题可能是需要定义某种简单的类层次结构来实现此模式。当你现在只有一个班级时,这似乎有点矫枉过正。
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
}
是的,我同意有一些噪音,但这些都是语言的限制。