Devo scrivere vares computati che dipendono tutti da un'altra var, o dovrei assegnarli come vars normali nel setter di quella singola variabile?

1

Sto usando Swift, ma capisco che le proprietà calcolate sono una cosa anche in poche altre lingue. Ho il seguente caso:

  • var bar nella classe Foo è cambiato nel flusso del programma.
  • vars a , b , c e d sono vincolati al valore di bar così definirli come proprietà calcolate è un modo pulito per gestirli.
  • i vincoli sono semplici calcoli che prendono bar e producono un valore

Riesco a scrivere la formula nel getter di ciascuna delle singole vars (le formule variano leggermente), oppure potrei fare in modo che le vars siano proprietà normali e assegnarle solo nell'insieme di bar .
Quale è più preferibile? C'è altro da considerare rispetto allo stile?

    
posta Kevin 08.12.2017 - 15:57
fonte

3 risposte

3

Sì, se sposti il calcolo su getter di queste proprietà, allora verrà eseguito solo quando leggi effettivamente quelle proprietà calcolate, e non tutte le volte che è necessario o no. Che ciò faccia la differenza o no dipende interamente da quanto sia comune l'accesso e quanto costoso sia il calcolo.

    
risposta data 08.12.2017 - 16:06
fonte
1

Un'altra opzione basata sulla risposta di @ Killian sarebbe quella di mantenere il calcolo nel getter, ma di conservarlo nella cache, per evitare i calcoli in ogni lettura.

Ecco un codice in C # per illustrare questo:

public int? _cachedA = null;

private int _foo;

public int Foo {
    get { return _foo; }
    set {
        _foo = value;
        _cachedA = null;
    }
}

public int A {
    get {
        if (_cachedA == null) {
            _cachedA = magical_calculation(Foo);
        }
        return _cachedA;
    }
}
    
risposta data 11.12.2017 - 14:19
fonte
-1

È un classico confronto tempo / spazio.

Se a , b e c sono banali da derivare da bar , allora è più semplice avere solo proprietà calcolate che derivano un valore da bar .

Se sono costosi da calcolare, e abbastanza piccoli da meritare la memoria nella cache, allora dovresti renderli proprietà memorizzate. Il loro valore dovrebbe essere calcolato e memorizzato nella cache quando bar è cambiato, o quando vi si accede, a seconda di quale sia meno frequente.

    
risposta data 11.12.2017 - 06:10
fonte

Leggi altre domande sui tag