Attualmente sto rifattorizzando un pezzo di codice per mantenere le cose testabili e mantenibili nella nostra applicazione c #.
Mi sono imbattuto in uno scenario in cui un metodo esistente restituisce dati con elenchi ed enumerati che vengono poi elaborati con molte altre condizioni if in un lungo metodo lungo più di 800+ righe. Fortunato me!
Stavo cercando di scegliere un modello di design adatto dalla Gang Of Four, ma non riesco a vedere qualcosa che si adatti. Illustrerò ciò che ho in atto al minuto. Qualche idea su come affrontare al meglio / refactoring il seguente?
Il seguente codice è stato semplificato da quello che ho in produzione. Il suo scopo è mostrare la logica di riduzione nello scenario. Questo è ciò che ho rifatto finora. Non preoccuparti della statica e non ci sono interfacce: le interfacce sono state omesse per semplicità.
public class MySearchClass
{
public static SearchResult Find(QueryParameters queryParams)
{
...
}
}
public class SearchEntityResult
{
public IEnumerable<SearchEntityData> Matches { get; set; }
}
public class SearchEntityData
{
public SearchMatchType MatchType { get; set; }
public Guid SearchEntityId { get; set; }
public string EntityName { get; set; }
}
public enum SearchMatchType
{
Partial,
Exact
}
public class BigLongMethodClassProcessor
{
public static void DoFindAndProcess()
{
... spaghetti code ...
SearchEntityResult result = MySearchClass.Find(...);
if (result.BestMatch == SearchMatchType.Exact)
{
...
}
else
{
foreach (var m in result.Matches)
{
if (m.MatchType == SearchMatchType.Partial)
{
... do this ...
}
else if (m.MatchType == SearchMatchType.Exact)
{
... do that ...
}
}
}
...
}
}
Il mio pensiero era di avere una fabbrica che avrebbe esaminato SearchEntityResult e creato un SearchEntityResultProcessor appropriato.
public class ExactSearchEntityResultProcessor : ISearchEntityResultProcessor
{
public void Process(SearchEntityResult result)
{
...
}
}
public class SearchEntityResultProcessorFactory
{
public static ISearchEntityResultProcessor Create(SearchEntityResult result)
{
if (result.BestMatch == SearchMatchType.Exact)
{
return new ExactSearchEntityResultProcessor();
}
else if (result.BestMatch == SearchMatchType.Partial)
{
return new PartialSearchEntityResultProcessor();
}
else
{
// throw
}
}
}
Quindi BigLongMethodClassProcessor avrà il seguente aspetto:
public class BigLongMethodClassProcessor
{
public static void DoFindAndProcess()
{
SearchEntityResult result = MySearchClass.Find(...);
ISearchEntityResultProcessor processor = SearchEntityResultProcessorFactory.Create(result);
processor.Process(result);
}
}
Quindi tutte le statistiche verranno rimosse e introdotte le interfacce.