Qual è un modo elegante per tenere traccia delle dimensioni di un insieme di oggetti senza una singola raccolta autorevole a cui fare riferimento?

StackOverflow https://stackoverflow.com/questions/309852

Domanda

Aggiornamento: leggi questa domanda nel contesto dei principi di progettazione, dell'eleganza, dell'espressione dell'intento, e in particolare dei "segnali". inviato ad altri programmatori per scelta progettuale.

Ho due " viste " di un insieme di oggetti. Uno è un dizionario / mappa che indicizza gli oggetti in base a un valore di stringa. L'altro è un dizionario / mappa che indicizza gli oggetti in base a un numero ordinale (intero ordinante). Non esiste un "master" raccolta degli oggetti da soli che possono fungere da fonte autorevole per il numero di oggetti, ma i due dizionari dovrebbero sempre contenere entrambi riferimenti a tutti gli oggetti.

Quando un nuovo elemento viene aggiunto al set viene aggiunto un riferimento a entrambi i dizionari, quindi è necessario eseguire alcune elaborazioni che sono influenzate dal nuovo numero totale di oggetti.

Cosa devo usare come fonte autorevole per fare riferimento alla dimensione corrente dell'insieme di oggetti? Sembra che tutte le mie opzioni siano imperfette in una dimensione o nell'altra. Posso solo fare costantemente riferimento a uno dei dizionari, ma ciò codificherebbe un'implicazione della superiorità di quel dizionario rispetto all'altro. Potrei aggiungere una terza raccolta, un semplice elenco degli oggetti da utilizzare come elenco autorevole, ma ciò aumenta la ridondanza. La memorizzazione di un conteggio progressivo sembra più semplice, ma aumenta anche la ridondanza ed è più fragile rispetto al riferimento al conteggio auto-seguito di una raccolta al volo.

Esiste un'altra opzione che mi permetterà di evitare di scegliere il male minore o dovrò accettare un compromesso sull'eleganza?

È stato utile?

Soluzione

Vorrei creare una classe che abbia (almeno) due raccolte.

  • Una versione della raccolta che è ordinati per stringa
  • Una versione di     raccolta ordinata per ordinale
  • (Opzionale) Una collezione principale

La classe gestirà la gestione grintosa:

  • La sincronizzazione dei contenuti per le raccolte
  • Azioni di raccolta standard (ad es. Consenti agli utenti di ottenere le dimensioni, Aggiungi o recupera elementi)
  • Consenti agli utenti di ottenere per stringa o ordinali

In questo modo puoi utilizzare la stessa raccolta ovunque tu abbia bisogno di entrambi i comportamenti, ma rimuovendo comunque la "indicizzazione" comportamento che stai cercando.

La classe separata ti offre un'unica interfaccia con cui spiegare il tuo intento su come usare questa classe.

Altri suggerimenti

Suggerirei l'incapsulamento: creare una classe che nasconda la "gestione" dettagli (come il conteggio corrente) e utilizzarlo per esporre "visualizzazioni" immutabili delle due raccolte.

I clienti chiederanno il " manglement " oggetto per un riferimento appropriato a una delle raccolte.

Clienti che aggiungono un termine "quot" (per mancanza di una parola migliore) le raccolte lo faranno attraverso il "manglement" oggetto.

In questo modo le tue ipotesi e le tue scelte di implementazione sono "nascoste" dai clienti del servizio e puoi documentare che la scelta della raccolta per dimensione / conteggio è stata arbitraria. I futuri manutentori possono cambiare la modalità di gestione del conteggio senza interrompere i client.

A proposito, sì, intendevo " manglement " - il mio malapropismo preferito per la gestione (in qualsiasi contesto!)

Se entrambi i dizionari contengono riferimenti ad ogni oggetto, il conteggio dovrebbe essere lo stesso per entrambi, giusto? In tal caso, scegline uno e sii coerente.

Non penso che sia un grosso problema. Fai semplicemente riferimento ai set nello stesso ordine ogni volta devi accedervi.

Se sei davvero preoccupato, potresti incapsulare le raccolte con un wrapper che espone le interfacce pubbliche, come

  • Aggiungi (voce)
  • Count ()

In questo modo sarà sempre coerente e atomico - o almeno potresti implementarlo in quel modo.

Ma non credo sia un grosso problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top