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