Come evitare di avere un ID oggetto come chiave in una mappa e anche all'interno dell'oggetto stesso?

1

Sto usando una mappa JSON per salvare oggetti (ad es. utenti) i cui id sono le chiavi della mappa ma l'oggetto (utente) stesso contiene anche l'id.

JSON

{
   "john":{
      "username":"john",
      "age":30
   },
   "bob":{
      "username":"bob",
      "age":40
   },
   "chris":{
      "username":"chris",
      "age":50
   }
}

Class

class user {
   String username;
   Integer age;

   getUsername() {
      return username;
   }
}

Voglio usare la mappa per recuperare facilmente gli oggetti ma allo stesso tempo non voglio avere id come chiavi nella mappa e come attributi dell'oggetto. Qual è la soluzione più pulita per questo?

Posso pensare alle seguenti soluzioni:

  1. Non utilizzare la mappa ma elencare. , ma l'accesso agli elementi richiederà un'iterazione nell'elenco e non è possibile utilizzare semplici metodi get(K key) .
  2. Non salvare il nome utente nell'oggetto , ma allora getUsername() dovrà sapere dove è stato salvato nella mappa che sarà un accoppiamento davvero brutto.
  3. Utilizza le enumerazioni per i nomi utente , ma gli utenti non possono essere letti dinamicamente da JSON.
posta mrplow 27.12.2016 - 21:13
fonte

3 risposte

4

L'utente è un'entità della tua applicazione e come tale dovrebbe contenere tutti i campi necessari che rappresentano un vero utente.

L'entità utente non ha assolutamente nulla a che fare con le varie strutture che usi nell'intera applicazione per prestazioni, visualizzazione, persistenza, ecc. Gli elementi di una raccolta non dovrebbero essere a conoscenza della collezione in cui sono detenuti. Solo perché una mappa ha bisogno di una chiave per memorizzare un valore, non significa che devi fare qualcosa per il valore per rimuovere la duplicazione.

Stai pensando troppo a questo. Non c'è alcun problema con il nome utente nella rappresentazione JSON. Man mano che la tua applicazione cresce, vedrai che lavorare con le entità invece dei singoli campi rende la tua API / codice più intuitiva.

    
risposta data 28.12.2016 - 10:38
fonte
3

Considera di separare le tue preoccupazioni. In questo momento stai salvando i tuoi dati indicizzati. Tuttavia, l'indicizzazione dei dati è un dettaglio di implementazione. Cosa succede se trovi che stai recuperando in base all'età abbastanza spesso da indicizzare in base a questo?

Invece, salva come array e quando carichi i dati esegui l'indicizzazione. Elabora i dati in una struttura utile in memoria, dove la duplicazione è accettabile. Quando salvi, rimuovi la duplicazione. Ciò riduce al minimo la quantità di informazioni salvate su disco o trasmesse via cavo. Ricorda che anche oggi la CPU è più veloce di un ordine di grandezza rispetto al disco, che è un ordine di grandezza più veloce di Internet.

    
risposta data 28.12.2016 - 01:01
fonte
0

In primo luogo, lasciatemi dire che sono completamente d'accordo con le risposte fornite da @Bogdan e @KevinFee. Detto questo, la mia risposta si limiterà ad ampliare le loro risposte fornendo un suggerimento su come è possibile ottenere questo.

Considera l'utilizzo del seguente approccio:

class User
{
    public int Age { get; set; }
}

class IdentifiedUser : User 
{
    public string Username { get; set; }

    public IdentifiedUser(User user, string username)
    {
        Username = username;
        Age = user.Age;
    }

    public User CreateUser()
    {
        return new User
        {
            Age = this.Age
        };
    }
}

class UserRepository
{
    public Dictionary<string, User> Repository = new Dictionary<string, User>();

    public void AddUser(IdentifiedUser identifiedUser)
    {
        Repository.Add(identifiedUser.Username, identifiedUser.CreateUser());
    }

    public IdentifiedUser GetUser(string username)
    {
        return new IdentifiedUser(Repository[username], username);
    }
}

Ora ovviamente, ho omesso alcune delle buone pratiche come i controlli dell'esistenza della chiave nel dizionario perché voglio concentrarmi sul problema in questione.

L'idea è di avere il repository di oggetti che non contengono informazioni ridondanti, ma di fornire anche un meccanismo per fornire quegli oggetti al mondo esterno con i dati di identificazione inclusi. Questo potrebbe anche essere ottenuto attraverso l'associazione piuttosto che l'ereditarietà. In questo modo, si riduce al minimo lo spazio su disco, a costo di un sovraccarico della CPU trascurabile.

    
risposta data 28.12.2016 - 13:56
fonte

Leggi altre domande sui tag