Una chiave di ricerca è una proprietà?

3

Questo è innescato da questo dove un OP non voleva aggiungere una stringa che stava usando per una ricerca di chiavi perché non considerava la proprietà della classe.

Per me il fatto che lo stai usando per una ricerca significa che è una proprietà. Per me qualsiasi cosa tu cerchi è una proprietà legittima della classe.

È possibile che una chiave di ricerca non sia considerata una proprietà della classe?

Esempio

class MyClass 
{
     public string Description 
}

Dictionary<string, List<MyClass>>  MyClasss

Versus

class MyClassWithName 
{
     public string Description 
     public string Name
}

List<MyClassWithName>  MyClassesWithName

Sì, la ricerca / ricerca è passata da O (1) a O (n) ma MyClassWithName ha violato qualcosa?

    
posta paparazzo 28.04.2017 - 23:56
fonte

4 risposte

2

Sia tu che i tuoi amici state pensando a qualcosa di astratto. Dipende dal significato e dallo scopo degli oggetti e delle proprietà in questione.

Supponiamo di recuperare un elenco di entità da un database. Per ottimizzare la ricerca, crei un dizionario che mappa dall'ID entità all'entità. In questo caso l'id sarebbe sia la chiave nel dizionario sia una proprietà sull'oggetto.

In un altro caso potresti contare la frequenza delle parole in un testo costruendo un dizionario da una parola a un contatore intero. In questo caso la chiave non è una proprietà sul valore.

Quindi entrambi i casi sono possibili.

    
risposta data 29.04.2017 - 01:30
fonte
1

To me the fact you are using it a for a lookup means it is a property.

Questa è una conclusione imprecisa. Uno non implica l'altro. Se guardi i dati attraverso gli occhiali colorati SQL, hai ragione - la chiave è una proprietà di una riga. Ma non è vero in generale.

To me anything you search on would be a legitimate property of the class.

Ancora una volta, è vero se si guarda da un punto di vista SQL ma non è vero nel modello generale dei dati.

Could a lookup key not be considered a property of the class?

Sì.

Permettetemi di darvi un esempio dal punto di vista CAD. Una Parte può avere varie proprietà: massa, volume, superficie, densità, ecc. Possono essere tutte memorizzate in una mappa usando std::map<std::string, quantity> ( quantity rappresenta un numero e un'unità). In questo caso, ha senso rendere "di massa" una proprietà di quantity . Un quantity rappresenta solo un numero e un'unità. Che possa essere usato per catturare la massa di una parte non cambia ciò che è l'astrazione quantity .

Yes lookup/search has gone from O(1) to O(n) but has MyClassWithName violated anything?

Definisci una classe chiamata MyClassWithName solo se ha senso come tipo, non come modo per acquisire il nome in una lista che ovvia alla necessità di una mappa / dizionario per scopi di ricerca. Inoltre, puoi andare avanti e utilizzare Dictionary<string, List<MyClassWithName>> per rendere la ricerca più efficiente.

    
risposta data 29.04.2017 - 06:26
fonte
0

È importante che una classe non abbia campi aggiuntivi non correlati a quella classe.

Ad esempio se hai aggiunto una stringa casuale che stavi usando per indicizzare una raccolta di quella classe in un posto. Quindi logicamente aggiungerei un numero intero casuale che stavi usando per indicizzare un'altra raccolta da qualche altra parte.

La classe si gonfia con proprietà extra.

Tuttavia, ho trovato che, le classi di cui ho bisogno di collezioni, sono di solito entità, e come tali hanno sempre un campo di identificazione.

Quindi nella tua situazione mi chiederei "perché questa classe non ha un campo ID che posso usare come mio indice?"

    
risposta data 29.04.2017 - 03:50
fonte
-2

Penso che tu stia confondendo le chiavi e le proprietà di ricerca.

Le chiavi di ricerca si verificano nel contesto di una classe contenitore con chiave (ad esempio un hash). Se stai discutendo una classe non contenitore come Person , Organization , Membership , ecc. Allora non ha senso parlare di chiavi di ricerca perché non ce ne sono.

Tuttavia, se stai pensando di memorizzare istanze di classe in un contenitore, una delle proprietà potrebbe essere utilizzata come chiave di ricerca .

In primo luogo, dovresti decidere se la classe dovrebbe avere la proprietà, cioè devi rispondere alla domanda "Il mio modello di dominio giustifica la definizione della proprietà su questa classe?". In secondo luogo, decidi quali sono le chiavi della tua collezione.

Mi piacerebbe anche notare che nel tuo esempio non solo la complessità temporale è cambiata ma anche:

  1. L'interfaccia esposta dalla raccolta.
  2. List<MyClassWithName> può memorizzare duplicati. Dictionary<string, List<MyClass>> non può.
  3. List<MyClassWithName> è ordinato. Dictionary<string, List<MyClass>> non lo è.
risposta data 29.04.2017 - 04:41
fonte

Leggi altre domande sui tag