我看到一些开发人员使用User.swift或Post.swift。有什么用途以及为什么每个开发人员都有这个用途。
我在网上找到的一些代码https://github.com/dasoga/chat-firebase/blob/master/ChatRealTime/Model/User.swift
cudaAtomicAdd
答案 0 :(得分:1)
模型类的想法是将app使用的数据封装在自己的类中,从而使模型与控制器和视图更清晰地分离。请参阅Apple的 Cocoa核心竞争力中的Model-View-Controller。或查看Model object。
但是抛开这些更广泛的设计原则,让我们考虑一下你的User
类:这是一个封装了一系列属性的类,即标识符,名称,电子邮件地址和图像URL。那么,为什么要使用这个User
类型,而不是单个属性和/或标准集合?
让我们考虑替代方案,这可以解释为什么像User
这样的模型对象可以强大:
考虑维护用户列表的应用。一组User
对象比标识符,名称,电子邮件等单独的数组更方便。例如,如果您想按名称对用户列表进行排序,该怎么办?如果你在不同的数组中拥有所有这些属性,那么跟踪它们将非常复杂。
所以,让我们说你认识到保持这些不同的属性是强大的,所以你决定使用简单的字典来实现这一点。然后,可以将一组用户表示为字典数组。这解决了以前的问题。
但它引入了其他问题。例如,程序员现在有责任使用正确的密钥来编写这本字典,而编译器无法提供任何关于它希望这本字典的密钥应该是什么的线索。 ,更不用说管理与这些键相关的数据类型的任何规则。
更糟糕的是,您可能拥有与此User
对象关联的业务规则,即可能需要id
和name
,但电子邮件地址和图片网址是可选的。此外,您可能希望将一些业务规则应用于电子邮件地址和URL,以确保它们有效。或者您可以说更改用户的姓名或电子邮件地址有效,但不能更改其id
。所有类型的逻辑都可以封装在User
对象中,但如果您使用的是简单的字典,则很难有效地捕获这些业务规则。
例如,我可能会建议您重构User
类以捕获其中一些业务规则:
class User {
let id: String // note use of `let`, not `var`, meaning you can't change this
var name: String // note no `?`, meaning that this is required
var email: String? // note use of `?`, meant that this _is_ optional
var imageURL: NSURL? // note use of `NSURL`, which more strongly captures/validates a URL string
init(id: String, name: String, email: String?, imageURL: NSURL?) {
self.id = id
self.name = name
self.email = email
self.imageURL = imageURL
}
}
现在这是一个很好的简单User
类型,它使用非常有限的代码来强制执行各种业务逻辑(例如id
是必需的并且是不可变的,name
是必需的但是可变的, email
和imageURL
是可选的且可变的)。显然,您可以更进一步了解这个类定义,包含各种其他业务需求。
但其优点在于,在代码中使用此User
类时,这些规则在编译时强制执行,在发生之前消除各种编程问题。这些属性是强类型的,各种属性的可变性和可选性都很好地封装在这个简单的类型中。
最重要的是,通过精心设计的模型类型,可以更轻松地编写安全使用这些模型类并与之交互的优秀代码。