Usando il riferimento "auto" opzionale nei metodi di istanza in Swift come questione di stile

5

Swift consente il prefisso facoltativo di chiamate di metodo e riferimenti di proprietà all'istanza dell'oggetto corrente tramite self . La rimozione di questi prefissi può declutterare il codice ma, a seconda della lunghezza del metodo e del numero di parametri e variabili locali, può anche rendere ambiguo lo scope variabile.

Forse la risposta è il refactoring in classi e metodi più piccoli, ma a volte non è sempre pratico. Esempi comuni sono cose come UIViewController sottoclassi e custom viewDidLoad() implementazioni o complessi gestori di azioni per UIGestureRecognizer sottoclassi. Ci ho pensato un po 'da quando mi sono immerso nello sviluppo di un'applicazione iOS in Swift ma sono ancora sulla recinzione. La mia risposta ideale dovrebbe toccare:

  1. Se non si fa riferimento a self ha degli svantaggi pratici.

  2. Se mescolare riferimenti impliciti ed espliciti a self è peggio che si attengono a uno o l'altro (mi sto orientando verso si ).

  3. Aspetti stilistici generali con particolare attenzione alla leggibilità.

  4. Stili di denominazione delle variabili di istanza rispetto agli stili di denominazione delle variabili locali per mitigare l'ambiguità.

  5. Riferimenti a problemi simili in altre lingue.

posta A. R. Younce 08.12.2014 - 23:38
fonte

3 risposte

5

Credo che questo non sia altro che una questione di stile - nessuna "misura di leggibilità" (che è sempre personale) può aiutarti qui.

Quindi, prima di andare oltre, lasciami dire: qualunque sia la scelta di stile, se stai lavorando in una squadra, definisci uno standard chiaro che tutto il team deve rispettare, perché se c'è una cosa che tutti possono d'accordo sul fatto che rende il codice meno leggibile, è necessario tenere il passo con diverse scelte di stile mentre lo leggi.

Ma ora l'argomento principale: self , this o me , come presenti in molte lingue OO, sono presenti in modo approssimativo per i seguenti motivi:

  1. Essere in grado di passare un'istanza dell'oggetto corrente ad altri;
  2. Accesso a proprietà speciali altrimenti non disponibili, ad esempio proprietà riflettente this.class in Java;
  3. Per consentire l'utilizzo di nomi altrimenti in conflitto negli ambiti locali.

Come per molti altri dettagli che vengono estratti da noi quando usiamo i linguaggi OO (vtables, ecc.), anche self potrebbe essere nascosto, se non fosse per le ragioni precedenti.

Quindi la mia opinione è che dovresti usarla solo quando necessario , come sopra. Ovviamente, questa idea funziona bene insieme alla pratica di creare classi e metodi di piccole dimensioni; altrimenti, sia i tuoi obiettivi locali che quelli globali saranno così grandi che sarà sempre fonte di confusione, costringendo il lettore a saltare su e giù nel codice, cercando le definizioni. Ma sono tentato di dire, in questi casi, che non è la coerenza dello stile a salvarti.

    
risposta data 10.12.2014 - 00:58
fonte
2

Non usare te stesso ti farà pensare due volte ogni volta che usi una variabile. IMHO scrivere codice pulito è una questione di stile. Lo stile in Objective-C è usare self con le proprietà. Poiché la stragrande maggioranza dei programmatori Swift proviene da Obj-C, questo stile dovrebbe essere mantenuto.

    
risposta data 30.07.2015 - 00:17
fonte
1

Specificamente nel caso di Swift, credo che ci siano alcuni vantaggi nell'abbandonare self se non richiesto esplicitamente dal compilatore:

  1. Usando self solo dove richiesto (cioè nelle chiusure in cui viene catturato il sé) rende molto più facile individuare le situazioni in cui i riferimenti a sé possono essere conservati in modo improprio.

  2. Mi sono imbattuto in un problema interessante in cui l'uso di sé sembra impedire la visualizzazione dei messaggi di avviso:

class MyObject {
    var myRange: Range‹Int›? {
        willSet {
            // This line has a warning that you are operating on a property that is about to change
            myRange?.startIndex = 2
            // This line does not show any warning
            self.myRange?.endIndex = 3
        }
    }
}

Potresti sostenere che si tratta di un bug, ma penso che sia importante che self cambi il modo in cui vengono trattate alcune espressioni, se non altro per gli avvertimenti.

    
risposta data 10.01.2015 - 18:43
fonte

Leggi altre domande sui tag