模型類的想法是封裝在自己的課堂上使用的應用程序中的數據,提供了從控制器和視圖模型的清晰分離。請參閱Model-View-Controller Apple的可可核心能力。或參閱Model object。
但是拋開這些更廣泛的設計原則,讓我們考慮一下您的User
類:這是一個封裝了一系列屬性的類,即一個標識符,名稱,電子郵件地址和圖像URL。那麼,爲什麼使用User
類型,而不是單個屬性和/或標準集合?
讓我們考慮的替代方案,這是說明爲什麼像User
一個模型對象可以是強大的:
考慮其維持的用戶列表的應用程序。 User
對象的數組是更爲方便比,說的標識,名稱,電子郵件等。例如,如果你想用戶進行排序的名字列表什麼單獨的陣列?如果你將所有這些屬性放在不同的陣列中,跟蹤它們將會非常複雜。
所以,讓我們說,你認識到,保持這些各種屬性都在一起是強大的,所以你決定使用簡單的字典來做到這一點。然後一組用戶可以表示爲一個字典數組。這解決了以前的問題。
但它引入了其他問題。例如,它現在是在你有責任,程序員,使用正確的按鍵本字典,編譯器不能爲您提供任何線索,它預計什麼這個字典中的鍵應該是,更不用說任何規則管理與這些密鑰相關的數據類型。
更糟的是,你可能會與此User
對象相關的業務規則,即id
和name
可能是必需的,但該電子郵件地址和圖片URL是可選的。此外,您可能希望將一些業務規則應用於電子郵件地址和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
類時,這些規則會在編譯時執行,消除所有類型的編程問題。這些屬性是強類型的,各種屬性的可變性和可選性很好地封裝在這個簡單的類型中。
底線,有良好設計的模型類型,編寫安全使用和與這些模型類交互的好代碼更容易。
來源
2016-07-26 00:53:52
Rob
提供指向原始代碼的鏈接。另外你的問題太模糊了:「它是什麼以及它是如何工作的」都是開放式的。 – matt