Questo è legato alla mia domanda recente riguardante la denominazione di oggetti di dominio awkward. Un numero di risposte indicava che stavo usando la rappresentazione errata per gli oggetti del dominio. Per riassumere, ho scelto di utilizzare un enum per rappresentare alcuni oggetti di dominio utilizzati come chiavi nelle ricerche.
Per questa domanda, voglio rivedere la mia decisione di usare un enum e identificare alternative. Vai alla fine della mia domanda per il TL; DR.
Descrizione del dominio
La mia applicazione è responsabile dell'esecuzione di alcuni calcoli che riguardano composti chimici.
Alcune equazioni di base sono:
- calcolo del numero di moli di un composto
- calcolo del peso specifico o della densità di un composto a varie concentrazioni
Queste equazioni potrebbero essere gestite come metodi all'interno di una classe Chemical
come:
Chemical.GetMolesFromMass(double mass_grams)
o
Chemical.GetDensity(double concentration)
oppure potrebbero essere implementati come metodi fuori da una classe di proprietà chimiche generiche come:
Chemical.GetMolesFromMass(Compound cmpd, double mass_grams)
o
Chemical.GetDensity(Compound cmpd, double concentration)
Penso che dal punto di vista della responsabilità degli oggetti, la prima opzione di metodi fuori dalla classe Chemical
sarebbe una rappresentazione migliore.
Alcune equazioni avanzate riguardano:
- calcolo delle quantità di un composto consumato da un processo aziendale
- calcolo dei requisiti di memoria dei composti
- ottimizzazione delle consegne in base alle dimensioni standard dei contenitori
In queste equazioni, il composto chimico è un input per il metodo.
StorageTankCluster.Generate(Compound cmpd, double requiredVolume)
Il StorageTankCluster
deve conoscere la sostanza chimica perché le dimensioni e la spaziatura dei serbatoi all'interno del cluster cambieranno in base al volume chimico e richiesto. La sostanza chimica immagazzinata può influire sulla scelta del materiale del serbatoio e sull'impatto delle distanze di sicurezza tra i serbatoi.
Al momento, sto considerando quei parametri (spaziatura, materiale, ...) come elementi di ricerca invece di elementi di cui il composto è responsabile per la conoscenza.
Allo stesso modo, l'ottimizzazione della consegna è influenzata dal composto chimico, ma è discutibile sul fatto che tali aspetti siano o meno la responsabilità del composto.
Sia il StorageTankCluster
che i componenti di ottimizzazione della consegna sono destinati ad essere riutilizzati da altri aspetti non chimici dell'applicazione. Poiché questa domanda si sta già complicando, possiamo semplicemente chiamare quegli altri elementi Foo
e Bar
. Sia Foo
che Bar
potrebbero utilizzare l'ottimizzazione della pubblicazione, ma solo Foo
può essere utilizzato con StorageTankCluster
.
Non è nell'applicazione ora, ma tutte le varie proprietà discusse finora dovranno essere archiviate all'interno di un database / livello di persistenza. Mi rendo conto che non dovrebbe influire su un buon design, ma ho pensato che fosse degno di nota.
Ammetto che alcune delle mie decisioni sono state distorte perché sto trasferendo questa applicazione da un'altra fonte che forza tutto in modo strutturato. Scrivere questa domanda ha evidenziato alcune aree in cui avrei dovuto esaminare meglio quale oggetto aveva la responsabilità di tale funzionalità.
Il mio progetto finora è stato orientato intorno alle tabelle di ricerca e sto usando i valori enum come chiavi per quelle tabelle. È il loro uso come chiavi che mi induce a trattarli come oggetti con nome all'interno del programma invece di trattarli come oggetti su cui il sistema opererebbe. Questo ha praticamente relegato i composti chimici allo status di classe di secondo livello, e mi chiedo se sia stata la decisione giusta. D'altra parte, sono preoccupato per la classe dei composti chimici che diventa gonfia oltre l'utilità.
TL; DR
La mia implementazione è / deve essere in C #. Quindi usare un enum è la scelta giusta, o cosa avrei dovuto fare e perché?