Sono abbastanza nuovo per la progettazione OO e ho problemi con la progettazione di alcuni software e sto cercando un pattern o una combinazione di pattern che possa aiutarmi a risolvere il mio problema.
Ho un tipo con una collezione di diverse forme geometriche (ad esempio linee, rettangoli e cubi). In realtà ho persino compositi di queste forme. Ogni forma ha uno o più valori. Un valore è una coordinata (tra unidimensionale per le linee e tridimensionale per i cubi).
Tutti i tipi di forme hanno due metodi essenziali. Un metodo per aggiungere valori e un metodo per ottenere tutti i valori di una forma. Per esempio. Cube.AddValue(new Value3D{X=4,Y=7,Z=11})
o Line.AddValue(new Value1D{X=42})
rispettivamente Cube.GetValues()
restituirebbe un insieme di Value3D
e Line.GetValues()
restituirebbe un insieme di Value1D
.
Poiché questi metodi hanno firme fondamentalmente diverse, non posso derivare da una singola interfaccia per archiviare tutti questi diversi oggetti in una raccolta. Suddividere la raccolta in più raccolte separate, una per ogni tipo sarebbe possibile, ma non desiderabile poiché appartengono insieme (dominio saggio).
Ho preso in considerazione l'utilizzo di valori tridimensionali per tutte le forme e ho semplicemente ignorato Y / Z per linee / rettangoli, ma non è molto bello e violerebbe in realtà la O e la L in SOLID (è necessaria una quarta dimensione in futuro).
Un'altra possibilità sarebbe probabilmente quella di usare un'interfaccia generica come IShape<T>
dove T
è Valore * D. Questa interfaccia dovrebbe essere:
public interface IShape<T> {
public IEnumerable<T> GetValues();
public void AddValue(T value);
}
Ma ciò richiederebbe un altro, non generico interface INonGenericShape {}
perché non posso usare un'interfaccia generica senza specificare il tipo. Vorrei finire con qualcosa di simile:
public class SomeShape{
private IList<INonGenericShape> _shapes = new List<INonGenericShape>();
}
Ma allora potrei anche usare System.Object
, dato che IShape non fornisce alcuna informazione preziosa. Quindi eccomi qui, non sapendo come risolvere questo (archiviare gli oggetti in una singola raccolta per i consumatori di quella classe). Qualcuno può fornire qualche idea o intuizione?