Alternative zu verschachteltem switch



  • Ich habe eine Methode, die zwei Parameter nimmt und anhand dieser ein Objekt zurueckliefert

    das sieht derzeit in etwa so aus:

    MyObject* buildObject( MyEnum value, eStatus status )
    {
        // in value steht der Wert, der nachher "erscheinen" muss und status, wie dieser dagestellt werden muss
    
        switch( value )
        {
        case v1:
            switch( status )
            {
            case s1:
                return new MyObject( "Wert", 0 );
            case s2:
                return new MyObject( 0, "Wert" );
            case s3:
                return new MyObject( "Wert", "Wert" );
            }
            break;
        case v2:
            // siehe v1, nur anderer "Wert"
            break;
        // usw
        default:
            return NULL;
        }
    }
    

    das ist natuerlich alles andere als praktisch, wartbar und schoen, aber wie macht man es "besser"?



  • Naja einfach wäre ein nicht verschachtelter switch.

    MyObject* buildObject( MyEnum value, eStatus status )
    {
        // in value steht der Wert, der nachher "erscheinen" muss und status, wie dieser dagestellt werden muss
    
          std::string wert;
    
          switch (value)
          {
          case v1:
             wert = "Wert";
             break;
          case v2:
             wert = "andererWert";
             break;
          }
    
          switch( status )
          {
          case s1:
             return new MyObject( wert, 0 );
          case s2:
             return new MyObject( 0, wert );
          case s3:
             return new MyObject( wert, wert );
          }
    }
    


  • Oder eine std::map. Initialisiert mit den entsprechenden Werten und in der Funktion dann eine simple Abfrage eben jener. Gerade wenn die Werte bekannt sind läßt sich das leicht realisieren.



  • Wobei bei einfachen Enum-Variablen, die linear von Null an durchnummeriert sind, auch ein Array (oder ein Container wie std::tr1::array ) reicht - und sogar noch schneller als eine std::map ist.


Anmelden zum Antworten