类型安全的字符串参数

时间:2015-03-16 12:14:23

标签: c++ type-safety

我的库以字符串的形式从消息总线获取信息。这些字符串是需要处理的不同类型实体的标识符。

Currenly方法可能如下所示:

void doWork(const std::string& carModelId,
            const std::string& dealershipId,
            const std::string& invoiceId);

float getPrice(const std::string& carModelId, 
               const std::string& dealershipId);

由于这些不同类型的ID遍布各处,我想确保将正确类型的id传递给方法,而不是使用普通字符串。

我目前的想法是创建一些包裹这些字符串的结构

struct carModel
{
     std::string id;
}

这样这些方法只接受正确类型的id

void doWork(const carModel& carModelId,
            const dealership& dealershipId,
            const invoice& invoiceId);

另一方面,对于一个常见问题,这似乎是很多额外的样板代码。

问题:获取字符串参数的类型安全性的最佳做法是什么?

1 个答案:

答案 0 :(得分:3)

最佳实践实际上取决于您的软件,环境,IDE,编译器等。你明白了。

在这个具体情况下,我认为

绝对没问题
struct SomeId {
    std::string id;
}

只要您在整个应用程序中保持一致的所有内容。您将获得主要优势,稍后您可以使用其他行为自定义这些结构(获取id的使用,在不同数据类型之间进行转换,获取用于调试目的的良好打印名称,跟踪在应用程序上使用的ID等等)。很好,因为发生的一切对你的班级用户都是透明的。

另外,这些类型的结构可以自动进行额外的验证(这个id是有效的吗?它已经可用吗?应该是)。你需要多少这些东西,如果它们实际上是可能的,取决于你的应用程序的逻辑。

你应该始终保持简单明了,在这种情况下,你实际上做的非常适合问题描述。不要过多地使事情复杂化。

然而,一句忠告:在这种情况下,远离显式转换运算符,因此。您应该阻止编译以下代码。

SomeId id = someOtherIdType;

你可以使用诸如operator()operator->之类的技巧来表示语法糖,但这就是我的目标。

要实现一次并在任何地方使用,你可以在基类中拥有所有内容,如此

struct BaseId
{
    std::string id;

    void Do() { }

    //add common behavior to all id classes
    //...
};

struct myId : private BaseId
{
    using BaseId::id;
};

私有继承允许派生类控制要公开的内容和不公开的内容,以及防止不同id类之间的类型兼容性。

在基类中,您可以记录,处理,提供其他方法等。实现运算符重载也可以在基类中完成。

您的身份证件是否需要?我不知道。可能有点矫枉过正,可能不会。但值得考虑这些选择。正如我早些时候所说的那样,采用在您的情况下运行良好的简单方法(即使不是,某些typedef可能就足够了,结构也会表现良好)。