我们说我有符合我的标准,但这个标准会随着时间而改变。这是我的意思的一个例子:
bool masterBool = false;
bool isTrue = true;
bool isAlsoTrue = true;
bool isTrueToo = true;
if (isTrue && isAlsoTrue && isTrueToo)
{
masterBool = true;
}
就像我说的那样,标准会不时改变。也许isTrue不再需要为真,但是引入了新标准needsToBeTrue。这将需要在方法中添加和删除变量以及复合条件。我想知道是否有另一种方法可以解决这个问题?这种方式对我来说似乎很草率。
谢谢
答案 0 :(得分:1)
这听起来像是一个简单的bool字典,LINQ会为你解决问题:
var criteria = new Dictionary<string, bool>{
{"oneCriterion", true},
{"anotherOne", true},
{"andAnotherOne", true}
};
//true!
var masterCriteria = criteria.All(x => x.Value);
Assert.IsTrue(masterCriteria);
criteria.Remove("oneCriterion");
criteria.Add("newCriterion", false);
//false
masterCriteria = criteria.All(x => x.Value);
Assert.IsFalse(masterCriteria);
答案 1 :(得分:0)
这在很大程度上取决于您的实现,以及您可以围绕它使用的框架。也许你正在使用依赖注入框架,在这种情况下,你可以实现一个处理决策的接口,并提供一个实现当前决策的实现
例如,您可以使用Microsofts UnityContainer并决定构建类似
的内容public interface IConditionMaker {
bool IsConditionTrue();
}
然后引用此接口,以便通过DI框架注入,您的类可能看起来像
public interface IExecutionClass {
void TakeAction();
}
public class ExecutionClass : IExecutionClass {
private readonly IConditionMaker _conditionMaker;
public ExecutionClass(IConditionMaker conditionMaker) {
_conditionMaker = conditionMaker;
}
public void TakeAction() {
if (_conditionMaker.IsConditionTrue()) {
// do your action
}
}
}
然后,您将进行第一次实施,如
public class ConditionMaker : IConditionMaker {
public bool IsConditionTrue() {
bool isTrue = true;
bool isAlsoTrue = true;
bool isTrueToo = true;
return (isTrue && isAlsoTrue && isTrueToo);
}
}
然后通过统一注册这些东西,比如
unityContainer.RegisterType<IConditionMaker, ConditionMaker>();
unityContainer.RegisterType<IExecutionClass, ExecutionClass>();
现在,每次需要IExecutionClass时(例如:内部控制器或其他点),它都可以通过注入框架解析并为您提供真正的实现,并且还将构造函数参数IConditionMaker解析为ConditionMaker。 / p>
如果您需要在代码中稍后更改某些内容,则可能只需要更改ConditionMaker实现,但其余代码可以保持不变。
.net框架有一个很好的例子,例如,ICommand
,您可以在ICommand
界面中实现,并具有类似
public MyCommand : ICommand {
public event EventHandler CanExecuteChanged;
public bool CanExecute( object parameter ) {
return true; // always execute, or evaluate parameter and decide, or use injected members and make your decision
}
public void Execute( object parameter ) {
// do your action, knowing that the CanExecute was already executed
}
}
但是,这实际上取决于您可以使用的情况和框架。也许你最好使用一个简单的Predicate<T>
列表,然后你可以枚举,例如:
// say you have some kind of argument, you can pass that argument along
if (predicateList.All(predicate => predicate( argument ))) {
// all predicates succeeded, do your action
}
然后您只需要注册/取消注册当时适用的谓词