微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 尝试重构Null对象模式,但最终结果似乎更糟

我正在重构一个大类,它在整个地方都有很多检查使用null对象模式.到目前为止,这是一个几乎顺利的变化,但我对最终结果有几个问题,我想知道是否有更好或不同的方法,甚至回到它的方式.

最大的问题是我有以下代码

IMyObject myObject = GetMyObject();
if(myObject != null && !myObject.BooleanProperty)
   DoSomething();

所以你可以看到我可以从这个条件中删除null检查,但我有一个布尔属性,如果设置为认值将执行一段代码.如果我总是回归真实,我可能会引入一些微妙的错误,这些错误很难找到并消除.

一个问题是我必须像这样从null修改一个检查:

if(myObject.GetType() != typeof(MyNullObject))
   return false;

DoSomething();

这只是简单的丑陋,因为不是只检查null,现在我必须检查类型.这种情况在类中发生了三次,因为我没有返回对象的一个​​属性或执行其中一个方法我必须进行此检查.

最后,该对象有几个不可为空的DateTime属性,架构师不希望它们可以为空.再次将MinDate值作为认值,一些讨厌的错误可能会爬进代码中.

所以你有它.这是一个空对象模式比分散在各地的意大利面条空检查更糟糕的情况吗?有没有更好的方法来实现这一目标?

谢谢你的回答.

解决方法

Null对象模式是一种权衡 – 你可以通过消除空值检查来获得,但是需要支付另一个类来维护.

我建议在你的接口/基类中添加一个IsNull布尔属性.

正常的实现返回false;你的null对象返回true.

这允许您避免针对确切类型进行测试,并且更清楚您的意图.您还可以在处理日期的代码中将其用作测试,从而允许您保留不可为空的日期属性.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐