前提背景在清理以前相关代码时候,发现了之前使用表驱动的部分函数。所以,在这里简要的记录一下。
定义
数据驱动编程的核心出发点是相对于程序逻辑,人类更擅长于处理数据。数据比程序逻辑更容易驾驭,所以我们应该尽可能的将设计的复杂度从程序代码转移至数据。
所谓表驱动法(Table-Driven Approach),简单讲是指用查表的方法获指定的数据内容。
常用的查表方式
- 直接查询
- 索引查询
- 分段查询
如果要把星期几用中文输出,无论是用if语句或switch语句都比较臃肿,如下:
static string GetChineseWeek(DayOfWeek week)
{
switch (week)
{
case DayOfWeek.Monday:
return "星期一";
case DayOfWeek.Tuesday:
return "星期二";
case DayOfWeek.Wednesday:
return "星期三";
case DayOfWeek.Thursday:
return "星期四";
case DayOfWeek.Friday:
return "星期五";
case DayOfWeek.Saturday:
return "星期六";
case DayOfWeek.Sunday:
return "星期日";
default:
throw new ArgumentOutOfRangeException("DayOfWeek", "星期值超出范围");
}
}
- 可读性不高
- 重复代码
- 可扩展性差
使用表驱动方式如下:
static void Main(string[] args)
{
Console.WriteLine(GetChineseWeekPlus(DateTime.Today.DayOfWeek));
Console.Read();
}
static string GetChineseWeekPlus(DayOfWeek week)
{
string[] chineseWeek = { "星期日","星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
return chineseWeek[(int)week];
}
表驱动的方式优势
- 提高了程序的可读性。
- 减少了重复代码。
- 可扩展性。
- 降低了复杂度。
像这种表驱动的使用的地方还有很多,例如:返回哪年哪月多少天。
static void Main(string[] args)
{
Console.WriteLine(DayOfMonths(2019,2).ToString());
Console.Read();
}
public static int DayOfMonths(int year, int month)
{
int[] months = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (DateTime.IsLeapYear(year))
{
return ++months[--month];
}
return months[--month];
}
当然,在C#中判断哪年哪月有多少天也没有那么复杂,因为系统已经提供了相关函数。如下:
static void Main(string[] args)
{
Console.WriteLine(DateTime.DaysInMonth(2019,2).ToString());
Console.Read();
}
转载请注明:清风亦平凡 » 数据驱动之表驱动编程