Swift 如何减少域中存储的嵌套对象的可变性?

Swift 如何减少域中存储的嵌套对象的可变性?,swift,functional-programming,realm,Swift,Functional Programming,Realm,我正试图重写我的应用程序,以减少易变性并利用函数式编程。我很难弄清楚从哪里开始,因为我的架构似乎在任何地方都要使用修改。我可以在一个简单的起点上使用一些建议,如何将其分解成更小的部分,在每次修改时保持不变性。我是否应该更改数据存储体系结构,以便只存储/修改/删除叶对象 现在,我从根ViewController加载我的一个monster对象ExerciseProgram(它包含Exercise对象的RealmList,它包含训练的RealmList,它包含集合的RealmList。) 然后在整个应

我正试图重写我的应用程序,以减少易变性并利用函数式编程。我很难弄清楚从哪里开始,因为我的架构似乎在任何地方都要使用修改。我可以在一个简单的起点上使用一些建议,如何将其分解成更小的部分,在每次修改时保持不变性。我是否应该更改数据存储体系结构,以便只存储/修改/删除叶对象

现在,我从根ViewController加载我的一个monster对象
ExerciseProgram
(它包含
Exercise
对象的
RealmList
,它包含
训练的
RealmList
,它包含
集合的
RealmList
。)

然后在整个应用程序中修改单个
ExerciseProgram
对象,例如在录制新训练时

要创建新的
训练
,我在RecordWorkoutTableViewController.swift中实例化一个新的
训练
对象:

func load() -> ExerciseProgram? {
    let realm = try! Realm()
    return realm.objects(ExerciseProgram).first
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if doneButton === sender {
        if let date = newDate, weight = newWeight, setOne = newSetOne, setTwo = newSetTwo {
            let newSets = List<WorkSet>()
            newSets.append(WorkSet(weight: weight, repCount: setOne))
            newSets.append(WorkSet(weight: weight, repCount: setTwo))
            newWorkout = Workout(date: date, sets: newSets)
        }
    }
}
这种行为在我的应用程序中被复制。如果我想编辑或删除现有的训练,它是完全相同的

练习
课程就是这样:

final class Exercise: Object {
    dynamic var name = ""
    dynamic var notes: String?
    var workoutDiary = List<Workout>()
    dynamic var goal = 0

    ...

    func recordWorkout(newWorkout: Workout) {
        workoutDiary.append(newWorkout)
    }

    func replaceWorkout(originalWorkout: Workout, newWorkout: Workout) {
        workoutDiary[workoutDiary.indexOf(originalWorkout)!] = newWorkout
    }
}
最后的课堂练习:对象{
动态变量名称=“”
动态变量注释:字符串?
var workoutDiary=List()
动态var目标=0
...
func记录训练(新训练:训练){
workoutDiary.append(新训练)
}
func替换训练(原始训练:训练,新训练:训练){
workoutDiary[workoutDiary.indexOf(原始训练)!]=新训练
}
}

从我所知道的,看看这个模式,不,你不应该改变它。如果它正确地表示了信息的类型及其关系,并且它已经在你的应用程序中运行,那么就没有必要更改它

如果您觉得它过于复杂或混乱,那么在实际对代码本身做更多工作之前,可能有必要回顾并查看数据模型设计本身。查看链接对象中的每个关系和每个属性,并确保在该级别保存数据是绝对重要的。在任何情况下,领域本身都非常擅长处理对象之间的关系,因此拥有多层嵌套对象并不是“错误的”


无论哪种方式,领域本身都非常适合函数式编程,因为每个属性都是开箱即用的显式不可变的。不过,函数式编程并不意味着一切都必须是不变的。不可避免地,您必须达到一个需要保存对领域的更改的点;它背后的思维方式是,您在处理数据时没有转换数据,而是将实际转换数据的点数降至最低。

我有点不明白您在做什么,但是,如果您想分解对象,您可能需要考虑使用realm中的主键。
@IBAction func unwindToExerciseDetail(sender: UIStoryboardSegue) {
    if let sourceViewController = sender.sourceViewController as? RecordWorkoutTableViewController, newWorkout = sourceViewController.newWorkout {
        let realm = try! Realm()
        try! realm.write {
            exercise.recordWorkout(newWorkout)
        }
    }
}
final class Exercise: Object {
    dynamic var name = ""
    dynamic var notes: String?
    var workoutDiary = List<Workout>()
    dynamic var goal = 0

    ...

    func recordWorkout(newWorkout: Workout) {
        workoutDiary.append(newWorkout)
    }

    func replaceWorkout(originalWorkout: Workout, newWorkout: Workout) {
        workoutDiary[workoutDiary.indexOf(originalWorkout)!] = newWorkout
    }
}