为了账号安全,请及时绑定邮箱和手机立即绑定

从零开始用C#做产品:私人日记 内容管理BAL优化

标签:
AngularJS

上一节我们开始内容管理的数据设计,这节我们来完成内容管理BAL部分的代码。

在实现Category的时候,增删改的SQL语句基本上就是一段特定格式的字符串,虽然可以自己做ORM工具来自动生成,但不是我们这个教程要讲的。我们今天重点讲下对查询后结果的优化。

在Model.Categoty类中,我们数据转换代码是这样的:

从零开始用C#做产品:私人日记(17)内容管理BAL优化

事实上上面的代码是不够安全的,比如:

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,乐器编译器就会为这个指定的参数类型创造出一个扩展方法。相当于你继承了这个类,可以使用这些方法。

说起来可能比较难理解,看下动图就很容易理解了:

从零开始用C#做产品:私人日记(17)内容管理BAL优化

我们可以看到,一个Hashtable的实例result,直接拥有了toInt、toString等方法,这种就叫扩展方法,设计好了就可以让你节省大量重复性的代码。

第二个知识点是在函数参数中加默认值。比如toString的最后一个参数是

string dv=""

dv就是default value的缩写,假设我在取值的这个键值不存在,那么我就事先预设一个值,如果不存在,我就用这个预先设置的值来返回。在函数定义的时候设置了一个值是什么意思呢?就是调用函数的时候我可以不指定这个值,默认使用函数定义的,只有在有必要更改这个默认值的时候,我才需要指定它。

result.toString(“Name”)

result.toString(“Name”, “无标题”)

都是可以的。

做完上述的改进,我们开始编码:

Category的查询部分:

从零开始用C#做产品:私人日记(17)内容管理BAL优化

Content的查询部分:

从零开始用C#做产品:私人日记(17)内容管理BAL优化

通过我们的优化,查询部分代码的健壮性、可读性都得到了很大的提升,而且以后再有其他的数据库我们也都可以复用这几个方法,这个工作非常值得。我们无论是做项目还是做产品,其实都要不断地总结、优化,最终形成你自己的代码库,设计更加合理,编码更加高效。其实这也是我极力向大家推荐C#的原因之一,通过你的长期积累,能做的事情就越来越多,用C#是可以全栈开发的,也就是说,等你积累到了一定程度,你基本上可以优雅、高效的做任何你想做的事了,而且自己写的类库根本不用担心版权问题,这是其他很多语言无可比拟的。

我在教程里的内容都没有用其他的类库,然后有些人就各种喷,其实我现在写这个系列教程就跟打网游的开荒一样,一切从零开始。喷子们开发只会用轮子,而我们这些独立开发者是可以自己造轮子的。

DAL.Content的增删改函数就没什么知识点可说的了,大家自行到Git上查阅代码。

底层工作准备好之后,我们下一节开始界面设计。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消