Sto refactoring una base di codice legacy.
Ho 4 oggetti molto simili che ho deciso di essere un buon bersaglio per diventare polimorfico, quindi ho spostato tutto il codice comune in una classe base e ho aggiunto un'interfaccia.
Il vero problema sorge quando provi a creare quegli oggetti. Ogni classe ha 3 diversi costruttori con 5-10 parametri ciascuno, usati in diversi casi in base al contesto.
So già che quelle classi hanno troppe cose in corso, e in realtà sarebbe meglio dividere in classi diverse, più piccole, ognuna delle quali si occupa di un caso, tuttavia si tratta di una base di codice legacy e non posso apportare molte modifiche al codice esistente.
Al momento il mio codice è qualcosa del tipo:
public class HandlerFactory
{
public static IHandler CreateInstance(HandlerType param1, string param2, ..., string param8)
{
switch(param1)
{
case HandlerType.Type1
return new Handler1(param2, ..., param8)
case HandlerType.Type2
return new Handler2(param2, ..., param8)
case HandlerType.Type3
return new Handler3(param2, ..., param8)
case HandlerType.Type4
return new Handler4(param2, ..., param8)
}
}
public static IHandler CreateInstance(HandlerType param1, int param2, ..., DateTime param10)
{
switch(param1)
{
case HandlerType.Type1
return new Handler1(param2, ..., param10)
case HandlerType.Type2
return new Handler2(param2, ..., param10)
case HandlerType.Type3
return new Handler3(param2, ..., param10)
case HandlerType.Type4
return new Handler4(param2, ..., param10)
}
}
public static IHandler CreateInstance(HandlerType param1, string param2, ..., CustomClass param5)
{
switch(param1)
{
case HandlerType.Type1
return new Handler1(param2, ..., param5)
case HandlerType.Type2
return new Handler2(param2, ..., param5)
case HandlerType.Type3
return new Handler3(param2, ..., param5)
case HandlerType.Type4
return new Handler4(param2, ..., param5)
}
}
}
Tuttavia, odio avere 3 metodi di fabbrica, poiché ora devo modificarne tre se dovessi aggiungere un altro Handler (il motivo principale per cui sto facendo questo refactoring).
C'è un modo per mantenere un solo metodo factory con un singolo switch?