【问题标题】:How to implement a simple scenario the OO way如何以OO方式实现一个简单的场景
【发布时间】: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


【解决方案1】:

Chapter 对象应该引用它来自的书,所以我建议类似 chapter.getBook().getTitle();

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

书籍

  • 身份证
  • 预订具体信息

章节

  • 身份证
  • book_id
  • 章节具体信息

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

【讨论】:

  • 是的,我的数据库架构就是这样。
  • 我想补充一点,因为我使用 FTS 搜索来获取我当前的结果,拥有chapter.getBook().getTitle(); 将导致我为找到的每个搜索项运行另一个查询。
  • 您在 FTS 中使用什么,不允许您将 books 表加入到找到的章节中?
  • 在 FTS 中添加 bookid 很容易。但是要实例化整本书,需要对该 id 进行单独的查询
  • 请详细说明您的搜索。您的数据如何/在哪里存储?您目前如何进行全文搜索?
【解决方案2】:

我会采取的方法是:当从数据库中读取章节时,而不是章节集合,使用书籍集合。这会将您的章节组织成书籍,并且您将能够使用这两个类中的信息向用户呈现信息(使用这种方法时,您甚至可以轻松地以分层方式呈现它)。

【讨论】:

  • 这将导致我引用 Book 对象中的章节,我如何告诉它我想要包含哪些章节,因为可能有 1000 个?我无法加载所有这些,因为它会导致大量数据...
【解决方案3】:

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

【讨论】:

  • 这会导致很多数据库查询不是吗?我当前的方法使用 FTS 搜索,因此非常简单易行,每本书搜索其章节需要 97 个这样的查询。
  • 好吧,我并没有试图解决任何数据库问题,我已经键入了您关于如何 OO 表示这一点的问题。
猜你喜欢
  • 1970-01-01
  • 2012-06-08
  • 2023-03-03
  • 2010-11-14
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多