Perché dovremmo preferibilmente usare collezioni di prima classe?

14

Come da regola numero 4 di Oggetto Calisthenics di Jeff Bay (RTF) Utilizza raccolte di prima classe ".

Rule 4: First class collections

Application of this rule is simple: any class that contains a collection should contain no other member variables. Each collection gets wrapped in its own class, so now behaviors related to the collection have a home. You may find that filters become a part of this new class. Also, your new class can handle activities like joining two groups together or applying a rule to each element of the group.

Ciò che ho potuto capire da questo è che dovremmo utilizzare una classe separata che avvolge la raccolta e con i metodi per aggiungere, eliminare i dati di modifica di quella raccolta.

e abbiamo bisogno di questo in modo da essere certi di quale tipo di dati vada inserito nella raccolta e di cosa viene fuori.

Se utilizziamo la raccolta generica (nelle lingue in cui è applicabile), dobbiamo seguire questa regola?

Se mi manca un significato importante, ti preghiamo di chiarire.

    
posta Amogh Talpallikar 12.03.2012 - 15:00
fonte

3 risposte

12

Digitare la sicurezza è un motivo molto minore per utilizzare raccolte di prima classe. Dal tuo link:

Rule 4: First class collections Application of this rule is simple: any class that contains a collection should contain no other member variables. Each collection gets wrapped in its own class, so now behaviors related to the collection have a home. You may find that filters become a part of this new class. Also, your new class can handle activities like joining two groups together or applying a rule to each element of the group.

L'idea qui è che se ti trovi a cercare, filtrare, convalidare o qualcosa oltre a aggiungere / rimuovere / iterare la semantica su una raccolta, il codice ti sta chiedendo di metterlo nella sua classe. Se devi aggiornare solo un valore (dopo una ricerca), questo probabilmente va nella classe di raccolta.

Il ragionamento per questo è piuttosto semplice, le raccolte tendono a essere passate in giro. Ben presto, 4 diverse classi hanno il loro metodo SearchByID() . Oppure ottieni valori di ritorno come Map<Integer, String> con il contesto di ciò che è memorizzato in quella mappa spogliato. Una collezione di prima classe è una soluzione semplice che costa un singolo file sorgente. In pratica, una volta che sono a posto (sono molto facili da scrivere anche per i test unitari), qualsiasi modifica riguardante la raccolta è facile da gestire, come quando SearchByID deve prendere un GUID invece di un int.

    
risposta data 12.03.2012 - 15:35
fonte
8

... use a separate class wrapping up the collection and with methods to add,delete modify data of that collection

Questo fa molto di più che garantire il tipo degli oggetti memorizzati nelle collezioni, ma garantisce anche qualsiasi invariante di collezione.

Gli alberi (rosso-nero, AVL ecc.) sono sensibili all'ordine e il loro comportamento dipende dal riequilibrio quando appropriato. Le prestazioni della tabella hash dipenderanno anche dal reinghing appropriato. Vuoi ricordare di controllare il fattore di carico ogni volta che inserisci una mappa di hash?

FWIW, il testo è abbastanza chiaro su questo (e modifico l'intera cosa nella tua domanda, quindi nessun altro ha bisogno di scaricare quel file RTF):

Each collection gets wrapped in its own class, so now behaviors related to the collection have a home

Niente a che vedere con i tipi (o quindi con i generici), tutto ciò che riguarda l'associazione del comportamento della raccolta con i suoi dati.

    
risposta data 12.03.2012 - 15:35
fonte
1

La risposta semplice è "No" se stai utilizzando un linguaggio che supporta Generics. Perché non c'è bisogno di controllare il tipo in quanto la funzione della lingua stessa fa un buon lavoro (dalla mia esperienza con i generici Java).

Tuttavia, se si dispone di una situazione in cui si desidera personalizzare la struttura dati fornita dalla lingua, è possibile creare una classe wrapper attorno alla struttura dati originale ed esporre le proprie API e utilizzare ancora l'implementazione sottostante della struttura dati originale.

    
risposta data 12.03.2012 - 15:23
fonte

Leggi altre domande sui tag