Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.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 如何用面向对象的方式实现一个简单的场景_Java_Android_Oop_Design Patterns - Fatal编程技术网

Java 如何用面向对象的方式实现一个简单的场景

Java 如何用面向对象的方式实现一个简单的场景,java,android,oop,design-patterns,Java,Android,Oop,Design Patterns,在开始阅读一本关于面向对象编程的书之后,我正试图让我的android应用程序更面向对象。然而,我被一个简单的场景难住了 我有一本书对象,可以有很多说的章节对象。我还有一个搜索功能,可以搜索多本书,其中97本。我最终得到了Sqlite表中的许多Chapter对象 我觉得用户能够在每个结果上看到书的标题会很有用,否则如果有两个“第5章”结果可能会让人困惑 要做到这一点,我需要书名。我是否应该将其作为我的章节目标的一部分,比如: chapter.getBookTitle() 哪一种似乎不对,因为我已

在开始阅读一本关于面向对象编程的书之后,我正试图让我的android应用程序更面向对象。然而,我被一个简单的场景难住了

我有一本
对象,可以有很多说
的章节
对象。我还有一个搜索功能,可以搜索多本书,其中97本。我最终得到了Sqlite表中的许多Chapter对象

我觉得用户能够在每个结果上看到书的标题会很有用,否则如果有两个“第5章”结果可能会让人困惑

要做到这一点,我需要书名。我是否应该将其作为我的章节目标的一部分,比如:

chapter.getBookTitle()
哪一种似乎不对,因为我已经把书名粘在了一章上。。。另一种方法是为每个章节实例化一个book对象,并以某种方式引用它,这有其自身的问题,包括在android中,无法将对内存中对象的引用传递给另一个活动

另外,一本书可能有许多其他章节不是搜索结果,如果我只是实例化这本书,它们可能会返回

对于这个看似简单的问题,什么是正确的OO解决方案?这仅仅是一个学习什么时候不要对整个面向对象的事情武断的问题吗

更多信息:

我在Sqlite中使用FTS4,它占我实际80mb数据库大小的一半以上。我存储的是97本书的文本,其中有4种语言的章节。因此,我目前的FTS存储:

ChapterId, ChapterNo (withinBook), Lang1, Lang2, Lang3, Lang4, Tags, Notes
搜索速度非常快,我只检索到50个结果。我用字符串项匹配任何列,而不是特定的一列。因此,如果我键入“apple”,它将搜索上面的所有字段

目前,作为我的FTS查询的一部分,我正在加入一本书,获取BookId,然后使用它来获取该书的标题。然而,这一切都是程序式的,不考虑信息“属于”哪里

我需要标题,以便在结果中显示它,只是为了方便用户


它工作得很好,但我希望有类似的性能或稍低的性能,但采用面向对象的方法,因为我认为当我在长时间停顿后回到这个项目时,这对我来说更有意义。

我会采取的方法是:当从数据库中阅读章节时,而不是使用一组章节,使用一组书籍。这将把你的章节组织成书,你将能够使用两个类中的信息向用户呈现信息(使用这种方法时,你甚至可以很容易地以分层的方式呈现信息)。

你可以通过组合实现你的类模型,使book对象具有包含在其中的章节对象的映射(将章节号映射到章节对象)。您的搜索功能可以通过要求每本书搜索其章节来获得要搜索的书籍列表。然后book对象将遍历每一章,调用chapter.search()函数来查找所需的键,并将某种索引返回到该章中。然后,书籍的search()将返回一些数据类型,这些数据类型可以将对书籍的引用与它为搜索找到的数据的引用结合起来。对书籍的引用可用于获取与章节搜索点击集合关联的书籍对象的名称。

章节对象应具有对其来源书籍的引用,因此我建议
chapter.getBook().getTitle()

您的数据库表结构应该有一个books表和一个chapters表,其中包含以下列:

  • 身份证
  • 图书特定信息
章节

  • 身份证
  • 书号
  • 章节特定信息

然后,为了减少查询数量,请在搜索查询中使用联接表。

虽然
bookTitle
并不真正适合
章节
类,但在我看来,使用属性名
book
说明它属于哪本书是可以的。是的,这两个属性之间并没有什么区别,但在我看来,第二种方法更有OO意义。双向引用并不总是坏事thing@RichardTingle对我来说,双向引用可能是一件坏事,如果章节引用了书,那么书引用了它的章节,这意味着想要一个章节可以间接地创建对其他1000个兄弟章节的引用,这意味着它们必须被加载,占用内存等。如果我错了,请纠正我。这一切都取决于您如何存储数据。如果它是从磁盘加载的,那么可能会发生这种情况。但是,如果它都像在普通程序中一样加载在RAM中(正如您描述的那样),那么这并不重要。您没有提到您使用的是数据库还是集合,这可能会有所不同。这就是我的db模式。我想补充一点,因为我使用FTS搜索来获取当前结果,具有
chapter.getBook().getTitle()
将导致我对找到的每个搜索项运行另一个查询。您在FTS中使用的什么将不允许您将books表加入到找到的章节中?将bookid添加到FTS将非常简单。但要实例化整本书,需要一个单独的查询,请解释有关搜索的更多信息。您的数据是如何存储的/存储在哪里的?你目前是如何进行全文搜索的?这将导致我在Book对象中引用章节,我如何告诉它我希望包括哪些章节,因为可能有1000个?我不能全部加载它们,因为这将导致大量的数据…这将导致大量的数据库查询不?我目前的方法使用FTS搜索,因此它非常简单和容易,让每本书搜索其章节将需要97个这样的查询。好吧,我没有试图解决任何数据库问题,我已经输入了您关于如何表示OO的问题。