2011-07-07 62 views
3

首先,我真的不想让任何人做我的任务。我无法理解我被要求实施的设计要点。其中一种方法对我来说似乎是多余的,我想知道是否有人能够对此做出一些解释。面向对象的CRUD程序 - 面向对象设计的原因是什么?

我必须做一个学生类(和子类)有4种方法:添加,删除,更新和查询。我必须能够使用这些方法来更新数据库。例如,add()方法的规范说:

当调用此方法时,将为该学生创建数据库条目。

我能理解,我们需要在这里有一个类,因为如果进入GUI的信息是不正确的话,我可以在学生类的一些setter方法将抛出可以由被捕获的异常GUI和这些可以显示。所以这个类对验证信息很有用。同样适用于更新和删除方法。

这是真的讨厌我的东西是query()方法:

当这个方法被调用,查询是对数据库进行检索信息,然后显示在屏幕上。

Student类意味着有一个query()方法(并且它有继承这个的子类)。但为了查询数据库,我们已经需要创建实例,所以我们已经查询了数据库以获取创建类的信息,所以我可以调用toString()方法我已覆盖显示课程的数据。

我没有看到每个Student实例有一个query()方法的时候,这对他们来说是多余的使用它的重点。谁能告诉我为什么这可能有用?

感谢

更新

谢谢大家谁回答。我承认,通常应该在保存数据的对象与使用或对数据执行操作的对象之间分离关注事项。

我的任务指出查询方法应该查询数据库,然后将该信息显示给屏幕。我现在在想,如果我使用静态方法并给它一个学生名称或某个东西的参数,那么它实际上可以查询数据库,然后使用该信息创建一个Student实例并显示它。至少这对我来说是有意义的,因为它只被调用一次,所以没有冗余。

+0

这功课吗?听起来像是这样,它会稍微改变你得到的答案。所以,如果是这样,请标记为这样。 –

+0

已标记。感谢Joachim。 – Joe

回答

3

第一关:我认为这是一个非常糟糕的设计,如果Student类是的值保持,处理加载/存储类。它违反了single responsibility principle。我会认为这是作业,因此现在忽略了这部分。与query()方法存在同样的问题:它似乎有两个责任没有明显的原因。

在编写一个对象关系映射器(您在此处做的那种)时,通常情况下您有“半恢复”对象:您知道的对象应该存在于数据库中,而您知道他们的主键(例如因为你在另一个对象中引用了该对象)。

在这种情况下,可能很容易出现加载实际数据的方法query()可能有用。

+0

我正要说完全一样的(与Andreas'somment一起):)(两者都+1) – Thomas

2

这是没有用的,没有人会(或应该)这样做。 A Student是一个可持久的实体,但其他组件将负责创建,读取,更新或删除这些实体。

我们经常看到,包括数据传输对象(一值保持者,*实体bean,您Student)和工厂是做CRUD业务的设计。

问问自己(或老师),你对Studentquery方法有什么期望?我希望得到某种查询,在那里学生执行以获取更多信息供他/她的学习使用。

1

这样做的目的是Student对象不应该与学生记录密不可分。我应该能够创建一个空的新的Student对象,并且还没有唯一的ID。

也许我想创建一个在系统中还不存在的新学生,我可以提供必要的数据,请拨打我的add()insert()方法,然后这个方法会被保留下来。同样,如果我创建一个Student对象并致电query()我想象对象值将全部被取回的学生记录的结果替换。

正如其他人在这里指出的那样,价值持有人并不认为这是一种流行做法,实体本身具有内置的CRUD功能。这并不一定意味着这是天生错误的。在OOP中,对象应该具有与其自身相关的所有功能,并且与当前比较流行的典型ORM /持久性Framewok Bean相比,它更类似于EJB EntityBean。

其他答案已经声明的ORM /持久性框架被称为贫血症数据模型,某些OOP福音传播者喜欢Martin Fowler的解密。 http://martinfowler.com/bliki/AnemicDomainModel.html