Recentemente, ho imparato Swift e le basi per sviluppare un'app iOS. Ora, voglio sviluppare una vera applicazione da sola, ma sono molto preoccupato di scrivere un buon codice, quindi ho cercato le "migliori pratiche", i "modelli di progettazione" e "il modo giusto" per realizzarlo.Sviluppo di un'app iOS Swift "The Right Way"
Sulla mia ricerca, ho trovato questo great tutorial su tutti i motivi di progettazione normalmente usati in un'app Swift iOS ed esempi di dove sono usati.
Ma comunque considero questo tutorial un grande e mi ha aiutato molto, ho la sensazione che sia solo un inizio, perché vedo molti S.O.L.I.D. violazioni dei principi. Per esempio:
vedere il modello di facciata implementato in 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
}
}
La prima cosa che mi viene in mente vedendo questo è: Questo non viola il principio di inversione di dipendenze? Non dovrebbe essere httpClient
e persistencyManager
essere dichiarato come protocolli e quindi le classi HttpClient
e PersistencyManager
implementare tale protocollo?
Se è questo il caso, a un certo punto, dovrò definire quali classi, che implementano quei protocolli, che userò. Dove dovrei dire l'app?
Un'altra domanda che ho è: questo esempio implementa solo un modello (Album
), ma cosa succede se ne implementerebbe molti altri? (Album
, Author
, Genre
...). Non sarebbe LibraryAPI
essere così grande da violare il Principio di Responsabilità Singola?
E ultimo ma non meno importante ... Lo stesso problema con il DIP esiste in PersistencyManager
. Non dovrebbe implementare il pattern DAO, quindi `PersistencyManager non dipende dalle altre classi?
Grazie in anticipo, e spero di essermi spiegato abbastanza bene!
Questa domanda potrebbe essere meglio chiedere sullo [Scambio pila codici di revisione] (http://codereview.stackexchange.com/) –
@DanielStorm Siamo spiacenti, non sapevo nemmeno l'esistenza di questo sito. – barbarity