La duplicazione dei dati è errata nella programmazione (a differenza della progettazione di database)?

0

Ho tre classi: User , Conversation e Message :

Proprietà messaggio:

User sender;
// Some more

Proprietà conversazione:

List<Message> messages;
List<User> participants;
// Some more

Voglio mostrare nel programma il creatore della conversazione. Mi chiedo se è una cattiva programmazione aggiungere una proprietà creator alla classe Conversation , quindi potrei accedervi facilmente e il codice diventerebbe più leggibile.

List<Message> messages;
List<User> participants;
User creator
{
    get
    {
        return participants[0];
    }
}
// Use of the property:
conversationObj.creator;
// Instead Of:
conversation.participants[0];

È considerata la duplicazione dei dati perché potrei ottenerla direttamente dalla proprietà participants ? O la duplicazione dei dati è sbagliata solo quando si progetta un database?

Grazie.

    
posta Sipo 15.05.2016 - 12:12
fonte

3 risposte

6

Non è una duplicazione di dati nel senso di denormalizzazione; tutto ciò che è, è un metodo accessorio aggiuntivo.

La duplicazione di dati nel senso di denormalizzazione o memorizzazione nella cache (un altro modo per descrivere la denormalizzazione) coinvolgerebbe un campo di istanza che cattura participant[0] .

Questa particolare implementazione, con un getter esplicito e nessun setter, non è fornita con un backing field (automatico dalla lingua o dal manuale dell'utente); il codice getter viene eseguito ogni volta. Pertanto non è la duplicazione dei dati.

Vorrei equiparare gli argomenti per la denormalizzazione nel database al caching nel codice: è comunemente fatto per le prestazioni, ma come dice @ Jörg, rende il sistema più incline agli errori ora e anche per la manutenzione futura. Inoltre, il caching / denormalizzazione ha costi di storage e costi computazionali. Quindi, come tutte le ottimizzazioni, la caching / denormalizzazione dovrebbe essere applicata quando abbiamo test misurabili che dimostrano una buona comprensione del problema e che la soluzione risulta in miglioramento.

    
risposta data 15.05.2016 - 18:34
fonte
7

Non direi che c'è una risposta definitiva qui. In questo caso, sarei sicuramente d'accordo con quel getter, perché conversation.creator è semanticamente più significativo di conversation.participants[0] e aiuta a scrivere il codice di auto-documentazione.

    
risposta data 15.05.2016 - 12:24
fonte
2

Ci sono in realtà due domande qui:

Is this data duplication?

No. Nessun dato viene duplicato. Stai solo fornendo un altro riferimento a dati già esistenti. Pensaci in questo modo: non importa se dici a qualcuno l'indirizzo di casa tua o descrivi la posizione della tua casa rispetto a qualche punto di riferimento, entrambe le descrizioni finiscono comunque nella stessa casa.

Is data duplication bad?

No. La cosa giusta è difficile , motivo per cui è comunemente evitato, ma non è male.

Hai mai sentito parlare di cache? Questa è la duplicazione dei dati proprio lì. Indici del database? Duplicazione dei dati.

Ciò che è cattivo sta confondendo la provenienza dei dati.

Potresti avere più copie di dati, ma dovrebbe sempre essere chiaro che è autorevole . (Non appena hai più copie di dati, ti imbatti in tutti i tipi di problemi, come tenerli sincronizzati, invalidarli se la copia autorevole cambia, ecc. Questo è difficile , ma non è intrinsecamente cattivo. Se hai una serata pigra, prova a leggere su protocolli di coerenza della cache multi-CPU per avere un'idea di quanto sia veramente difficile.)

    
risposta data 15.05.2016 - 18:35
fonte

Leggi altre domande sui tag