最近,公司开发了一个档案产品,实现两种数据库(SQL Server 和 Oracle)的数据存储,我虽然没有进行此项目的开发,但是本着学习的动机,也开始思考这个项目如果交给我,我会如何去做(考虑用最少的代码和最少的时间去开发,保障程序运行效率)。
因为之前学习过设计模式,第一反应就是工厂模式与抽象工厂模式可以实现这个需求(但运用的太少,学习的也不是很深奥,因此重新学习,希望各位一起讨论)。
按照个人的理解,面向对象的设计语言有三大机制:封装、继承、多态。前两个特征都比较好理解,这里不解释说明了。那什么是多态?我的理解是 :多态(Polymorphism)--》通过继承实现的不同对象调用相同的方法,表现出不同的行为,称之为多态。如果说不明白,可以举一个例子,请看下图。
从编程角度出发,狗(Dog)是个抽象类,狗都有跑的属性,但跑的快慢是有差异的。贵宾犬和猎狗是个实体类,是具体的狗,他们都继承了狗会跑的性质。
如果用代码表示,可以这样
Dog dog=new 贵宾犬() 或者 Dog dog=new 猎狗();
当我们给狗这个抽象类一个具体的实例时,狗的跑动快慢是不同的。这就是多态的表现方式之一,不知道我说的是否明白?。
那么,什么是设计模式?这真的很抽象,太抽象了。经过努力,找到了下面一段话(觉得比较通俗易懂):
设计模式描述了软件设计过程中某一类常见问题的一般性的解决法案。面向对象设计模式描述了面向对象设计过程中,特定场景下、类与相互通信的对象之间常见的组织关系。
个人理解如果项目没有太大需求的变化,是不需要使用设计模式,或者说不需要面向对象设计,虽然我们使用的C#、Java都是面向对象语言,但通常我们的编程习惯与面向过程的编写习惯没有太大的差别(理解错误请指正)。
记得在读大学学习软件工程的时候,老师给我们讲课,总爱提起耦合这个名词,当时没怎么去理解,觉得这些理论没什么用处,而现在逐渐有了清晰的认识。
耦合关系直接决定着软件面对变化时的行为,即模块与模块之间的紧耦合使得软件面对变化时,相关的模块都要随之更改,模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,使其他模块保持不变。
这段理论中,模块与模块的耦合度到底要多松,才是合适的,是一个值得商榷的地方,值得我思索。
一个产品中,可能用到几种模式,或者一种模式都未用。人们会说,为了模式而去用模式不好,深刻理解面向对象是学好设计模式的继承。
学习Factory Method,应该有这样的疑问:为什么会有这个模式,这个模式是来用来干什么的,这个模式是什么,使用这个模式要注意什么。
动机:在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口。
意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类(GOF)。
一个类是变化的,但这个类拥有稳定的接口,什么是稳定的接口,怎样才算是稳定的接口,希望各位解释下。
下面是我的思考过程,希望各位拍砖。
首先分层编写,必然之道;其次,数据库不同,实际是sql server 和 oracle的一些语法差别不同,比如占位符,sql server 是@,oracle是:,数据库的帮助类SQLHelpe也是不同的,因此,我就从SQLHelper这里下手。
首先建立两个类,分别代表操作Sql和操作Oracle数据的类。
操作Sql数据库的类SqlDBHelper
1 public class SqlDBHelper
2 {
3 static readonly string conStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
4 public DataTable GetDataTable(string sql, params OracleParameter[] param)
5 {
6 using (SqlConnection con = new SqlConnection(conStr))
7 {
8 con.Open();
9 using (SqlCommand cmd = con.CreateCommand())
10 {
11 cmd.CommandText = sql;
12 if (param != null)
13 {
14 cmd.Parameters.AddRange(param);
15 }
16 using (SqlDataAdapter adapert = new SqlDataAdapter(cmd))
17 {
18 DataTable sqlDt = new DataTable();
19 adapert.Fill(sqlDt);
20 return sqlDt;
21 }
22 }
23 }
24 }
25 }
操作Oracle数据库的类 OracleDbHelper
1 public class OracleDbHelper:
2 {
3 static readonly string conStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
4 public DataTable GetDataTable(string sql, params SqlParameter[] param)
5 {
6 using (OracleConnection con = new OracleConnection(conStr))
7 {
8 con.Open();
9 using (OracleCommand cmd = con.CreateCommand())
10 {
11 cmd.CommandText = sql;
12 if (param != null)
13 {
14 cmd.Parameters.AddRange(param);
15 }
16 using (OracleDataAdapter adapert = new OracleDataAdapter(cmd))
17 {
18 DataTable oraclelDt = new DataTable();
19 adapert.Fill(oraclelDt);
20 return oraclelDt;
21 }
22 }
23 }
24 }
当数据库是SQL Server的时候,调用SqlDBHelper的方法GetDataTable(),当数据库是Oracle的时候,我调用OracleDbHelper的GetDataTable()方法。因此,这里需要写两种不同的数据操作类,我觉得不是太好。经过寻找,我在net自带的类中找到了一种方法,这样,程序员在数据层中调用数据库操作类的时候不用去判断调用是SqlDBHelper还是OracleDbHelper了,请看我的下一篇博文。