Ho una classe chiamata Product
, che prende un numero di modello di prodotto e il numero di ruote per quel prodotto come parte delle informazioni di creazione, e quindi crea un'istanza del prodotto eseguendo un calcolo sul numero di ruote e su varie parametri di base
Ad esempio, Product(5, 22)
crea un prodotto modello 5 con 22 ruote su di esso, dove il peso e le dimensioni di quel particolare prodotto sono calcolati dal numero di ruote e dalle specifiche di base per quel numero di modello . In questo momento le specifiche di base fanno parte della classe stessa e sono codificate nella classe, insieme alle formule di calcolo.
Il mio problema: nel codice (legacy) con cui sto lavorando, non posso sempre usare direttamente il numero del modello. Potrebbe non essere disponibile. Invece, viene dato un product_id
non correlato, in cui il collegamento tra product_id
e model_number
è nel database.
Voglio mantenere la mia classe il più semplice possibile. Pertanto non voglio introdurre un altro costruttore che consenta product_id
come parametro di input, oltre al model_number
esistente, in quanto sarà la duplicazione del codice. Inoltre, non sono troppo entusiasta di inserire la logica del database all'interno della classe, ma forse posso, a pensarci ora, questo può essere un buon candidato per una classe di database-wrapper, cioè un record attivo (dove le mie specifiche di base possono essere spostate fuori dal codice e nel database).
Domanda: Come creo e restituisco l'oggetto seguendo i buoni principi orientati agli oggetti quando il model_number
I in genere utilizzo per la sua creazione non è disponibile, ma un altro parametro è invece disponibile ( product_id
in questo caso), che collega 1: 1 a model_number
?
Esempi di soluzioni che non mi piacciono:
- Non coinvolgere il database - poiché al momento sto lavorando con pochi prodotti e i prodotti non cambiano spesso, posso creare una "funzione di conversione" che funge da mappa tra
product_id
emodel_number
e non toccare il database. Allo stesso modo, crea un oggettoConvert
con la stessa funzionalità e usalo prima di creare l'oggetto. Problema: duplicazione della funzionalità DB nel codice. - Inserisci la funzionalità DB nel codice e aggiungi un costruttore alternativo. Problema: più punti di entrata della creazione del prodotto per la classe creano la duplicazione del codice.
Aggiornamento:
Ci sono fondamentalmente 3 aspetti qui:
- dati di base (se codificati o parte del database)
- trovare i dati di base in base a vari parametri, ovvero il numero di modello o altre informazioni identificative
- facendo il calcolo usando i dati di base come per il numero di modello