【发布时间】:2013-12-31 23:36:59
【问题描述】:
在开始阅读一本关于 OO 编程的书后,我正在尝试让我的 android 应用程序更 OO。但是我被一个简单的场景难住了。
我有一个Book 对象,它可以有很多说Chapter 对象。我还有一个搜索功能,可以搜索多本书,其中 97 本书。我最终得到了 Sqlite 表中的许多 Chapter 对象。
我觉得能够在每个结果上看到书名对用户很有用,否则如果有两个“第 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 方法,因为我认为当我在长时间停顿后回到这个项目时,这对我来说更有意义。
【问题讨论】:
-
虽然
bookTitle并不真正适合Chapter类,但拥有一个属性名称book来说明它属于哪本书就可以了。是的,这两个属性之间并没有真正的区别,但是第二个在 imo 中更具有 OO 意义。 -
双向引用并不总是坏事
-
@RichardTingle 对我来说,两种方式的引用可能是一件坏事,如果 Chapter refs Book,然后 Book refs 它的章节,这意味着想要一个章节可以间接创建对其他 1000 个兄弟章节的引用,这意味着它们必须加载,占用内存等。如果我错了,请纠正我。
-
一切都取决于您存储数据的方式。如果它是从磁盘加载的,那可能会发生。但是,如果它像在普通程序中一样全部加载到 RAM 中(就像从您的描述中听起来那样),那么没关系。您没有提到您使用的是数据库还是只是可能会产生影响的集合
标签: java android oop design-patterns