这是处理领域中两个相似对象的正确方法吗?

Posted

技术标签:

【中文标题】这是处理领域中两个相似对象的正确方法吗?【英文标题】:Is this the correct way to handle two similar objects in realm? 【发布时间】:2017-03-05 05:56:45 【问题描述】:

我正在开发一个资金跟踪器应用程序,其中有两个不同的对象。一个是“Transaction”,其中包含所有发生的事务,第二个是“RecurringTransaction”,其中包含所有经常性事务。

我使用 Recurring transaction 之类的模板,其中包含创建交易所需的所有信息。我提供了一个清除交易的选项,所以一旦用户清除了经常性交易,那么只有我创建一个交易。我在我的应用中使用 Realm。

这些是对象:

class Transaction: Object 

  dynamic var id: String = UUID().uuidString
  dynamic var title: String = ""
  dynamic var amount: Double = 0
  dynamic var createdAt: Date = Date()
  dynamic var category: Category?
  dynamic var recurringTransaction: RecurringTransaction?
  dynamic var type: TransactionType = .Income


class RecurringTransaction: Object 

  dynamic var id: String = UUID().uuidString
  dynamic var title: String = ""
  dynamic var amount: Double = 0
  dynamic var createdAt: Date = Date()
  dynamic var category: Category?
  dynamic var type: TransactionType = .Income
  dynamic var frequency: TransactionFrequency = .Monthly

这是正确的方法吗?如您所见,两者都包含相似的属性,但同时又不同:一个是实际交易,另一个是模板。

还有一个问题,如果我使用 coredata 会有什么不同?因为我对coredata没有太多经验

【问题讨论】:

【参考方案1】:

Realm 在一定程度上支持对象的子类化。如果您从另一个Object 子类继承Object,则子类将包括超类的所有属性以及它自己的属性。这将在数​​据库中创建两个单独的表,跟踪每种类型。

因此,您不需要有多余的属性名称。这样的事情应该可以工作:

class Transaction: Object 
    dynamic var id: String = UUID().uuidString
    dynamic var title: String = ""
    dynamic var amount: Double = 0
    dynamic var createdAt: Date = Date()
    dynamic var category: Category?
    dynamic var recurringTransaction: RecurringTransaction?
    dynamic var type: TransactionType = .Income


class RecurringTransaction: Transaction 
    dynamic var frequency: TransactionFrequency = .Monthly

(完全披露:我为 Realm 工作)如果 Realm 是一个选项并且您在 Core Data 方面没有经验,我不建议您尝试 Core Data。学习曲线和所需的样板代码量并不容易实现。

【讨论】:

谢谢。我有点困惑。还有一个问题,如果我想拥有不同的主键怎么办?现在我对两个模型都有相同的主键,但如果我想改变的话。子类化会带来什么限制? 没问题!如果这回答了您的问题,请随时将答案标记为正确。 :D 是的,所以TransactionRecurringTransaction 仍然是完全独立的实体。他们的主键根本不会重叠。除了我所说的之外没有其他限制:它们被视为两个离散的实体。 非常感谢您的帮助。 :) 如果我尝试更改 RecurringTransaction 中的主键,我会收到错误“无法覆盖静态方法”。【参考方案2】:

如果frequency 是可选的,那么单个Transaction 类呢? 如果设置为nil,则为普通事务,如果有值则为循环事务。如果要拆分类,RecurringTransaction 可以是 Transaction 的子类,它只是添加了 frequency 字段。

【讨论】:

我想将它们分开,因为在付款之前我不会创建交易,如果我想添加一个新属性,它大部分时间都是空的。

以上是关于这是处理领域中两个相似对象的正确方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何开发一个特定领域的自动问答机器人?

实现DDD领域驱动设计: Part 4

互相关函数以及Matlab仿真

有啥方法可以控制领域发布者的频率吗?

mysql - 可以加入多个领域吗?

这是根据 IEEE-754 标准均衡两个不同数字的指数的正确方法吗?