Strutture dati VS Classi e cosa succede se si uniscono? [chiuso]

1

Bene, ho imparato questo:

Le classi hanno metodi pubblici che eseguono operazioni sui dati della classe e nascondono le loro implementazioni.

Strutture dati d'altra parte, espongono completamente la loro implementazione attraverso le proprietà (getter e setter) e di solito non hanno metodi.

Quindi la mia domanda è, supponiamo di avere una struttura dati cliente simile a questa:

public class Customer
{
   public string FirstName { get ; set; }
   public string LastName { get ; set; }
   public List<Offer> Offers { get ; set; }
}

Suppongo che questa sia una struttura dati .

ma cosa succederebbe se durante il progetto mi rendessi conto che avrei bisogno di aggiungere alcune logiche di business alla struttura dei dati dei miei clienti?

Come un metodo per aggiungere nuove offerte perché c'è più logica nel farlo rispetto alla semplice aggiunta all'elenco?

Mi sembra che questa logica appartenga alla struttura dei dati.

Cosa succede allora? La struttura dati si trasforma in una classe? O in qualche tipo di terzo tipo di oggetto di cui non sono a conoscenza?

Questa cattiva progettazione ?

    
posta Darkalfx 18.03.2014 - 15:59
fonte

2 risposte

4

È non cattivo design per aggiungere un metodo del genere. Questo tipo di cose è in realtà molto normale quando le classi sono nella loro infanzia.

Ma le classi e le strutture dati sono un po 'diverse da come si pensa, e non si oppone o si esclude affatto l'altra. La maggior parte delle classi sono strutture di dati e molte strutture di dati sono classi. Le lezioni hanno molto più a che fare con la sintassi di una lingua - sono programmate direttamente in una lingua - mentre le strutture dati hanno più a che fare con il modo in cui intendi utilizzare determinate cose. Dici a un programma cos'è e non è una classe, ma in genere non dici a un programma quale sia e non è una struttura dati: tieni il passo da solo.

Una classe potrebbe comportare metodi - o potrebbe non esserlo. Potrebbe anche coinvolgere dati - o potrebbe non esserlo. Di solito coinvolgeranno entrambi (specialmente in linguaggi in stile Java, dove sono richiesti entrambi), ma questo non è sempre vero. Potresti persino avere una classe senza metodi né dati.

Senza entrare nei dettagli di OOP, una classe è per lo più solo una raccolta di metodi e / o dati. E una classe non deve avere membri pubblici, a proposito. Ho usato alcuni membri i cui membri erano tutti interni o privati, ad esempio.

Una struttura dati è leggermente diversa. È fondamentalmente un raggruppamento di dati che è stato strutturato in un modo particolare per uno scopo particolare. Questa potrebbe essere una classe. Ogni volta che vedi una classe con più di un dato, generalmente si tratta di una struttura di dati.

Come una classe, una struttura dati può contenere o rinunciare a metodi. A differenza di una classe, tuttavia, deve contenere una qualche forma di dati (anche se i dati sono solo un paio di variabili "vuote").

Puoi avere strutture dati che non sono classi. Ad esempio, immagina se hai due array: uno è un elenco di nomi di persone e uno è un elenco di cognomi delle persone. E se l'ennesimo elemento del primo array è il nome di qualcuno, allora l'ennesimo elemento del secondo array è il cognome di quella stessa persona. Anche se il programma e il linguaggio di programmazione possono non avere idea di questi due array sono collegati, lo fai personalmente, solo perché stai tenendo il passo con esso. Anche se questo non è un buon esempio di come di solito vuoi impostare le cose, questo costituisce comunque una struttura dati.

So che potrebbe essere stato un po 'lungo, ma spero che possa aiutarti.

    
risposta data 18.03.2014 - 16:21
fonte
1

I would assume this to be a data structure.

In particolare, è un record .

Like a method to add new offers because there's more logic in doing so than just adding it to the list?

C'è qualche condizione importante che devi mantenere nella tua lista Offers ? per esempio. Ha bisogno di rimanere in ordine? Se è così, quindi dare l'intero programma libero accesso alla lista è male. O trasformi Customer in un'astrazione (una classe o un'interfaccia) oppure trasformi Offers in uno, ma devi controllare l'accesso a tale elenco in qualche modo. Quale dovrebbe diventare l'astrazione dipende dal resto del programma e da ciò che stai cercando di fare.

Se non esiste una tale condizione, puoi semplicemente aggiungere le funzioni di piano ol che prendono il record Customer come argomento e fai tutto ciò che devi fare.

La linea di fondo è che non ogni tipo definito dall'utente nel tuo programma sarà un'astrazione di qualcosa. A volte hai dei semplici vecchi oggetti di dati. Hai bisogno di alcune astrazioni e le tue strutture di dati saranno spesso utilizzate come membri privati di alcune classi, ma potrebbero anche apparire come argomenti o valori di ritorno dei metodi di una classe, in particolare tipi semplici come tuple o record.

    
risposta data 18.03.2014 - 16:21
fonte

Leggi altre domande sui tag