Naming self o questo qualcos'altro, una buona idea?

3

Sto trovando che il mio codice diventa più leggibile quando faccio un riferimento locale a questo / self, e / o lo chiamo qualcosa che abbia senso nel contesto. "self" o "this" in realtà non indicano il tipo di oggetto con cui abbiamo a che fare, nello stesso modo in cui "default" o "standard" o "master" non è chiaro perché non è esplicito.

Ad esempio, in codice Python, invece di nominare il riferimento di istanza "self", potresti chiamarlo in un altro modo:

class User:
    def getFullName(user):
        return user.firstName + " " + user.lastName

Quali sono gli argomenti per nominare se stessi, invece di qualcosa di più esplicito, come "utente" in questo caso?

Un esempio simile in JavaScript quando si esegue un mixin manuale:

function asUser(obj, name) {
    var user = obj;
    user.name = name;
    return user;
}

Credo che in JavaScript questo sia meno controverso, perché non esiste una strong tradizione nell'usare una determinata denominazione, come nel caso di "self" in Python.

    
posta Magnus Wolffelt 19.11.2014 - 16:00
fonte

2 risposte

6

In generale, penso che potrebbe rendere il tuo codice meno leggibile . Semplicemente perché all'interno di classi diverse utilizzerai diverse parole per fare riferimento all'istanza. Ho rifatto un sacco di codice per una vita e un this , self o anche _this viene immediatamente scansionato da me come riferimento all'istanza.

Potrebbe non corrispondere esattamente ai tuoi requisiti ma in JavaScript dobbiamo rinominare frequentemente this ! Questa parola chiave perde il contesto all'interno dei callback e fa riferimento a window / global!

link link

var _this = this;
var self = this;

È il modo in cui rotte la maggior parte delle librerie JS!

    
risposta data 28.12.2014 - 18:35
fonte
4

Questo è un errore enorme. self è una convenzione ben usurata in Python e quindi qualsiasi programmatore Python che incontri questo codice sarà immediatamente confuso. Qualsiasi programmatore esperto vedrà self e penserà istintivamente "Sto osservando una definizione di metodo e questa particolare linea sta accedendo a un attributo dell'oggetto".

Chiamalo qualcos'altro e hai perso il vantaggio di quell'istinto. Per un metodo a due linee come sopra, questo produrrà alcuni minuti di graffi alla testa. Se il metodo è complesso, forse venti righe, produrrà molta più confusione e il programmatore python medio finirà per pensare "oh aspetta ... user è l'oggetto self ". Questo perderà tempo se non altro.

La confusione si moltiplica se qualsiasi codice esterno all'oggetto utilizza user come nome, che è, ovviamente, la cosa ovvia per denominare un oggetto di tipo User esterno della classe. Ciò significa che continuerai a pensare "Oh, aspetta, sono dentro alla classe o no?"

Parlando a lungo termine C ++ e quindi codificatore Python, il tuo primo esempio sembra strano. Il mio cervello non vuole neanche pensarci come un metodo nonostante sappia che lo è. user sembra un qualcosa che viene "passato dentro" dall'esterno dell'oggetto, ed è un vero lavoro mentale rendersi conto che non è qualcosa di esterno all'oggetto.

La convenzione è di fondamentale importanza nella leggibilità del codice. Ecco perché abbiamo guide di stile. Una cosa che guadagna la reputazione di Python per la leggibilità è che ha una guida di stile chiaramente definita a cui è più conforme. self ne fa parte.

    
risposta data 28.12.2014 - 22:18
fonte

Leggi altre domande sui tag