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.