对应类的实例化,程序员再熟悉不过了,我虽然刚进入IT行业不久,也见得不陌生,但有些问题确总不能理解清楚。
比如有两个类,一个为静态类(简称A),另一个(简称B)的实例对应着数据库的记录。当A中有一个方法为GetB(Bid)即通过B实例的ID实例化B,
Bid对应的是数据库中的记录。这种情况,B实例的实例化便有几种方式了:
第一种方式:
public
static
B GetB(
int
bid)
{
B b = new B();
查询数据库;
将需要用到的B的属性进行赋值,部分属性不赋值;
return B;
}
{
B b = new B();
查询数据库;
将需要用到的B的属性进行赋值,部分属性不赋值;
return B;
}
第二种方式:
public
static
B GetB(
int
bid)
{
B b = new B();
查询数据库;
将B的每一个属性进行赋值;
return B;
}
{
B b = new B();
查询数据库;
将B的每一个属性进行赋值;
return B;
}
第三种方式:
public
static
B GetB(
int
bid)
{
对应需要用到的B的属性定义变量;
查询数据库;
将变量进行赋值;
B b = new B(上面定义的变量);//对属性进行赋值的工作都又B类完成,B类定义不同参数构造函数
return B;
}
{
对应需要用到的B的属性定义变量;
查询数据库;
将变量进行赋值;
B b = new B(上面定义的变量);//对属性进行赋值的工作都又B类完成,B类定义不同参数构造函数
return B;
}
第四种方式:
public
static
B GetB(
int
bid)
{
对应B的所有属性定义变量;
查询数据库;
将变量进行赋值;
B b = new B(上面定义的变量);//对每个属性进行赋值的工作都又B类完成,B类定义全属性参数构造函数
return B;
}
{
对应B的所有属性定义变量;
查询数据库;
将变量进行赋值;
B b = new B(上面定义的变量);//对每个属性进行赋值的工作都又B类完成,B类定义全属性参数构造函数
return B;
}
第五种方式:
public
static
B GetB(
int
bid)
{
B b = new B(bid);//查询数据库,或许记录,对每个字段进行赋值的工作都又B类完成,B类定义功能齐全的构造函数
return B;
}
{
B b = new B(bid);//查询数据库,或许记录,对每个字段进行赋值的工作都又B类完成,B类定义功能齐全的构造函数
return B;
}
我们现在正在开发的薪酬辅助核算系统,经过讨论采用了第4中方式对类进行实例化,但由于系统中类关系的复杂性,造成了造成了A类中GetB方法设计比较复杂,所以我有点怀疑第四种方式初始化类是否有效、可行,个人比较偏向第五种。
下面是我们系统相关的几个类图:
其中,我们为每个类定义了数据层的数据操作类(业务层类名后加DAL),BusinessConsignController便是上文说到的A类,PayList便是B类,GetB()对应的是GetPayList。
我使用第四种方式实现的代码如下:
1
/**/
/// <summary>
2 /// 通过PayListID获取对应的PayList
3 /// </summary>
4 /// <param name="plid">要获取的PayList的id号</param>
5 public static PayList GetPayList( int plid)
6 {
7 Database db = DatabaseFactory.CreateDatabase("SqlServerExternal");
8 string sqlCommand = "GetPayList";
9 DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
10 db.AddInParameter(dbCommand, "PayListId", DbType.Int32, plid);
11
12 DataSet dataSet = db.ExecuteDataSet(dbCommand); //通过存储过程获取的三个DataTable
13 DataTable plDataTable = dataSet.Tables[0]; //包含了对应PayList的信息,只有一条记录
14 DataTable pepiDataTable = dataSet.Tables[1]; //包含了对应PayList的所有PayEntry和PayItem信息,PayEntry重复
15 DataTable plcDataTable = dataSet.Tables[2]; //包含了对应PayList的合并信息
16
17 if (plDataTable.Rows.Count != 1)
18 return null;
19 PayList pl = new PayList(); //初始化PayList
20 pl.plname = plDataTable.Rows[0]["name"].ToString(); //为PayList的每个属性进行赋值
21 pl.createDateTime = (DateTime)plDataTable.Rows[0]["CreateDateTime"];
22 pl.payDateTime = (DateTime)plDataTable.Rows[0]["PayDateTime"];
23 pl.owner = OrganizationController.GetPerson((int)plDataTable.Rows[0]["ownerId"]);
24 pl.payTemplate = PayTypeController.GetPayTemplate((int)plDataTable.Rows[0]["PayTemplateId"]);
25 pl.state = (PayListState)plDataTable.Rows[0]["state"];
26
27 PayEntry pe;
28
29 PayItem pi;
30
31 int rowNum = 0;
32 while (rowNum < pepiDataTable.Rows.Count) //此循环为了构造PayList的payEntries属性
33 {
34 pe = new PayEntry(); //初始化PayEntry
35 pe.personal = OrganizationController.GetPerson((int)pepiDataTable.Rows[rowNum]["PersonalId"]);//为PayEntry的每个属性进行赋值
36 pe.peid = (int)pepiDataTable.Rows[rowNum]["PayEntry.ID"];
37 do //此循环为了构造PayEntry的payItems属性
38 {
39 pi = new PayItem(); //初始化PayItem
40 pi.financedept = (Department)pepiDataTable.Rows[rowNum]["FinanceDeptId"]; //为PayItem的所有属性赋值
41 pi.piid = (int)pepiDataTable.Rows[rowNum]["id"];
42 pi.money = (decimal)pepiDataTable.Rows[rowNum]["money"];
43 pi.project = (Project)pepiDataTable.Rows[rowNum]["projectId"];
44 pi.payItemTemplate = payTemplate.PayItemTemplates[(int)pepiDataTable.Rows[rowNum]["PayItemTemplateId"]];
45 pi.RemarkInfo = pepiDataTable.Rows[rowNum]["RemarkInfo"].ToString();
46 pi.ResponseInfo = (decimal)pepiDataTable.Rows[rowNum]["ResponseInfo"];
47
48 pi.payItems.Add(pi.Id,pi); //将新的PayItem赋予PayEntry属性payItems
49 rowNum ++;
50 }
51 while (rowNum < pepiDataTable.Rows.Count && peid == (int)pepiDataTable.Rows[rowNum]["PayEntry.ID"]);
52 pl.payEntries.Add(pe.Id, pe); //将新的PayEntry赋予PayList属性payEntrys
53 }
54
55 PayListCombine payListCombine;
56
57 for (rowNum = 0; rowNum < plcDataTable.Rows.Count; rowNum++) //此循环为了构造PayList的payListCombines属性
58 {
59 plc = new PayListCombine();
60 plc.sourcePayListId = (int)plcDataTable.Rows[rowNum]["SourcePayListId"];
61 plc.sourcePayItemTemplateId = (int)plcDataTable.Rows[rowNum]["SourcePayItemTemplateId"];
62 plc.targetPayListId = (int)plcDataTable.Rows[rowNum]["TargetPayListId"];
63 plc.targetPayItemTemplateId = (int)plcDataTable.Rows[rowNum]["TargetPayItemTemplateId"];
64 plc.Id = (int)plcDataTable.Rows[rowNum]["Id"];
65 pl.payListCombines.Add(plc.Id, plc); //将新的payListCombine赋予PayList属性payListCombines
66 }
67 return pl;
68 }
2 /// 通过PayListID获取对应的PayList
3 /// </summary>
4 /// <param name="plid">要获取的PayList的id号</param>
5 public static PayList GetPayList( int plid)
6 {
7 Database db = DatabaseFactory.CreateDatabase("SqlServerExternal");
8 string sqlCommand = "GetPayList";
9 DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
10 db.AddInParameter(dbCommand, "PayListId", DbType.Int32, plid);
11
12 DataSet dataSet = db.ExecuteDataSet(dbCommand); //通过存储过程获取的三个DataTable
13 DataTable plDataTable = dataSet.Tables[0]; //包含了对应PayList的信息,只有一条记录
14 DataTable pepiDataTable = dataSet.Tables[1]; //包含了对应PayList的所有PayEntry和PayItem信息,PayEntry重复
15 DataTable plcDataTable = dataSet.Tables[2]; //包含了对应PayList的合并信息
16
17 if (plDataTable.Rows.Count != 1)
18 return null;
19 PayList pl = new PayList(); //初始化PayList
20 pl.plname = plDataTable.Rows[0]["name"].ToString(); //为PayList的每个属性进行赋值
21 pl.createDateTime = (DateTime)plDataTable.Rows[0]["CreateDateTime"];
22 pl.payDateTime = (DateTime)plDataTable.Rows[0]["PayDateTime"];
23 pl.owner = OrganizationController.GetPerson((int)plDataTable.Rows[0]["ownerId"]);
24 pl.payTemplate = PayTypeController.GetPayTemplate((int)plDataTable.Rows[0]["PayTemplateId"]);
25 pl.state = (PayListState)plDataTable.Rows[0]["state"];
26
27 PayEntry pe;
28
29 PayItem pi;
30
31 int rowNum = 0;
32 while (rowNum < pepiDataTable.Rows.Count) //此循环为了构造PayList的payEntries属性
33 {
34 pe = new PayEntry(); //初始化PayEntry
35 pe.personal = OrganizationController.GetPerson((int)pepiDataTable.Rows[rowNum]["PersonalId"]);//为PayEntry的每个属性进行赋值
36 pe.peid = (int)pepiDataTable.Rows[rowNum]["PayEntry.ID"];
37 do //此循环为了构造PayEntry的payItems属性
38 {
39 pi = new PayItem(); //初始化PayItem
40 pi.financedept = (Department)pepiDataTable.Rows[rowNum]["FinanceDeptId"]; //为PayItem的所有属性赋值
41 pi.piid = (int)pepiDataTable.Rows[rowNum]["id"];
42 pi.money = (decimal)pepiDataTable.Rows[rowNum]["money"];
43 pi.project = (Project)pepiDataTable.Rows[rowNum]["projectId"];
44 pi.payItemTemplate = payTemplate.PayItemTemplates[(int)pepiDataTable.Rows[rowNum]["PayItemTemplateId"]];
45 pi.RemarkInfo = pepiDataTable.Rows[rowNum]["RemarkInfo"].ToString();
46 pi.ResponseInfo = (decimal)pepiDataTable.Rows[rowNum]["ResponseInfo"];
47
48 pi.payItems.Add(pi.Id,pi); //将新的PayItem赋予PayEntry属性payItems
49 rowNum ++;
50 }
51 while (rowNum < pepiDataTable.Rows.Count && peid == (int)pepiDataTable.Rows[rowNum]["PayEntry.ID"]);
52 pl.payEntries.Add(pe.Id, pe); //将新的PayEntry赋予PayList属性payEntrys
53 }
54
55 PayListCombine payListCombine;
56
57 for (rowNum = 0; rowNum < plcDataTable.Rows.Count; rowNum++) //此循环为了构造PayList的payListCombines属性
58 {
59 plc = new PayListCombine();
60 plc.sourcePayListId = (int)plcDataTable.Rows[rowNum]["SourcePayListId"];
61 plc.sourcePayItemTemplateId = (int)plcDataTable.Rows[rowNum]["SourcePayItemTemplateId"];
62 plc.targetPayListId = (int)plcDataTable.Rows[rowNum]["TargetPayListId"];
63 plc.targetPayItemTemplateId = (int)plcDataTable.Rows[rowNum]["TargetPayItemTemplateId"];
64 plc.Id = (int)plcDataTable.Rows[rowNum]["Id"];
65 pl.payListCombines.Add(plc.Id, plc); //将新的payListCombine赋予PayList属性payListCombines
66 }
67 return pl;
68 }