我有几百行这样的代码:
if (c.SomeValue == null || c.SomeProperty.Status != 'Y')
{
btnRecordCall.Enabled = false;
}
if (c.SomeValue == null || (c.SomeProperty.Status != 'Y' &&
c.SomeOtherPropertyAction != 'Y'))
{
btnAddAction.Enabled = false;
}
if (c.SomeValue == null || c.SomeProperty.Processing != 'Y')
{
btnProcesss.Enabled = false;
}
如何正确重构它?我看到每次都会调用检查“c.SomeValue == null”,但它包含在其他条件中。我怎样才能消除这些重复代码?
最佳答案
我会使用 specification pattern ,并构建映射到适当 Enabled 值的复合规范。
您要回答的总体问题是某个对象 c 是否满足给定条件,然后您可以决定是否要启用某些对象。那么你就有了这个界面:
interface ICriteria<T>
{
bool IsSatisfiedBy(T c);
}
那么您的代码将如下所示:
ICriteria<SomeClass> cr = GetCriteria();
btnAddAction.Enabled = cr.IsSatisfiedBy(c);
下一步是编写合适的 ICriteria 对象。您可以有另一个 ICriteria 实现(除了 Or 和 And),称为 PredicateCriteria,如下所示:
class PredicateCriteria<T> : ICriteria<T>
{
public PredicateCriteria(Func<T, bool> p) {
this.predicate = p;
}
readonly Func<T, bool> predicate;
public bool IsSatisfiedBy(T item) {
return this.predicate(item);
}
}
其中一个例子是:
var c = new PredicateCriteria<SomeClass>(c => c.SomeValue != null);
其余的将是这个与其他标准的组合。
关于c# - 重构帮助c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1273686/