2017-04-26 68 views
2

我想重構我的代碼以應用乾淨的方法。如何避免以正確的方式使用單身人士?

我有一個類user

class User { 
    let name: String? 
    let id: String 
    var isOnline: Bool 

    var mesaageHistory = [Message]() 

    init(name: String, id: String, isOnlineStatus: Bool) { 
     self.name = name 
     self.id = id 
     self.isOnline = isOnlineStatus 
    } 

} 

然後我用布料上的圖案創建我的用戶列表。

protocol CreateUserProtocol: class { 
    func sortArray(inputArr: [User]) 
} 


class CreateUserEntity: CreateUserProtocol { 

    static let shared = CreateUserEntity() 
    var users = [User]() 

    func sortArray(inputArr: [User]){ 
     var applySortingByDate: Bool = false 

     for user in inputArr { 
      if !user.mesaageHistory.isEmpty { 
       applySortingByDate = true 
      } 
     } 

     if applySortingByDate { 
      inputArr.sorted(by: { (first, second) -> Bool in 
       (first.mesaageHistory.last?.messageTime)! < (second.mesaageHistory.last?.messageTime)! 
      }) 
     } else { 
      inputArr.sorted(by: { (first, second) -> Bool in 
       first.name! < second.name! 
      }) 
     } 
    } 

} 

一個控制器負責追加新用戶,而另一個控制器用於檢索它們並將它們綁定到tableView。一切工作正常,但我認爲我的解決方案不足以擴展。

此外,在我的一個VC中,我使用我的用戶進行在線和離線排序。我想,我不應該這樣做,在我的VC,並把這種邏輯到我CreateUserEntity

var onlineUsersData = [User]() 
var offlineUsersData = [User]() 

private func classifyUsers() { 
    for user in CreateUserEntity.shared.users { 

     print("is user online: \(user.isOnline)") 
     print(CreateUserEntity.shared.users.count) 

     if user.isOnline == true && !onlineUsersData.contains(user) { 
      onlineUsersData.append(user) 
     } 

     if user.isOnline == false && !offlineUsersData.contains(user) { 
      offlineUsersData.append(user) 
     } 
    } 
} 

我想重寫它在適當的方式,你能推薦我嗎?

回答

0

從我的意見,嘗試首先使用struct而不是class

例子:

struct User { 
    let name: String 
} 

那麼你應該找出你要存儲這些用戶?現在他們在記憶中。所以我們應該定義我們將在哪裏以及如何存儲它們。

因此,對於這種情況,我們可以考慮將NSUserDefaults作爲將存儲用戶的類的核心。之後,我們應該創建Facade來管理我們的用戶。

protocol UserStoreFacade { 
    func fetch(name withName:String) -> User 
    func create(name withName:String) -> User 
    func save(user:User) 
    func update(name newName:String) -> User 
    func delete(name withName:String) 
} 

UserStore用於管理用戶。

class UserStore: UserStoreFacade { 

    let defaults = UserDefaults(suiteName: "User") 

    func fetch(name withName:String) -> User { 
     let encodeData = defaults?.dictionary(forKey: withName) 
     return User(dictionary: encodeData as! Dictionary<String, AnyObject>) 
    } 

    func create(name withName: String) -> User { 
     return User(name: withName) 
    } 

    func save(user: User) { 
     defaults?.set(user.encode(), forKey: user.name) 
    } 

    func update(name newName:String) -> User { 
     return User(name: newName) 
    } 

    func delete(name withName:String) { 
     defaults?.removeObject(forKey: withName) 
    } 
} 

這是相當原始的,但仍然顯示如何可能完成。

+0

如果你投票的答案嘗試分享你的經驗,因爲我聽到也學習。 –

+0

我不是profi,但我認爲將用戶存儲在UserDefaults中並不符合最佳實踐方法。 – dand1

+0

@ dand1這只是在現實世界中的示例,您應該使用更安全的方式來存儲用戶數據。這僅僅是一個例子,它有可能實現。 –