2015-05-21 16 views
17

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!

+6

Questa domanda potrebbe essere meglio chiedere sullo [Scambio pila codici di revisione] (http://codereview.stackexchange.com/) –

+3

@DanielStorm Siamo spiacenti, non sapevo nemmeno l'esistenza di questo sito. – barbarity

risposta

17

Alcuni suggerimenti

  1. I design pattern sono una guida per aiutarti a risparmiare sforzo di risolvere i problemi già risolti, non sono regole severe
  2. Mentre il sito si collega a (raywenderlich.com) è un buon inizio per le esercitazioni, per uno sguardo più dettagliato a modelli di progettazione in rapido suggerisco Design Patterns In Swift
  3. Se HttpClient e PersistencyManager sono classi base che forniscono l'interfaccia di un protocollo non è strettamente essenziale. Concordo sul fatto che i protocolli sono un modo più generale per andare qui
  4. Se si utilizzano protocolli, specificarei il client e il gestore di persistenza nell'inizializzatore poiché sono essenziali
  5. I modelli persistenti sono un ruolo sufficientemente specifico da essere gestito da una sola classe, vedere realm.io per un esempio db
+1

Grazie per il link. Molto, molto, molto utile! – barbarity

7

dal momento che la prima linea di stati di domanda che si vuole "sviluppare una vera e propria applicazione sul proprio" quindi voglio solo puntare nella giusta direzione.

Il fatto è non esiste il modo "migliore" di strutturare il codice.Esistono molti modi in cui è possibile scrivere codice che realizza lo stesso compito. E a meno che tu non stia lavorando in una squadra e costruisci un'app molto complicata, non importa quale approccio segui.

Come hai detto che hai imparato in fretta, ti suggerirei di concentrarti sull'apprendimento di funzionalità avanzate di chiusure e protocolli rapidi. Una volta acquisita familiarità con questi, è necessario acquisire familiarità con l'SDK di iOS che contiene numerosi framework incorporati che è necessario utilizzare nella tua app.

Infine, inizia appena con la tua app il prima possibile. Potresti non essere in grado di scrivere codice pulito e ben strutturato nella tua prima app, ma è qualcosa che imparerai nel tempo commettendo errori e correggendoli in seguito. Solo per incoraggiarti, vorrei dirti che fare una semplice app non è molto difficile, ho imparato l'obiettivo c e reso il mio primo gioco in 20 giorni e puoi farlo anche tu. Se hai bisogno di tutorial/risorse, lascia un commento, aggiornerò la risposta.

Concentrarsi sulla creazione dell'app. Migliora in seguito quando lo hai creato.

+0

Uno dei miei errori persistenti. Ho sempre voluto farlo perfettamente dall'inizio. Ma seguirò il tuo consiglio. Grazie! – barbarity

+1

Se vuoi avviare la tua app finché non acquisisci padronanza dei migliori schemi e schemi di codifica e così via ... non inizierai mai la tua app. A proposito, questo era il mio problema. Stavo pensando ad ogni dettaglio dell'app, mentre l'app non esisteva affatto. Inizia e impara dai tuoi errori. Posso dire a mio figlio di stare attento a tutte le cose pericolose in vita, ma in realtà lo imparerà se cade, perché può imparare a stare in piedi. Fallo, ci occuperemo del problema più tardi :) – AndaluZ