在开始阅读有关OO编程的书之后,我试图使我的Android应用程序更加OO。但是我很难过一个简单的场景。
我有一个Book
对象,可以有很多说Chapter
个对象。我还有一个搜索功能,可以搜索多本书,其中97本。我最终得到了Sqlite表中的许多章节对象。
我觉得用户能够在每个结果上看到书的标题是有用的,否则如果有两个“第5章”结果可能会令人困惑。
要做到这一点,我需要书名。我应该把它作为章节对象的一部分,例如:
chapter.getBookTitle()
哪种方式似乎不正确,因为我已经将书名粘贴到章节上......另一种方法是为每一章实例化一个书籍对象并以某种方式引用它,这有其自身的问题,包括在android中的问题无法将对内存中对象的引用传递给另一个活动。
另外一本书可能还有许多其他章节,这些章节不会在搜索中产生结果,如果我只是实例化这本书,它们似乎会回来。
这个看似简单的问题的正确OO解决方案是什么?只是学习什么时候不要对整个OO事情说教?
更多信息:
我在Sqlite中使用FTS4,它占我实际数据库大小80mb的一半以上。我存储的是97本书中的文字,章节有4种语言。所以我的FTS目前存储:
ChapterId, ChapterNo (withinBook), Lang1, Lang2, Lang3, Lang4, Tags, Notes
搜索非常快,我只检索了50个结果。我将任何列与字符串术语匹配,而不是特别是一列。因此,如果我输入“apple”,它将搜索上面的所有字段。
目前作为我的FTS查询的一部分,我加入了Book,获取BookId,之后我用它来获取本书的标题。然而,它全部采用程序式的风格,而不考虑信息“属于”的位置。
我需要标题,所以我可以在结果中显示它,只是为了方便用户。
它运作良好,但是我想要类似的性能或略微更少但是采用OO方法,因为我认为当我在长时间停顿后回到这个项目时对我更有意义。
答案 0 :(得分:2)
章节对象应该参考它来自的书,所以我会提出类似的建议
chapter.getBook().getTitle();
您的数据库表结构应该有一个books表和一个包含以下列的章节表:
书
章节
然后在搜索查询中使用连接表减少查询次数。
答案 1 :(得分:0)
我将采取的方法是:在阅读数据库中的章节时,使用书籍集合而不是章节集合。这将把您的章节组织成书籍,并且您将能够使用来自两个类的信息向用户呈现信息(您甚至可以在使用此方法时以分层方式呈现它)。
答案 2 :(得分:0)
您可以通过合成来实现您的类模型,让book对象包含一个包含在其中的章节对象的映射(将章节编号映射到章节对象)。您可以通过要求每本书搜索其章节来为您的搜索功能提供要搜索的书籍列表。然后,book对象将遍历每一章,调用chapter.search()函数来查找所需的键并将某种索引返回到章节中。然后,本书的search()将返回一些数据类型,这些数据类型可以组合对书籍的引用,并以某种方式引用它为搜索找到的数据。可以使用对该书的引用来获取与章节搜索命中集合相关联的书籍对象的名称。