c# – 尝试重构Null对象模式,但最终结果似乎更糟
发布时间:2020-12-15 21:23:02 所属栏目:百科 来源:网络整理
导读:我正在重构一个大类,它在整个地方都有很多检查使用null对象模式.到目前为止,这是一个几乎顺利的变化,但我对最终结果有几个问题,我想知道是否有更好或不同的方法,甚至回到它的方式. 最大的问题是我有以下代码: IMyObject myObject = GetMyObject();if(myObje
我正在重构一个大类,它在整个地方都有很多检查使用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. 这允许您避免针对确切类型进行测试,并且更清楚您的意图.您还可以在处理日期的代码中将其用作测试,从而允许您保留不可为空的日期属性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |