上一节我们开始内容管理的数据设计,这节我们来完成内容管理BAL部分的代码。
在实现Category的时候,增删改的SQL语句基本上就是一段特定格式的字符串,虽然可以自己做ORM工具来自动生成,但不是我们这个教程要讲的。我们今天重点讲下对查询后结果的优化。
在Model.Categoty类中,我们数据转换代码是这样的:
事实上上面的代码是不够安全的,比如:
model.Id=int.Parse(result[“Id”].ToString());
result中未必包含Id的键值,结果就可能为空,转换时就会出错;
result中包含Id的键值,但可能不是数字,转换时也会出错;
一旦出错,程序就爆掉了。
正确的代码应该加上上面两种情况的判断,外加调用int.TryParse的方法, 尝试去转换,但是这就不是一两行代码就能搞定的了,一个字段的处理可能就要4-5行。如果仅仅是Category还好,字段不多,Content有12个字段,还有DateTime这种类型,几十行代码来处理这些就显得过于臃肿了,所以我们需要进行代码优化。
上面的代码,共同之处都是从一个Hashtable的实例中获取数据,不同的地方有两点:一是返回类型,二是键值,有共性就可以用函数,有不同就传参数,外加C#的一个专门用于工具类的扩展方法,就可以完美解决此问题。
在BAL中我声明了一个静态类BALTools,定义了对应Sqlite四种基本类型的函数:
namespace Diary.BAL
{
static public class BALTools
{
static public string toString(this Hashtable ht, string key, string dv="")
{
if (ht==null) return dv;
if (!ht.Contains(key)) return dv;
if (ht[key]==null) return dv;
return ht[key].ToString();
}
static public int toInt(this Hashtable ht, string key, int dv=0)
{
string str_v=ht.toString(key);
if (string.IsNullOrEmpty(str_v)) return dv;
int.TryParse(str_v, out dv);
return dv;
}
static public DateTime toDateTime(this Hashtable ht, string key)
{
DateTime dv=DateTime.MinValue;
string str_v=ht.toString(key);
if (string.IsNullOrEmpty(str_v)) return dv;
DateTime.TryParse(str_v, out dv);
return dv;
}
static public bool toBool(this Hashtable ht, string key, bool dv=false)
{
string str_v=ht.toString(key);
if (string.IsNullOrEmpty(str_v)) return dv;
return str_v==“1”;
}
}
}
这里有两个知识点:
第一个知识点扩展方法。大家可能注意到了,每个函数的第一个参数:this+参数类型+参数名。这种在静态类、静态函数中,且第一个参数使用了this,乐器编译器就会为这个指定的参数类型创造出一个扩展方法。相当于你继承了这个类,可以使用这些方法。
说起来可能比较难理解,看下动图就很容易理解了:
我们可以看到,一个Hashtable的实例result,直接拥有了toInt、toString等方法,这种就叫扩展方法,设计好了就可以让你节省大量重复性的代码。
第二个知识点是在函数参数中加默认值。比如toString的最后一个参数是
string dv=""
dv就是default value的缩写,假设我在取值的这个键值不存在,那么我就事先预设一个值,如果不存在,我就用这个预先设置的值来返回。在函数定义的时候设置了一个值是什么意思呢?就是调用函数的时候我可以不指定这个值,默认使用函数定义的,只有在有必要更改这个默认值的时候,我才需要指定它。
result.toString(“Name”)
result.toString(“Name”, “无标题”)
都是可以的。
做完上述的改进,我们开始编码:
Category的查询部分:
Content的查询部分:
通过我们的优化,查询部分代码的健壮性、可读性都得到了很大的提升,而且以后再有其他的数据库我们也都可以复用这几个方法,这个工作非常值得。我们无论是做项目还是做产品,其实都要不断地总结、优化,最终形成你自己的代码库,设计更加合理,编码更加高效。其实这也是我极力向大家推荐C#的原因之一,通过你的长期积累,能做的事情就越来越多,用C#是可以全栈开发的,也就是说,等你积累到了一定程度,你基本上可以优雅、高效的做任何你想做的事了,而且自己写的类库根本不用担心版权问题,这是其他很多语言无可比拟的。
我在教程里的内容都没有用其他的类库,然后有些人就各种喷,其实我现在写这个系列教程就跟打网游的开荒一样,一切从零开始。喷子们开发只会用轮子,而我们这些独立开发者是可以自己造轮子的。
DAL.Content的增删改函数就没什么知识点可说的了,大家自行到Git上查阅代码。
底层工作准备好之后,我们下一节开始界面设计。
共同学习,写下你的评论
评论加载中...
作者其他优质文章