考虑我有一个 cron 表达式为“* * */2 * ”,如果不是“ ” ,我必须提取天、小时和分钟的重复。我有以下功能也可以使用。
public void CronDivision(string cron)
{
string days, value;
string[] cronDiv = cron.split(' ');
if(cronDiv[2] != "*")
{
days = "Days"
value = cronDiv[2].split('/')[1];
}
else if(cron[1] != "*)
{
//Similar logic
}
else if(cron[0] != "*)
{
//Similar logic
}
else if(cron[3] != "*)
{
//different logic for extracting weeks
}
else if(cron[4] != "*)
{
//different logic for extracting years
}
}
我如何概括上述函数,以便我不想在 cron 表达式的除法之后使用许多带有硬编码数字(如 1、2、3 等)的 if else/switch 语句。
如果没有拆分实际 cron 表达式并提取它的明显解决方案,是否可以使其更具可读性?
根据您认为不会发生多个条件的评论,您可以通过使用 Enum 来避免显式索引。If/Switch case 可以用字典替换,字典将索引(或更好的 Enum)映射到 Actions(需要为每个 case 执行)。
例如,
var cron = "* * */2 * ";
var arr = cron.Split(new[]{" "},StringSplitOptions.RemoveEmptyEntries);
var value = arr.Select((x,index)=>new {Value=x, Index=index}).First(x=>!x.Value.Equals("*"));
var dictionaryOfActions = new Dictionary<Position,Action>
{
[Position.Minute] = ()=> ProcessMinute(),
[Position.Hour] = ()=> ProcessHour(),
[Position.Day] = ()=> ProcessDay(),
};
dictionaryOfActions[(Position)value.Index]();
其中位置定义为
public enum Position
{
Minute,
Hour,
Day
}
ProcessMinute、ProcessHour 等表示需要在每个条件下执行的操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句