In questo momento sto lavorando con un codice che combina stato e operazioni.
Sembra qualcosa del genere (nota: in realtà non si occupa di Cars / Trucks, sto astragendo la logica del business qui, e mi scuso in anticipo che l'analogia non ha assolutamente senso)
TruckImpl {
// Fields/Properties
int Mileage
bool MissionAccomplished
// ... and many, many more
// Constructor
TruckImpl TruckImpl(IRentalAgreement agreement)
// methods
void Drive() {
// Sets a whole bunch of fields/properties which are subsequently used to make decisions in Park()
GetCarFromDealer()
Haul()
}
void GetCarFromDealer()
void Haul()
// Return to rental company if done, otherwise park at home
void Park()
}
CarImpl {
// Fields
int Mileage
bool MissionAccomplished
// Constructor
CarImpl CarImpl(IRentalAgreement agreement)
// methods
// Sets a whole bunch of fields/properties which are subsequently used to make decisions in Park()
void Drive() {
// Sets a whole bunch of fields/properties which are subsequently used to make decisions in Park()
GetCarFromDealer()
Race()
}
void GetCarFromDealer()
void Race()
// Return to rental company if done, otherwise park at home
void Park()
}
È usato in un codice che assomiglia al seguente pseudocodice:
RentalVehicleHandler {
IVehicleImplFactory factory;
Handle(IRentalAgreement agreement) {
impl = factory.Create(agreement)
impl.Drive()
impl.Park()
}
}
Main() {
while(true) {
var agreements = GetAgreements();
foreach(var agreement in agreements) {
handler.Handle(agreement)
}
}
Nel codice sopra riportato, riceviamo batch di "Affitti in affitto", ma continuiamo a elaborarli singolarmente. Ora, voglio gestire Auto e Camion leggermente separatamente. Per i camion, guiderò ancora () poi parcheggia () singolarmente. Per le automobili, voglio GetCarFromDealer () individualmente, ma poi Race () l'intero lotto di macchine in una volta prima di parcheggiarle. Potrei voler fare qualcosa di simile per Trucks in futuro, ma forse no.
Ho pensato che sarebbe stato utile separare il mio stato dalla mia implementazione come di seguito: (per iniziare, non sono state ancora aggiunte informazioni relative al batch):
// One per rental agreement
RentalVehicle {
#Properties
RentalAgreement agreement
int Mileage
bool MissionAccomplished
//(...all of the TruckImpl propertiies?)
}
// Can handle any number of RentalAgreements, maybe multiple
CarDriver {
RentalVehicle Drive(RentalVehicle vehicle)
RentalVehicle Park(RentalVehicle vehicle)
}
TruckDriver {
RentalVehicle Drive(RentalVehicle vehicle)
RentalVehicle Park(RentalVehicle vehicle)
}
È una cosa utile / ragionevole da fare? O è solo un mucchio di lavoro extra che non mi procurerà alcun vantaggio? Penso che mi aiuterà sia con il problema a portata di mano che mi aiuterà con ulteriori refactoring, ma ho anche provato un paio di altre cose che sono dei vicoli ciechi e non voglio passare un po 'di tempo a refactoring di questo ragione.