Ho una domanda riguardante le specifiche della creazione dell'oggetto e l'uso delle proprietà. Una buona pratica consiste nel mettere tutte le proprietà in uno stato tale che l'oggetto sia utile quando è stato creato. I costruttori di oggetti aiutano a garantire che vengano create le dipendenze richieste.
Mi sono ritrovato a seguire un modello ultimamente e poi a mettere in dubbio la sua adeguatezza.
Il modello appare così ...
public class ThingProcesser
{
public List<Thing> CalculatedThings { get; set; }
public ThingProcesser()
{
CalculatedThings = new List<Thing>();
}
public double FindCertainThing()
{
CheckForException();
foreach (var thing in CalculatedThings)
{
//do some stuff with things...
}
}
public double FindOtherThing()
{
CheckForException();
foreach (var thing in CalculatedThings)
{
//do some stuff with things...
}
}
private void CheckForException()
{
if (CalculatedThings.Count < 2) throw new InvalidOperationException("Calculated things must have more than 2 items");
}
}
L'elenco degli elementi non è stato modificato, ma è stato controllato dai metodi. Esistono diversi metodi sulla classe e per evitare di dover passare l'elenco di cose a ciascuna funzione come parametro del metodo, l'ho impostato una volta sulla classe. Mentre funziona, viola il principio del minimo stupore?
Da quando ho iniziato a utilizzare IoC, mi ritrovo a non attaccare le cose nel costruttore, per evitare di dover usare un modello di fabbrica. Ad esempio, posso discutere con me stesso e dire che il ThingProcessor ha davvero bisogno di un elenco per funzionare, quindi l'oggetto dovrebbe essere costruito in questo modo.
public class ThingProcesser
{
public List<Thing> CalculatedThings { get; set; }
public ThingProcesser(List<Thing> calculatedThings)
{
CalculatedThings = calculatedThings;
}
}
Tuttavia, se lo facessi, complicherebbe le cose per IoC, e questo scenario sembra appena appropriato per qualcosa come il modello di fabbrica.
Quindi, in sintesi, ci sono delle buone linee guida per quando qualcosa dovrebbe essere parte dello stato dell'oggetto, o passato come parametro del metodo? Quando si utilizza IoC, il modello di fabbrica è il modo migliore per gestire gli oggetti che devono essere creati con stato? Se qualcosa deve essere passato a più metodi in una classe, lo rende un buon candidato come parte dello stato degli oggetti?