Sto scrivendo del codice con una semplice istruzione switch basata su valori Enum. Mi è venuto in mente che a un certo punto in futuro uno sviluppatore potrebbe aggiungere un nuovo valore, quindi ho incluso un metodo predefinito per catturarlo in fase di esecuzione e generare un'eccezione. Tuttavia mi sono reso conto che dovevo farlo ogni volta che inserivo una logica come questa, e che vedevo solo questi problemi in fase di esecuzione piuttosto che compilare il tempo.
Mi chiedo se è possibile aggiungere del codice per far sì che il compilatore comunichi allo sviluppatore che è necessario aggiornare determinati metodi nel caso in cui aggiornino i valori dell'enumerazione - oltre alla semplice aggiunta di commenti all'enum stesso?C# Garantire valori Validi Enum - Metodo a prova di futuro
ad es. (l'esempio sotto è puramente teorico: ho scelto gli stati dal ciclo di vita dello sviluppo per assicurarmi che sia qualcosa di familiare per la maggior parte).
public enum DevelopmentStatusEnum
{
Development
//, QA //this may be added at some point in the future (or any other status could be)
, SIT
, UAT
, Production
}
public class Example
{
public void ExampleMethod(DevelopmentStatusEnum status)
{
switch (status)
{
case DevelopmentStatusEnum.Development: DoSomething(); break;
case DevelopmentStatusEnum.SIT: DoSomething(); break;
case DevelopmentStatusEnum.UAT: DoSomething(); break;
case DevelopmentStatusEnum.Production: DoSomething(); break;
default: throw new StupidProgrammerException(); //I'd like the compiler to ensure that this line never runs, even if a programmer edits the values available to the enum, alerting the program to add a new case statement for the new enum value
}
}
public void DoSomething() { }
}
public class StupidProgrammerException: InvalidOperationException { }
Questo è un po 'accademico, ma posso vederlo utile per rendere robusta la mia app. Qualcuno l'ha già provato prima/ha qualche buona idea su come questo potrebbe essere raggiunto?
Grazie in anticipo,
JB
Lo faccio nello stesso modo in cui lo fai tu. –
Ogni volta che ti ritrovi a scrivere un'istruzione switch, dovresti prendere in considerazione il refactoring del codice nell'uso del polymorphism. [Vedi questo estratto] (http://sourcemaking.com/refactoring/replace-conditional-with-polymorphism) del libro di Martin Fowler [Refactoring] (http://martinfowler.com/books/refactoring.html). Ciò renderà il tuo codice aderente al principio Open-Closed (OCP) e aiuterà il prossimo sviluppatore ad evitare di mancare di cambiare un'istruzione switch da qualche parte. :-) –