原创者:星火幽蓝 创建时间: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 这个实体类增加一个新的属性,来对应新增加的字段。也许有些人觉得也挺麻烦的,我可以很负责地跟你说,现在很多代码生成器可以帮我们生成这些实体类,所以我们可以忽视这方面的工作量。