我正在尝试用一种简单的方法来组织一些对象,就要创建的类而言。假设我正在努力追踪书籍。一本书可以属于许多不同的类型和子类型。我希望能够将一本书识别为一本书,但却将它归入这些不同的类别。我有一个跟踪所有子类的流派类,以及一个包含所有书籍的子类。我希望这本书能够了解它所属的所有类型和子类型。我还希望根据流派和子类型跟踪一些统计数据(评论,评论,阅读次数等),然后能够聚合它们以获得整本书的数字。通过这种方式,用户可以选择一本书并知道该书所属的每个类型/子类型,并为每个类别生成关于该书的统计数据
关于如何设计这个有什么想法?
我的想法是让每本书定义一个名为BookGroup的类,BookGroup将包含类型和子类型,以及该类别的任何相关信息(假设子类只能属于一个类型)。然后在Book课程中,我将保留一本书所属的一组书组。我可以添加来自所有不同书籍组的统计数据。我唯一不喜欢的是,我觉得BookGroup应该包含Books,而不是相反。
还有其他想法吗?
谢谢!
编辑: 你们所有人都提供了很好的建议。我认为,出于简单的原因,我现在可能会这样做:
class Book
{
Genre myGenre;
SubGenre mySubGenre;
String myTitle;
}
class Library
{
Map<String,Set<Book>> allBooks = new HashMap<String,Set<Book>>();
//where allBooks contains a mapping from book title, to all of the book objects which actually represent the same book but may contain different information related to their specific genre/subgenre
}
答案 0 :(得分:1)
我想你会希望你的课看起来像这样:
public class Book
{
String name;
List<Review> reviews;
Set<Genre> genres;
public Book(String name, Set<Genre> genres){}
}
public class Genre
{
String name;
Set<Book> books;
public Genre(String name, Set<Book> books){}
}
我在这里假设您将使用数据库,反过来您将有一个DAO来查询符合条件的所有已知书籍,然后跨数据集执行CRUD操作。通过建议Genre构造函数采用Set of Book对象感觉有点不对,但目前我想不出另一种方法可以做到这一点。
答案 1 :(得分:1)
所以,问题在于反向关系,真的。要避免这种情况并保持效率是非常困难的。关系数据库通过在后台进行优化,使用高效的查询操作,并且从不存储反向关系来回避这个问题。
如果在后台使用关系数据库,则可以创建使用关系查询获取图书组的方法,而无需将信息存储在Java中。
答案 2 :(得分:1)
我只会制作两个枚举,一个BookGenre = {scifi,novel,...}和类似的subgenres。在创建新的Book对象时,将Book对象的引用添加到某个列表中,该列表跟踪所有科幻书籍等(即制作EnumMap&gt;,将每个类型映射到书籍列表);通过这种方式,您可以轻松访问所有类型的书籍。
答案 3 :(得分:1)
其他海报提出了很好的建议,但你最初的想法也可能有效。如果我理解正确的话,对您来说最大的问题似乎是命名:您的“BookGroup”实际上不是一个分组,而是一个描述它属于哪个组(类型/子类型)以及相关的统计信息。如果您将其重命名为例如'BookGenreStatistics',谁包含将会消失的问题。
答案 4 :(得分:1)
我认为你希望收藏品彼此指向。当你把一本书添加到一个changre时,你也会将这个changre添加到这本书中。然后根据需要迭代以获得您想要的内容。一个changre和一个sub changre应该是同一个类,不需要在这里有不同的类。
另一种选择是不要在书中引用它所属的changres,而是如果你需要知道你必须遍历所有的changres并查看该书是否在其中。取决于有多少changres以及一本书属于changre是多么平常。让我们说如果大多数changres有超过一半的书籍。显而易见的第三种选择是不要在changres中使用书籍,在这种情况下,你必须遍历书籍以获得changres,问题是大多数书籍是否属于几乎所有的changres,或者changres是否不寻常且只包含少量书籍
如果你选择第一个选项,那么一个changre就可以包含书籍和其他changres,一本书可以包含changres但不包含其他书籍。听起来不太相似吗?嗯,这是一个变化和一本书同样的事情,好吧,差不多。主要区别在于您如何使用它们。想象一棵树,其中顶部的changres指向subchangres等等,然后他们反过来指向书籍,而这些书又指向他们所属的subchangres。然后,为了找到changre中的所有书籍,你只需要从根向上遍历树,除非你在一本书上停下来。如果一本书可以属于几个changres(是的,它可以,对吧?),那么你只需要在书中设置一个循环变量,这个循环变量在迭代时设置,如果你第二次知道这本书,你知道因为变量已经被设置了
例如找到changre中的所有书籍: 1.构造用于保存结果的集合对象。 2.(在子类changre中)迭代所有changres和书籍(它们可能存储在同一个集合对象中) 2.(与上面相同的方法,但在子类书中)检查是否设置了迭代字段,如果是,则返回,否则将其添加到结果集合对象。 3.在结果集合对象的所有书籍中取消设置迭代字段,以便可以从第一步重做。 (具有这样的迭代字段的替代方法当然是使用一个集合,如果你重复一个并不重要)
-Done,一本书,而不是迭代它所拥有的changres(就像changre一样)知道它必须将自己添加到结果中。
现在我想到了我认为有一个工具可以自动生成代码,你可以指定像changre这样的东西可以拥有书籍等等,然后在你可以指定从changre遍历的changre中查找所有书评。 changre,通过图表在你的路径上最多传递一本书,然后在评论中结束,然后重新整理结果,并生成执行该操作的代码。我不记得它的名称或语言,但我认为这样的代码只能从几行开始生成,但当然自己编写它也不应该受到伤害。