Stavo leggendo questa domanda e pensavo che fossero stati fatti buoni punti, ma la maggior parte delle soluzioni prevedeva la ridenominazione di uno dei metodi. Sto refactoring un po 'di codice scritto male e ho incontrato questa situazione:
public class Entity {
public Entity(String uniqueIdentifier, boolean isSerialNumber) {
if (isSerialNumber) {
this.serialNumber = uniqueIdentifier;
//Lookup other data
} else {
this.primaryKey = uniqueIdentifier;
// Lookup other data with different query
}
}
}
L'evidente difetto di progettazione è che qualcuno aveva bisogno di due modi diversi per creare l'oggetto, ma non poteva sovraccaricare il costruttore poiché entrambi gli identificatori erano dello stesso tipo ( String
). Così hanno aggiunto una bandiera per differenziare.
Quindi, la mia domanda è questa: quando si presenta questa situazione, quali sono i buoni progetti per differenziare tra questi due modi di istanziare un oggetto?
I miei primi pensieri
- Potresti creare due diversi metodi statici per creare il tuo oggetto. I nomi dei metodi potrebbero essere diversi. Questo è debole perché i metodi statici non vengono ereditati.
- Potresti creare oggetti diversi per forzare i tipi a essere diversi (ad esempio, crea una classe
PrimaryKey
e una classeSerialNumber
). Mi piace perché sembra essere un design migliore, ma è anche un doloroso refactoring seserialNumber
è unString
ovunque.