我試圖將此代碼重構爲更優雅的版本。任何人都可以請幫忙。將此C#代碼重構爲更加優雅的版本
- 問題出現在哪裏,作爲以後比較的第一個評估結果的標誌?
- 我要避免使用,如果/開關,如果可能的
- 我應該刪除操作員級和eval分成And和Or類,但不會太多不同的充我覺得
public interface IEval<T>
{
Func<T, bool> Expression { get; }
Operator Operator { get; }
string Key { get; }
}
public static bool Validate<T>(this T o, IList<IEval<T>> conditions)
{
var returnResult = true;
var counter = 0;
foreach (var condition in conditions)
{
var tempResult = condition.Expression(o);
if (counter == 0) //don't like this
{
returnResult = tempResult;
counter++;
}
else
{
switch (condition.Operator) //don't like this
{
case Operator.And:
returnResult &= tempResult;
break;
case Operator.Or:
returnResult |= tempResult;
break;
default:
throw new NotImplementedException();
}
}
}
return returnResult;
}
謝謝!
代碼更新時間:
public interface IEval<T>
{
Func<T, bool> Expression { get; }
bool Eval(bool against, T t);
}
public class AndEval<T> : IEval<T>
{
public Func<T, bool> Expression { get; private set; }
public AndEval(Func<T, bool> expression)
{
Expression = expression;
}
public bool Eval(bool against, T t)
{
return Expression.Invoke(t) & against;
}
}
public class OrEval<T> : IEval<T>
{
public Func<T, bool> Expression { get; private set; }
public OrEval(Func<T, bool> expression)
{
Expression = expression;
}
public bool Eval(bool against, T t)
{
return Expression.Invoke(t) | against;
}
}
public static class EvalExtensions
{
public static bool Validate<T>(this T t, IList<IEval<T>> conditions)
{
var accumulator = conditions.First().Expression(t);
foreach (var condition in conditions.Skip(1))
{
accumulator = condition.Eval(accumulator, t);
}
return accumulator;
}
}
IEval是一個標準的.NET接口嗎?我找不到任何地方的參考。 – 2009-12-22 23:17:11
沒有。我更新了代碼 – Jeff 2009-12-22 23:22:44
在許多層面上這似乎都是錯誤的,尤其是您的AND和OR運算符具有相同的優先級。這可能不是編寫代碼期望的人。你不應該使用樹而不是列表嗎? – 2009-12-22 23:31:07