【问题标题】:Type-safe string parameters [duplicate]类型安全的字符串参数 [重复]
【发布时间】:2015-03-16 20:48:08
【问题描述】:

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

当前方法可能如下所示:

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);

另一方面,这似乎是针对常见问题的大量额外样板代码。

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

【问题讨论】:

  • 我认为您的思路是正确的——您通过将离散参数包装到一个集合对象中来有效地创建一个数据传输对象 (DTO)。如果它们都有一个共同的“属性”,即 id,您可能需要考虑创建一个基类,其中汽车/经销商/发票派生自该基类。 DTO 方法的优点是您可以维护接口规范,但它允许您有机会(有一定的注意事项)在以后需要时将元素添加到 DTO 中,而不会破坏现有接口。
  • 你需要一个强大的 typedef。
  • @BartekBanachewicz 是的,我不知道这个。使用该关键字,问题就会重复。
  • @Beginner 链接的问题中已经有答案,如果您同意它是重复的,那么我不需要在这里发布答案。

标签: c++ type-safety


【解决方案1】:

最佳实践实际上取决于您的软件、环境、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 类之间的类型兼容性。

在基类中你可以记录、处理、提供额外的方法等等。也可以在基类中实现运算符重载。

您的 ID 是必需的吗?我不知道。可能矫枉过正,也可能不会。但值得考虑这些选项。正如我之前所说,采用适合您的情况的简单方法(即使一些 typedef 可能就足够了,如果没有,结构会表现良好)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2021-10-13
    相关资源
    最近更新 更多