第一道菜——引入对象参数

 原创者:星火幽蓝                  创建时间:2009-10-1

下面从我遇到的问题开始讲起,一步步讲诉问题,我觉得比直接给出最后的框架好,这样使用者才会更清楚自己需不需要这样做。
在Asp.net 2.0开发中,相信很多人都是使用以下的模式,在我接手信息管理系统的时候,也是遇到以下代码:

在表现层中,以下登录页面的后台:
表现层:

(注册按钮的事件)

        string SAccount = lbSAccount.Text;

        string SPwd = lbPwd.Text;

        string SearchArea = tbSearchArea.Text;

        string SID = tbSID.Text;

        string SName = tbSName.Text;

        string SIdentityNum = tbSIdentityNum.Text;

        string STel = tbSTel.Text;

        ……………………..

       Student stu = new Student();

          stu. Register ( SAccount, SPwd, SearchArea, SID, SName, SIdentityNum,STel,…………….);

这样传送参数有很多不足之处:
(1)很容易弄乱参数的顺序;
       就刚才的例子,一个用户的信息可能会有很多,直接传递参数,很容易弄乱第一个参数是名字,第二个参数是密码,第三个......,上层调用者必须要小心翼翼地去匹配。我就有这么一个经验——把参数的顺序弄乱了,结果调试了半天才发现这个问题。
(2)上层调用一个这么多参数的函数,效率会变低;
       为什么这么说呢?因为函数的调用的过程,实参会给形参初始化。如果有很多参数,那就意味着,要初始化很多形参。
(3)可扩展性差(最重要的一点)
       需求是会变化,用户表增加一个字段是很正常的,但此时你要怎么去改程序呢?你肯定要修改这个函数,给它增加一个参数,改变函数就改变了各层的接口,你必须要逐层修改......(天啊,杀了我算了!)

下面我对它进行优化,改为以下:

        Model.StudentModel model = new Model.StudentModel();

         model.SAccount = tbSAccount.Text;

         model.SPwd = tbSPwd.Text;

       if (rtman.Checked)model.Gender = "男";

       else model.Gender = "女";

        model.SearchArea = tbSearchArea.Text;

        model.SID = tbSID.Text;

        model.SName = tbSName.Text;

        model.SIdentityNum = tbSIdentityNum.Text;

        model.STel = tbSTel.Text;

            ………………

      Student stu = new Student();

        stu.Register(model);

     这样我们可以克服以上三个缺点,也可以说是有三个有点优点:
     (1)不用按顺序传递参数;
     (2)提高了一点点效率,因为对象的传递只是传递引用而已;
     (3)可扩展性强了,因为用户表增加字段后,需要修改表现层的东西,给对象多赋值一个参数,而不用修改函数Register(model),也就不用修改其接口。
      但你会发现,与原来的结构相比较,你必须定义一个StudentModel 来对应用户表。并且在增加字段的时候,要给StudentModel 这个实体类增加一个新的属性,来对应新增加的字段。也许有些人觉得也挺麻烦的,我可以很负责地跟你说,现在很多代码生成器可以帮我们生成这些实体类,所以我们可以忽视这方面的工作量。

 
上述问题的源码 

转载于:https://www.cnblogs.com/zhanchaojiang/archive/2009/10/01/1577200.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值