Jeff: 我在博客中阐述了为什么不建议在SwiftData中使用query属性包装器。它违反了关注点分离原则,导致代码更脆弱、更不灵活。我将通过一个任务列表应用的例子,解释如何通过关注点分离避免代码问题。直接在视图中使用从API获取的数据会导致代码耦合,当API发生变化时,视图层也需要修改。如果API发生变化,直接在视图中使用API数据会导致视图层需要大量修改,这说明代码没有遵循关注点分离原则。关注点分离原则的核心是每个代码块只应对一个关注点负责。代码同时处理API契约和UI展示逻辑会导致代码耦合,违反了关注点分离原则。为了实现关注点分离,应该将数据模型分为数据模型(用于数据传输)和领域模型(用于应用内部逻辑)。数据模型(DTO)应该精确地反映API契约,不多不少。Postel定律(稳健性原则)建议在发送数据时保守,在接收数据时宽松。数据模型的字段应该尽可能地允许为空,以应对API变化。不要在数据模型中添加API协议无法表示的类型。即使API返回的是字符串,也应在数据模型中将其作为字符串处理,避免在数据模型中进行类型转换。领域模型应该适合应用内部使用,可以包含应用需要的复杂类型和业务逻辑。领域模型可以包含非可选值、更复杂的类型(如日期)和枚举类型,以满足应用内部的需求。视图模型是领域模型的一种常见类型,它专门用于在视图中显示数据。对于简单的应用,数据模型和视图模型可能就足够了;对于复杂的应用,可能需要额外的领域模型层来协调数据模型和视图模型之间的转换。不应该直接将API数据传递给视图,而应该通过领域模型进行转换。可以使用仓库模式来处理与API的通信,并使用数据映射器在数据模型和领域模型之间进行转换。仓库模式中,外部代码只与领域模型交互,数据模型只在仓库内部使用。数据映射器用于在数据模型和领域模型之间进行转换,并处理转换过程中的错误。
Peter: 关注点分离使代码更容易测试,并且在API或业务逻辑发生变化时,只需要修改少量代码。关注点分离使得代码更容易测试,因为可以独立测试各个模块。关注点分离使得代码更容易应对变化,因为只需要修改少量代码。缺乏关注点分离会导致大型代码迁移非常困难。关注点分离允许不同的团队并行开发,减少团队之间的依赖。关注点分离允许在后端完成之前开始前端开发。如果依赖后端数据才能进行开发,则说明设计存在问题。在设计应用时,应该提前考虑可能发生的API变化,并使用关注点分离来减少技术债务。关注点分离可以限制问题的影响范围,避免因为一个模块的改变而导致整个应用需要修改。
Deep Dive