Ho avuto un ciclo attraverso l'oggetto Process , ciascuna istanza process può essere di un tipo diverso, derivata da Process classe base (ad esempio Process1 , Process2 , ...). Ogni tipo derivato di Process ha proprietà diverse. Ad esempio: alcuni Process es sono indicizzabili, questo è segnalato da IsIndexable flag. Quando un Process è indicizzabile ha alcune proprietà aggiuntive (ad esempio: AccessDate ) che il processo non indicizzabile non ha.
Ora devo fare un ciclo su ogni processo in request.Process (ricorda che il% indicizzabileProcess es sono diversi dagli altri)
foreach (Process process in request.Processes)
{
if(process.getType().Name.Equals("Process1")) // indexable process
{
((Process1)process).Name = "aName";
((Process1)process).AccessDate = DateTime.Now;
}
else if(process.getType().Name.Equals("Process2")) // non indexable process
{
((Process2)process).Name = "anotherNane";
//compile error - AccessDate don't exist for type Process2
//((Process2)process).AccessDate = DateTime.Now;
}
}
Poiché odio quella cascata se ho riscritto usando l'interfaccia:
IProcessable processableImpl = // some Unity stuff based on request type
foreach (Process process in request.Processes)
{
processableImpl.fillTheRightProperties(process);
}
processableImpl è iniettato in un modo diverso basato su request.Type . A questo punto il metodo fillTherRightProperties farà il lavoro per me sull'attuale process .
public interface IProcessable
{
void fillTheRightProperties(Process process);
}
public class IndexableProcess : IProcessable
{
void fillTheRightProperties(Process process){
Process1 process1 = process as Process1;
if(process1==null) throw MyException("Process1 expected");
process1.Name = "aName";
process1.AccessDate = DateTime.Now;
}
}
public class NonIndexableProcess : IProcessable
{
void fillTheRightProperties(Process process){
Process2 process2 = process as Process2;
if(process2==null) throw MyException("Process2 expected");
process2.Name = "aName";
}
}
Questo è più bello di un if a cascata, ma non mi sento ancora così bello come potrebbe essere. Sento una violazione della responsabilità, poiché la classe concreta modifica process proprietà altrove, e ho paura di leggere questo codice una settimana dopo.