Questa tecnica è una progettazione? Se sì, come si chiama?

3

Userò C # come esempio, ma dovrebbe applicarsi globalmente. Supponiamo che io abbia un valore stringa che dovrebbe essere una delle poche costanti, ma voglio anche che il client imposti quale valore di stringa usare così:

private int foo;
private string bar;

public int Foo {
    get { return foo; }
    set
    {
        foo = value;
        bar = getStringValueFromDatabase(value);
    }
}

public string Bar { get { return bar; } }

Uso questa tecnica parecchio e voglio sapere se è considerato come un concetto formale.

    
posta Anthony 16.11.2010 - 00:06
fonte

5 risposte

11

È una tecnica OO perfettamente valida, anche se penso che possa essere resa un po 'più efficiente se il lazy-loading (che è ciò che effettivamente è) viene posticipato fino a quando il valore di Bar è effettivamente necessario.

private int foo;
private string bar;

public int Foo 
{
    get { return foo; }
    set
    {
        foo = value;
        bar = null;
    }
}

public string Bar
{ 
    get 
    { 
        if(bar == null) 
            bar = getStringValueFromDatabase(Foo);
        return bar; 
    } 
}

Modifica : penso che si tratti di un miglioramento del codice originale sebbene, come altri hanno osservato, sarebbe anche meglio astrarre l'accesso ai dati in un livello separato.

    
risposta data 16.11.2010 - 00:34
fonte
3

Bene, è simile al metodo Lazy Loading, ma non è esattamente quello. A prima vista, in realtà sembra un po 'pericoloso, in tale contesto una proprietà ha effetti collaterali. Credo che questo sia generalmente disapprovato, ma questa non è certo una violazione egregia.

    
risposta data 16.11.2010 - 00:16
fonte
2

Il concetto che penso è qualcosa di simile a una chiave esterna del database, un'associazione tra due entità in cui una entità si riferisce all'altra tramite un handle (la chiave). Più in generale, puoi chiamarlo associazione indiretta .

Ci sono due aspetti che dipendono dal tempo a questo:

  1. Impostazione dell'impostazione , creando così l'associazione
  2. Recupero dell'entità associata tramite l'handle

Ci sono molti modi per codificarlo, con desideroso o caricamento lento , recuperando l'entità correlata ogni volta che viene richiesto, usando un proxy , con o senza accoppiamento temporale , e anche la cui responsabilità è quella di eseguire i due aspetti precedenti (potrebbe essere l'entità referente o il codice client), che potrebbe potenzialmente trasformarlo in un < strong> associazione diretta dall'entità referente all'entità riferita (l'indirezione sarebbe solo nota al codice cliente).

    
risposta data 01.01.2012 - 15:32
fonte
1

Se possibile, è più sicuro passare foo nel costruttore e renderlo readonly / final. Quindi hai creato un oggetto con dipendenze. quando chiami il getter della barra, usa lo stato catturato per calcolare il valore se vuoi farlo pigramente.

    
risposta data 16.11.2010 - 00:39
fonte
0

Say I have a string value that should be one of a few constants, but I also want the client to set which string value to use so:

  1. Una costante che viene cambiata? Eh?

  2. Quello che stai facendo è cambiare una proprietà che è supportata da un archivio dati. È non una costante. Potrebbe essere una variabile di configurazione.

  3. Il nome Pattern potrebbe essere Facade o Decorator o simile. Se il mio codice funziona, ed è manutenibile, non mi preoccupo dei nomi dei pattern.

Il mio commento sul tuo codice è che dovresti avere un altro livello di riferimento indiretto, una funzione che gestisce la memorizzazione / il ripristino dei dati. Ciò lo astrarrà dalla chiamata al database.

    
risposta data 16.11.2010 - 00:31
fonte

Leggi altre domande sui tag