Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 面向对象CRUD程序-OO设计的原因是什么?_Java_Oop - Fatal编程技术网

Java 面向对象CRUD程序-OO设计的原因是什么?

Java 面向对象CRUD程序-OO设计的原因是什么?,java,oop,Java,Oop,首先,我真的不想让任何人做我的任务。我只是不明白我被要求实现的设计的意义。其中一种方法对我来说似乎是多余的,我想知道是否有人能解释一下 我必须创建一个学生类(和子类),它有4个方法:添加、删除、更新和查询。我必须能够使用这些方法来更新数据库。例如,add()方法的规范说明: 调用此方法时,将创建学生的数据库条目 我可以理解这里需要一个类,因为如果输入到GUI中的信息不正确,那么我可以在Student类中使用一些setter方法,这些方法将抛出一个异常,GUI可以捕获该异常并显示这些异常。因此,该

首先,我真的不想让任何人做我的任务。我只是不明白我被要求实现的设计的意义。其中一种方法对我来说似乎是多余的,我想知道是否有人能解释一下

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

调用此方法时,将创建学生的数据库条目

我可以理解这里需要一个类,因为如果输入到GUI中的信息不正确,那么我可以在Student类中使用一些setter方法,这些方法将抛出一个异常,GUI可以捕获该异常并显示这些异常。因此,该类对于验证信息非常有用。update和delete方法也是如此

真正让我恼火的是query()方法:

调用此方法时,对数据库进行查询以检索信息,然后打印到屏幕上

Student类应该有一个query()方法(它也有继承这个方法的子类)。但是为了查询数据库,我们已经需要创建实例,所以我们已经查询了数据库,以便获得创建类的信息,所以我可以调用我已经重写的toString()方法来显示类的数据

我不认为每个学生实例都有一个query()方法的意义,因为当他们使用它时,它是多余的。有人能告诉我为什么这可能有用吗

谢谢

更新

感谢所有回答的人。我接受这样一个事实,即在保存数据的对象和使用该数据或对该数据进行操作的对象之间,通常应该存在关注点分离


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

首先:如果学生类<强> <值> <强> >和<强>处理加载/存储的类,我会认为这是一个非常糟糕的设计。这违反了法律。我假设这是家庭作业,因此现在忽略这一部分。
query()
方法也存在同样的问题:它似乎无缘无故地有两个职责

在编写对象关系映射器时(您在这里是这样做的),通常情况下您有“半恢复”对象:您知道数据库中应该存在的对象,并且您知道它们的主键(例如,因为您在另一个对象中有对该对象的引用)


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

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

我们经常看到由数据传输对象(值持有者、*实体bean、您的
学生
)和从事CRUD业务的工厂组成的设计


问问你自己(或老师),你对
学生
上的
查询
方法有什么期望?我希望出现某种类型的查询,其中学生执行查询以获取他/她的学习的更多信息。

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

也许我想创建一个系统中还不存在的新学生,我可以提供必要的数据,调用我的
add()
insert()
方法,然后这将被持久化。同样,如果我创建一个Student对象并调用
query()
,我想象对象值将全部替换为获取的Student记录的结果

正如这里的其他人所指出的,对于价值持有者(实体本身)来说,将CRUD功能构建在其中并不被认为是一种流行的做法。这并不一定意味着这本身就是错误的。在OOP中,对象应该具有与自身相关联的所有功能,并且它将更类似于EJB EntityBean,而不是今天更流行的典型ORM/Persistence Framewok Bean


其他答案所述的ORM/持久性框架被称为贫血数据模型,某些OOP福音派如Martin Fowler对此表示谴责

这是家庭作业吗?听起来像是这样,它会稍微改变你得到的答案。如果是的话,请给它贴上这样的标签。我正要说完全一样的话(结合安德烈亚斯的遗言):(+1对两者)