Gần đây, tôi đã học được Swift và những điều cơ bản để phát triển một ứng dụng iOS. Bây giờ, tôi muốn phát triển một ứng dụng thực sự của riêng mình, nhưng tôi rất quan tâm đến việc viết mã tốt, vì vậy tôi đã tìm kiếm "các phương pháp hay nhất", "các mẫu thiết kế" và "đúng cách" để đạt được nó.Phát triển ứng dụng Swift iOS "The Right Way"
Khi tìm kiếm, tôi đã tìm thấy trang này great tutorial về tất cả các mẫu thiết kế thường được sử dụng trong ứng dụng Swift iOS và ví dụ về nơi chúng được sử dụng.
Nhưng tuy nhiên tôi xem hướng dẫn này là một hướng dẫn tuyệt vời và giúp tôi rất nhiều, tôi có cảm giác rằng đó chỉ là sự khởi đầu, bởi vì tôi thấy nhiều S.O.L.I.D. vi phạm nguyên tắc. Ví dụ:
Xem mẫu Façade thực hiện trong LibraryAPI:
class LibraryAPI: NSObject {
private let persistencyManager: PersistencyManager
private let httpClient: HTTPClient
private let isOnline: Bool
class var sharedInstance: LibraryAPI {
struct Singleton {
static let instance = LibraryAPI()
}
return Singleton.instance
}
override init() {
persistencyManager = PersistencyManager()
httpClient = HTTPClient()
isOnline = false
super.init()
NSNotificationCenter.defaultCenter().addObserver(self, selector:"downloadImage:", name: "BLDownloadImageNotification", object: nil)
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
func getAlbums() -> [Album] {
// ... Not relevant
}
func addAlbum(album: Album, index: Int) {
// ... Not relevant
}
func deleteAlbum(index: Int) {
// ... Not relevant
}
func downloadImage(notification: NSNotification) {
// ... Not relevant
}
}
Việc đầu tiên mà nói đến cái tâm của tôi nhìn thấy đây là: Có phải điều này vi phạm các Depedency Inversion Nguyên tắc? Không nên là httpClient
và persistencyManager
được khai báo là giao thức và sau đó các lớp học HttpClient
và PersistencyManager
triển khai giao thức đó?
Nếu đúng như vậy, tại một thời điểm nào đó, tôi sẽ phải xác định những lớp nào sẽ triển khai các giao thức đó, tôi sẽ sử dụng. Tôi nên nói cho ứng dụng ở đâu?
Một câu hỏi khác mà tôi có là: Ví dụ này chỉ thực hiện một Mô hình (Album
), nhưng điều gì sẽ xảy ra nếu nó thực hiện nhiều mô hình khác? (Album
, Author
, Genre
...). Sẽ không phải là LibraryAPI
quá lớn đến nỗi vi phạm Nguyên tắc về Trách nhiệm duy nhất?
Và cuối cùng nhưng không kém ... Vấn đề tương tự với DIP tồn tại trong PersistencyManager
. Không nên nó thực hiện mô hình DAO, vì vậy `PersistencyManager không phụ thuộc vào các lớp khác?
Cảm ơn bạn trước và tôi hy vọng tôi đã giải thích cho bản thân mình đủ tốt!
Câu hỏi này có thể tốt hơn để hỏi về [Mã đánh giá trao đổi ngăn xếp] (http://codereview.stackexchange.com/) –
@DanielStorm Xin lỗi, tôi thậm chí không biết sự tồn tại của trang web này. – barbarity