Ho una classe che modella LogicalExpressions. Le foglie sono classi che implementano un'interfaccia IEvaluable, che ha un metodo chiamato Evaluate che restituisce un booleano come risultato.
public class MyEvaluable : IEvaluable
{
public bool Evaluate(Environment env)
{
}
}
Alcuni di questi oggetti valutabili devono fare alcune cose pesanti per produrre il risultato, come ad esempio chiamare un servizio web. E poiché un'espressione logica può avere più oggetti correlati, vorrei valutarli tutti in una volta, facendo una chiamata al servizio web per tutti loro invece di chiamate separate per ogni parametro.
Quindi ho pensato a un buon modo di progettare un sistema del genere e ho trovato 2 soluzioni:
1) Rende mutevoli i miei oggetti valutabili.
public interface IBatchEvaluable
{
void BatchEvaluate(object[] siblings, Common.Environment env);
bool IsEvaluated { get; }
bool EvaluationResult { get; }
}
public interface IBatchEvaluable<T> : IBatchEvaluable
{
void BatchEvaluate<T>(T[] siblings, Common.Environment env);
}
Quindi ogni oggetto che è IBatchEvaluable avrà uno stato. Quando ho bisogno di valutarlo, controllo se è già stato valutato e, se necessario, esegue la valutazione del lotto. L'unico neo è che i miei oggetti saranno mutabili, e questo non è davvero desiderabile.
2) Memorizza i dati di valutazione nell'ambiente
Potrei mantenere gli oggetti immutabili e spostare i dati IsEvaluated e EvaluationResult nell'ambiente. Quindi ogni oggetto dovrebbe prima cercare nell'ambiente per vedere se è già stato valutato e in tal caso ottenere il risultato dall'ambiente, altrimenti valutare tutti i fratelli in una volta sola e inserire i dati nell'ambiente.
Anche questo non è molto interessante, dal momento che l'implementazione dei miei oggetti dipenderà da dati esterni, non sembra rispettare i principi OOP.
Come dovrei fare questo da una prospettiva OOP? Sono aperto ad ascoltare altre potenziali soluzioni a questo.