【扫盲贴】Petshop三层架构学习笔记:几个基础问题Q&A
因工作需要,需要重新熟悉并讲解Petshop三层架构中,特登记扫盲贴一篇,以备后忘。各位大虾请慎重拍。
1、是否使用代码生成器?
不得不说,现在的代码生成器极大程度上解放了软件开发者。但是对于基础较弱甚至是0基础的筒子们,还是老老实实看看代码,自己亲自模仿敲一敲代码。否则得到的始终是黑盒子,知其然不知其所以然,所以有了这个扫盲贴。
2、IDAL层是否有用?
三层架构中接口层IDAL与DAL层的作用大家都能从模块耦合性角度充分理解。封装变化的目的就是为了防止调用函数用于依赖具体实现,于是有了接口层,因此如果你能预计自己的数据库基本上都是一致(不会出现ORacle和SqlServer等选择上的纠结问题时),那么可以不考虑IDAL层。不过基于学习的目的,多加这一层并无大碍,还能训练一下自己对于接口与接口实现的写法。
3、数据库抽象的基本操作一般都包含什么内容?
一般设置在SqlHelper类中,用于具体操作SQLserver数据库的,其基本操作包含:
1)是否存在某表某字段Bool ColumnExists(string tableName, string columnName)
2)返回某表中最大ID值 int GetMaxID(string FieldName, string TableName)
3)某SQL语句查询是否有结果集 bool Exists(string strSql)
4)某表是否存在 bool TabExists(string TableName)
5)某简单带参数Sql语句是否存在结果 bool Exists(string strSql, params SqlParameter[] cmdParms)
4、使用 StringBuilder的好处
三层架构中SQlhelper数据中涉及了大量的StringBulider类用于Sql语句的设定,因此查阅了一下,对于它与String的区别说明如下:
创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。
可以用MyStringBuilder.Capacity = 25; 来设置他的容量,当修改 StringBuilder 时,在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。
修改 StringBuilder 字符串
方法名 使用
StringBuilder.Append 将信息追加到当前 StringBuilder 的结尾。
StringBuilder.AppendFormat 用带格式文本替换字符串中传递的格式说明符。
StringBuilder.Insert 将字符串或对象插入到当前 StringBuilder 对象的指定索引处。
StringBuilder.Remove 从当前 StringBuilder 对象中移除指定数量的字符。
StringBuilder.Replace 替换指定索引处的指定字符。
个人认为正是因为sql语句需要大量的追加参数或查询条件,所需字段长度不等,所以使用StringBulider效率应该更高些。
(部分内容参考 http://www.cnblogs.com/yunfeng8967/articles/1093832.html)
5、Count(1)、Count(*)与Sum(1)、sum(列名)区别
也是SQL语句惹的祸。在判断是否存在某字段或某表时总是要用到count函数,开始注意到参数为1与为*的不同。经过百度之后,发现原来count(1)与sum(1)功能一样,都是用于行数,只是sum不统计Null行。而sum(列名)完全就是计算某列的总和了。
参考自:http://lasombra.iteye.com/blog/451890
6、Objcet.Equals(obj,null) 与 obj==null的之别
一直在疑惑这两种判断有么有区别,稍微搜索了一下,理解如下:
前者是方法的调用,后面的操作符号的调用,区别并不明显,如果引用不能满足你的要求,那么就重载吧。只是工具而已,实在没有必要对二者进行区分了。
原文(http://stackoverflow.com/questions/112625/vs-object-equalsobject-in-net):
Is this a good thing, what are the differences, and when/why should you use one over the other?
How can it be "good" or "bad" thing? One - method, another - operator. If reference equality is not sufficient, overload them, otherwise leave them as is. For primitive types they just work out of box.
哈哈,今天先墨迹到这里,有空会继续更新的。自己撒花撤退ing