È possibile utilizzare il modello peso vivo con oggetti mutabili o no?

6

Recentemente ho imparato a conoscere il modello di peso vivo da questo link .

È scritto lì:

It’s very important that the flyweight objects are immutable: any operation on the state must be performed by the factory.

Non l'ho capito bene Qualsiasi opinione sarà apprezzata.

    
posta Mohammad Nazmul Hossain 07.11.2018 - 05:41
fonte

3 risposte

13

Gli oggetti volanti devono essere immutabili perché la nostra fabbrica può garantire di aver ricordato l'oggetto corretto solo se può anche garantire che l'oggetto originariamente creato non sia stato modificato.

Gli oggetti volanti forniscono un modo efficiente di memoria per condividere lo stato comune tra gli oggetti. Questo stato comune è chiamato "intrinseco". Lo stato intrinseco deve essere mantenuto immutabile, perché se lo si modifica, lo si cambia per ogni oggetto che condivide lo stato intrinseco.

La natura immutabile dello stato intrinseco consente inoltre al flyweight di essere sicuro per i thread.

Ci sono diverse descrizioni di Flyweight su Internet, ma la maggior parte di esse non sono molto buone. Il migliore che ho trovato finora è qui: link

    
risposta data 07.11.2018 - 06:58
fonte
3

Mentre il modello del peso mosca definisce se stesso con oggetti immutabili "volanti", continuerà comunque a raggiungere l'obiettivo di ridurre l'utilizzo della RAM se non li rendi immutabili.

Il problema nel rendere gli oggetti mutabili è che, ad esempio, il tuo oggetto "Albero" ha diverse proprietà, alcuni sono memorizzati su un oggetto volante e alcuni appartengono all'istanza.

public class Tree
{
    public int x { get; set;}
    public int y { get; set;}
    private static flyTree; //shared across many trees
    public int Colour 
    {
        get { return flyTree.Colour;}
        set { flyTree.Colour = value;}
    }
}

Quando cambi, ad esempio, le coordinate xey cambieranno solo per quell'istanza di Tree. Ma quando cambi colore, cambierà per tutti gli alberi.

Come utente dell'oggetto Tree non avrai un modo semplice per dire quali proprietà appartengono all'albero e quali appartengono all'oggetto di peso volante sottostante.

Rendere immutabile la parte condivisa del peso volatile impedisce a uno sviluppatore di modificare accidentalmente una proprietà su tutti gli alberi quando intendono cambiarla solo per un albero.

    
risposta data 07.11.2018 - 10:17
fonte
1

Gli altri hanno già detto che lo schema tipicamente deve essere immutabile poiché altrimenti il modello si rompe, ma hanno torto in quanto deve essere assolutamente immutabile . Copy-on-write è essenzialmente il modo in cui devi creare qualcosa che utilizza il modello a peso mosca ed è mutevole. Ecco come viene condivisa la memoria, per esempio. L'oggetto flyweight può essere utilizzato fino a quando non si verifica una qualsiasi forma di modifica, momento in cui deve essere eseguita una copia.

Tuttavia, può essere un po 'complicato o soggetto a errori. Il peso mosca deve essere consapevole di tutti i modi in cui gli oggetti sottostanti possono essere mutati e devono esserci dei ganci in tutti loro. Ha davvero senso solo se le cose sono frequentemente non mutate.

    
risposta data 14.12.2018 - 21:57
fonte

Leggi altre domande sui tag