Considerate questa funzione, che si può pensare come una tabella di verità:Come posso evitare uno stato booleano impossibile in C#?
public Foo doSomething(bool a, bool b) {
if (a && b) return doAB();
else if (a && !b) return doA();
else if (!a && b) return doB();
else if (!a && !b) return doNotANotB();
else throw new Exception("Well done, you defeated boolean logic!");
}
Il compilatore insiste su quell'ultimo else
clausola. Ma dal punto di vista di una tavola di verità, quello è uno stato impossibile.
Sì, funziona, e sì, posso conviverci. Ma mi chiedo se c'è qualche meccanismo in C# per evitare questo tipo di codice, o se mi sono perso qualcosa di ovvio?
UPDATE:
per i punti bonus, e per pura curiosità, ci sono tutte le lingue che si occupano di questo genere di cose in modo diverso? Forse non è un problema linguistico, ma piuttosto uno di un compilatore intelligente (ma i casi limite sarebbero inimmaginabilmente complicati, suppongo).
Sì, lì ho s tale meccanismo: basta semplicemente cancellare la condizione dell'ultimo 'if'. – dasblinkenlight
Molto vero! Pun intended. Ma se possibile vorrei che il codice fosse "leggibile" o "espressivo". Tieni presente che questo è un semplice esempio. E tra 7 mesi mi starò grattando la testa chiedendomi cosa stavo pensando quando l'ho scritto (quindi la preferenza per il codice espressivo). –
Se le azioni non sono correlate l'una con l'altra, non userei il pattern 'if/else if', ma preferisco andare su quattro separati blocchi' se'' dopo aver lanciato l'eccezione per soddisfare il compilatore. Nella maggior parte dei casi, tuttavia, esiste un'azione "predefinita" che si adatta perfettamente a un 'else' vuoto. –