void ProcessSomething(Color color) {
FlowerType flowerType;
if (color == Color.Red) {
flowerType = Red_Rose;
} else if (color == Color.Blue) {
flowerType = Blue_Rose;
} else if (color == Color.Grey) {
flowerType = Grey_Rose;
} else if (color == Color.Yellow) {
flowerType = Yellow_Rose;
}
// Do something
}
Obviously this is a bad style and leads to inflexible code, but what is the alternative? You could use a switch statement, but this wouldn't lead to a more elegant code.
If you have some kind of mapping for example between Enums, you can do the following:
// Java
public static enum Color {
Red, Blue, Grey, Yellow;
private static EnumMap map = new EnumMap(Color.class);
static {
map.put(Color.Red, FlowerType.Red_Rose);
map.put(Color.Blue, FlowerType.Blue_Rose);
map.put(Color.Grey, FlowerType.Grey_Rose);
map.put(Color.Yellow, FlowerType.Yellow_Rose);
}
public static FlowerType getCorrespondigValue(Color value) {
return map.get(value);
}
}
// Apparently there is a bug with the syntaxhighlighter
// In line 5 the correct version is "FlowerType"
// And it adds in the end, probably it has a problem with "<"
In the case of Enums we can use an EnumMap and use a static block to map the corresponding types. As a result we have a neverchanging and flexible static getCorrespondigValue method, which returns reliably the FlowerType. If you don't use Enums you can use instead of EnumMap a HashMap.
Here is an extract from my Pokemon game in C++ Unreal Engine:
// C++ static TMapMapNameEItemEnum; UENUM(BlueprintType) enum class EItemEnum : uint8 { Potion UMETA(DisplayName = "Potion"), Pokeball UMETA(DisplayName = "Pokeball"), Superball UMETA(DisplayName = "Superball"), None UMETA(DisplayName = "None") }; static void init() { MapNameEItemEnum.Add(FString(TEXT("Potion")), EItemEnum::Potion); MapNameEItemEnum.Add(FString(TEXT("Pokeball")), EItemEnum::Pokeball); MapNameEItemEnum.Add(FString(TEXT("Superball")), EItemEnum::Superball); MapNameEItemEnum.Add(FString(TEXT("None")), EItemEnum::None); } EItemEnum GetCorrespondingStringAsEItemEnum(const FString Str) { EItemEnum* Item = MapNameEItemEnum.Find(Str); if (Item) return *Item; else return EItemEnum::None; } // Again a bug with the syntaxhighlighter in line 2 // "FString, EItemEnum" is the correct version
Of course you can use the same concept in normal C++, if you don't work with Unreal Engine. Note that there are no simple static blocks in C++ like in Java.