使用字符串文字访问 std::map<std::string, int> 有什么缺点?
What are the downsides to accessing a std::map<std::string, int> using string literals?
我用 C++ 编写了一个包含 std::map<std::string, Resource>
的 ResourceManager class。然后我当前的代码使用字符串文字访问这些方法,例如:
// ResourceManager.h
class ResourceManager {
private:
std::map<std::string, Resource>
public:
void loadResource(std::string_view resourceName, std::string_view fileName);
const Resource& getResource(std::string_view resourceName) const;
}
// a.cpp
resourceManager.loadResource("background image", "background_image.png")
// b.cpp
resourceManager.getResource("background image")
这会成为问题吗?我应该用 constants.h
文件中定义的常量替换所有这些字符串文字吗?在这种情况下,我应该只使用 enum
作为地图的键吗?
与使用魔法常量的任何其他情况一样,它会导致代码脆弱,即,代码很可能会被破坏。特别是,考虑一下如果 "background image"
资源被加载一次并从多个不同位置检索时会发生什么,可能跨越许多源文件。如果资源在 loadResource
调用中被重命名,但您忘记更改其中一个 getResource
调用,程序将出现错误。使用枚举或使用命名常量可以避免此问题。
将枚举作为键的另一个好处是它非常高效:在查找值的过程中制作的任何键副本都很便宜。这与您当前的代码形成对比,您可能正在复制 resourceName
以执行查找(尽管使用透明比较器可以避免这种情况)。
我用 C++ 编写了一个包含 std::map<std::string, Resource>
的 ResourceManager class。然后我当前的代码使用字符串文字访问这些方法,例如:
// ResourceManager.h
class ResourceManager {
private:
std::map<std::string, Resource>
public:
void loadResource(std::string_view resourceName, std::string_view fileName);
const Resource& getResource(std::string_view resourceName) const;
}
// a.cpp
resourceManager.loadResource("background image", "background_image.png")
// b.cpp
resourceManager.getResource("background image")
这会成为问题吗?我应该用 constants.h
文件中定义的常量替换所有这些字符串文字吗?在这种情况下,我应该只使用 enum
作为地图的键吗?
与使用魔法常量的任何其他情况一样,它会导致代码脆弱,即,代码很可能会被破坏。特别是,考虑一下如果 "background image"
资源被加载一次并从多个不同位置检索时会发生什么,可能跨越许多源文件。如果资源在 loadResource
调用中被重命名,但您忘记更改其中一个 getResource
调用,程序将出现错误。使用枚举或使用命名常量可以避免此问题。
将枚举作为键的另一个好处是它非常高效:在查找值的过程中制作的任何键副本都很便宜。这与您当前的代码形成对比,您可能正在复制 resourceName
以执行查找(尽管使用透明比较器可以避免这种情况)。