iOS 创建对象最佳实践

Posted

技术标签:

【中文标题】iOS 创建对象最佳实践【英文标题】:iOS Creating an Object Best Practice 【发布时间】:2015-10-21 02:02:48 【问题描述】:

我创建了一个向导,供用户使用我的应用进行注册,但是,我对如何存储他们的信息有一些疑问。

我有一个User 模型,当从数据库中拉出用户时会填写该模型,但是,此模型上有一些必填字段如果我是则不会填写将其用作用户通过向导时传递的对象。

这是我的User 模型:

final class User: NSObject, ResponseObjectSerializable, ResponseCollectionSerializable 
    let id: Int
    var facebookUID: String?
    var email: String
    var firstName: String
    var lastName: String
    var phone: String?
    var position: String?
    var thumbnail: UIImage?
    var timeCreated: CVDate

    init?(response: NSHTTPURLResponse, var representation: AnyObject) 
        if let dataRepresentation = ((representation as! NSDictionary).valueForKey("data") as? [String: AnyObject]) 
            representation = dataRepresentation
        

        self.id = representation.valueForKeyPath("id") as! Int
        self.facebookUID = (representation.valueForKeyPath("facebook_UID") as? String)
        self.email = (representation.valueForKeyPath("email") as? String) ?? ""
        self.firstName = (representation.valueForKeyPath("first_name") as? String) ?? ""
        self.lastName = (representation.valueForKeyPath("last_name") as? String) ?? ""
        self.phone = (representation.valueForKeyPath("phone") as? String)
        self.position = (representation.valueForKeyPath("position_name") as? String)
        self.thumbnail = UIImage(named: "ThomasBaldwin")

        if let timeCreated = representation.valueForKeyPath("time_created") as? String 
            let formatter = NSDateFormatter()
            formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
            if let date = formatter.dateFromString(timeCreated) 
                self.timeCreated = CVDate(date: date)
             else 
                self.timeCreated = CVDate(date: NSDate())
            
         else 
            self.timeCreated = CVDate(date: NSDate())
        
    

    static func collection(response response: NSHTTPURLResponse, representation: AnyObject) -> [User] 
        var users: [User] = []

        if let dataRepresentation = ((representation as! NSDictionary).valueForKey("data") as? [NSDictionary]) 
            if let dataRepresentation = dataRepresentation as? [[String: AnyObject]] 
                for userRepresentation in dataRepresentation 
                    if let user = User(response: response, representation: userRepresentation) 
                        users.append(user)
                    
                
            
        

        return users
    

注意变量idtimeCreated。这些都是在向数据库中的 Users 表添加新行时生成的,因此,在实际创建用户之前,我不会有这些变量的值。

另外,我想在模型中添加一些方法,例如validateUser 将是确保所有字段都填写的方法,validateEmail 将是确保电子邮件的方法语法正确,依此类推...

我的问题是,我是否应该A. 将这些常量设为可选并将这些方法添加到我当前的 User 模型中B. b> 制作另一个名为 CreateUserModel 的模型,该模型仅包含用户将要填写的信息的变量,并将额外的方法放入其中

更新

我更新了我的User 类以使用字典作为存储机制,它看起来已经干净了很多。然而,我想到的问题是,另一个程序员如何知道他可以从User 模型中获取哪些字段,因为我不再将它们单独存储为变量。他们是否只需要检查数据库并查看表的结构?

这是我更新的用户类:

final class User: NSObject, ResponseObjectSerializable, ResponseCollectionSerializable 

    var properties = NSDictionary()

    init?(response: NSHTTPURLResponse, representation: AnyObject) 
        if let dataRepresentation = ((representation as! NSDictionary).valueForKey("data") as? [String: AnyObject]) 
            properties = dataRepresentation
        

        properties = representation as! NSDictionary
    

    static func collection(response response: NSHTTPURLResponse, representation: AnyObject) -> [User] 
        var users: [User] = []

        if let dataRepresentation = ((representation as! NSDictionary).valueForKey("data") as? [NSDictionary]) 
            if let dataRepresentation = dataRepresentation as? [[String: AnyObject]] 
                for userRepresentation in dataRepresentation 
                    if let user = User(response: response, representation: userRepresentation) 
                        users.append(user)
                    
                
            
        

        return users
    

【问题讨论】:

【参考方案1】:

我会将它们设为可选。这就是 Optionals 的美妙之处——您可以使用 nil 来准确表示“这里没有数据”。

想到的另一个大策略是使用字典作为模型内部的存储机制,因为那样它要么有某个键,要么没有。通过将键传递给字典,您可以使您的用户对象键值编码兼容,从而有效地透明。

【讨论】:

并将验证方法添加到用户模型是这样的最佳实践,对吧?还是应该将其添加到控制器中? @Thomas 唯一的问题是:您认为谁应该了解用户有效意味着什么?在我看来,您认为这是用户本身,这也是我的直觉。 - 查看它的一个好方法是:假设我们更改了规范,或者假设我们想在另一个应用程序中重用用户。当然,让用户知道如何验证自己将为我们提供最大的灵活性。 谢谢@matt。关于您的答案,我只有最后一个问题,我更新了我的问题以显示它。谢谢! @Thomas 你知道 Stack Overflow 上的“水蛭”是什么吗?这是一个人,他的问题已经得到回答,不断地来来回回寻求更多。不要那样做。你原来的问题已经回答了。如果您有一个源于您现在正在做的事情的新问题,请提出一个新问题。谢谢。

以上是关于iOS 创建对象最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

iOS:在 Swift 中重新创建 addTarget() 的最佳实践?

DAO(数据访问对象)最佳实践 - 我看到的示例同时使用 DAO 和服务对象,这里的最佳实践是啥?

最佳实践 - iOS 中的 NSManagedObjectContextObjectsDidChangeNotification

iOS - FileManager 扩展的最佳实践

用于创建大型 CSV 文件的 java IO 最佳实践

iOS性能优化之图片最佳实践