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 EnumMapmap = 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.
Keine Kommentare:
Kommentar veröffentlichen