类的实例化碰到的一些想法(一)

对应类的实例化,程序员再熟悉不过了,我虽然刚进入IT行业不久,也见得不陌生,但有些问题确总不能理解清楚。
比如有两个类,一个为静态类(简称A),另一个(简称B)的实例对应着数据库的记录。当A中有一个方法为GetB(Bid)即通过B实例的ID实例化B,
Bid对应的是数据库中的记录。这种情况,B实例的实例化便有几种方式了:

第一种方式:

         public   static  B GetB( int  bid)
        
{
            B b 
= new B();
            查询数据库;
            将需要用到的B的属性进行赋值,部分属性不赋值;
            
return B;
        }

第二种方式:

         public   static  B GetB( int  bid)
        
{
            B b 
= new B();
            查询数据库;
            将B的每一个属性进行赋值;
            
return B;
        }


第三种方式:

         public   static  B GetB( int  bid)
        
{
            对应需要用到的B的属性定义变量;
            查询数据库;
            将变量进行赋值;
            B b 
= new B(上面定义的变量);//对属性进行赋值的工作都又B类完成,B类定义不同参数构造函数
            
return B;
        }

第四种方式:

         public   static  B GetB( int  bid)
        
{
            对应B的所有属性定义变量;
            查询数据库;
            将变量进行赋值;
            B b 
= new B(上面定义的变量);//对每个属性进行赋值的工作都又B类完成,B类定义全属性参数构造函数
            return B;
        }

第五种方式:

         public   static  B GetB( int  bid)
        
{
            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        }
posted on 2007-08-24 10:53  varmc 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/varmc/archive/2007/08/24/867976.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值