Come modellare gli oggetti tabella e colonna e la loro relazione

1

Sto lavorando su una piccola applicazione in cui ho bisogno di modellare tabelle e colonne da un DB relazionale.

Ho letto materiale su classi annidate, che si raccomanda di usare scarsamente. Comunque sto pensando che questo potrebbe essere uno scenario del genere.

Desidero implementare questi oggetti come segue:
 1. Table contiene List<Column>
 2. Preferibilmente non è possibile creare un oggetto Column a meno che non si utilizzi un metodo sull'oggetto Tabella (ad esempio Table.addColumn() ).
 3. Le colonne esistenti dovrebbero essere disponibili al di fuori dell'oggetto Table in modo tale che sia possibile fare riferimento alla colonna e ai suoi metodi e proprietà pubblici da qualsiasi punto del codice.
 4. Column deve conoscere l'oggetto Table a cui appartiene.
 5. Sia Column che Table implementa IEquatable e forse IEnumerable.

Le opzioni che vedo sono:
 1. Utilizza classi nidificate in cui Column è racchiuso in Table , proteggendo il costruttore di Column dall'essere richiamato da un codice esterno.
 2. Implementa Column e Table come classi regolari, inserendo l'oggetto Table nel costruttore di Column . Questo può essere gestito da un metodo nell'oggetto Table che si prende cura dell'iniezione e restituisce l'oggetto Column risultante. Ciò tuttavia, esporre il costruttore di Column al resto dell'implementazione.
 3. Creare una DLL separata combinata con il modificatore di accesso interno per proteggere il costruttore di Column .

Che cosa diresti sia la soluzione migliore qui?

Saluti

    
posta Anders 20.07.2015 - 21:09
fonte

1 risposta

2

Vorrei iniziare fornendo l'API corretta per aggiungere colonne alla tabella. Se tableObject.addColumn (...) è appropriato, crealo.

Non è necessario consentire l'aggiunta di oggetti di colonna arbitrari alle tabelle: è possibile controllare ogni aspetto della creazione di un oggetto Column appropriato tramite le implementazioni del metodo di istanza AddColumn di Table. Questi metodi possono prendere i parametri di creazione delle colonne e creare e collegare la colonna stessa.

Pertanto, non mi preoccuperei di impedire alle persone di creare un oggetto Column. Se qualcuno ne crea uno in modo indipendente, non sarà in grado di usarlo per qualsiasi cosa relativa alla Tabella, quindi è innocuo. Ci sono molti oggetti arbitrari che le persone possono creare (una serie di int, ...) che sono così innocui per il tuo codice, non ha senso impedire che provino a farlo.

D'altra parte, è possibile creare una classe Column astratta (o un'interfaccia) e quindi una sottoclasse che (ad esempio come TableColumn) e annidarla all'interno di Table. In questo modo si separano le persone dell'API Colonna che dovranno vedere quando si enumerano le colonne, senza fornire un costruttore specifico. La classe nidificata TableColumn può avere collegamenti e costruttori privati di cui ha bisogno.

Non puoi necessariamente impedire a qualcuno di sottoclasse la Colonna astratta da solo e di fornire un costruttore per creare istanze, ma quindi, è innocuo per la tua Tabella.

    
risposta data 21.07.2015 - 01:29
fonte

Leggi altre domande sui tag