考虑一下,我的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表达式后,我不希望使用许多if,else / switch语句,这些语句具有硬编码的数字,例如1,2,3,依此类推。
如果不采用拆分实际cron表达式并将其提取的明显解决方案,是否可以使其更具可读性?
答案 0 :(得分:1)
基于您的注释,您不希望发生多种情况,因此可以使用Enum避免显式索引。 If / Switch用例可以用字典代替,该字典将索引(或更好的Enum)映射到Actions(需要针对每种情况执行)。
例如,
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等表示需要在每种条件下执行的操作。