有关MVC(模型-视图-控制器)设计的讨论
sifox 2002-11-15 06:20:47 现在看面向对象的书,讲到设计一般都会提到MVC分离的原则,可到具体的实现,各种编程工具举出来的例子往往不是那么回事,常常令人困惑,特在此抛砖引玉,希望大家说出自己的高见。为了把事情说清楚,篇幅有点长,请大家耐心点。
举一个简单的例子,比如有一个雇员数据库管理系统,实现对雇员的雇佣、信息修改、退休或解聘的管理。
按照MVC的原则,先确定一个雇员类(Employee),它包括雇员号(emp_no)、姓名(name)、受雇时间(hire_date),部门号(dept_no)、电话(phone)、级别(job_grade)等属性,并通过employ(),modifyInfo(),retire()等方法来实现系统的功能。为了输入或显示雇员信息,定义一些界面类employFrame、modifyInfoFrame,retireFrame,在这些界面类中接受用户的请求后,分别调用Employee类的方法实现将输入的数据保存到数据库中或者显示雇员的信息。这些界面类不直接与数据库打交道,不直接执行SQL语句。具体的对数据库的操作也不在雇员类的方法中实现,而是专门定义一些数据管理的类,在雇员类的方法中调用数据管理类的方法实现数据库的存取。
在一些编程工具的例子则往往是先定义一些窗口,在窗口上放置直接访问数据库的对象,这些访问数据库的对象中包含操作数据库的SQL语句,通过这些对象实现对雇员信息的插入删除修改。象这样直接访问数据库的对象,具体的例子有Jbuilder中的JDBTable + DataSet,PowerBuilder中的数据窗口。
两相比较,无论在设计还是实现上,第二种方案当然简单快捷,但第二种方案业务逻辑划分不清楚,软件复用比较难。而第一种方案对设计水平要求比较高,实现起来也很麻烦,如果雇员类的属性比较多,为了将界面类中接收的数据传递给雇员类,雇员类的方法employ(),modifyInfo(),retire()的参数也会很多。另外数据管理类的设计也比较难。
在实际开发中,不知道大家采用那种方案,其理由是什么,请大家发表高见。
以上两种方案是我在学习面向对象设计后的一些初浅的认识,如果有不对的地方,也请大家指出来。