vostre condizioni non sono estremamente ben definiti, ma suona come una mappa degli Stati di azioni, in cui uno stato è definito da una serie di condizioni semplici, e ogni stato ha solo un'azione. Quindi, perché non rappresentarlo in questo modo?
Ecco un semplice esempio LINQPad:
void Main()
{
Dictionary<Cond, Action> d = new Dictionary<Cond, Action>()
{
{ new Cond(waterproof:true, shockproof:true, freezeproof:false), delegate() { "Action1".Dump(); } },
{ new Cond(waterproof:false, shockproof:true, freezeproof:true), delegate() { "Action2".Dump(); } },
{ new Cond(waterproof:true, shockproof:true, freezeproof:true), delegate() { "Action3".Dump(); } }
};
d[new Cond(true, true, false)]();
d[new Cond(false, true, true)]();
d[new Cond(true, true, true)]();
}
public class Cond : Tuple<bool, bool, bool>
{
public Cond(bool waterproof, bool shockproof, bool freezeproof) : base(waterproof, shockproof, freezeproof)
{
}
}
uscita:
Action1
Action2
Action3
La sottoclasse di Tuple<>
perché:
Si rende tutto molto più leggibile piuttosto che avere il argomenti generici ovunque
È possibile utilizzare i parametri denominati come ho fatto per rendere molto chiara la logica della mappa.
È possibile scambiarlo con una classe personalizzata se è necessaria una logica più complessa, ad esempio un numero variabile di condizioni in ciascuno stato.
Si avrà probabilmente bisogno di ignorare Equals
e GetHashCode
in quel caso.
(È, ovviamente, non è necessario utilizzare i delegati anonimi, si può semplicemente passare un riferimento diretto al metodo che si desidera utilizzare)
Quindi vuoi una struttura logica, che, quando la esegui, segui le tue spiegazioni? Modelli – Mafii
? Gli schemi di progettazione non sono accoppiamenti condizionali;) – Tushar
crea un metodo statico che accetta quelle bool vars e restituisce l'azione corretta ... – Nino