隔离解析代码的设计模式?

Design pattern for isolating parsing code?

我有 C++ class Foo:

class Foo
{
public:
    [constructor, methods]

private:
    [methods, data members]
};

我想在 class Foo 中添加通过从文本文件中读取数据来构造它的可能性。读取此类数据的代码非常复杂,除了需要一个新的构造函数外,还需要几个新的私有方法和数据成员:

class Foo
{
public:
    [constructor, methods]

    Foo(const std::string& filePath); // new constructor - constructs a Foo from a text file

private:
    [methods, data members]

    [several methods used for text file parsing] // new methods
    [several data members used for text file parsing] // new data members
};

这可行,但我觉得将新的解析代码和数据成员隔离到它们自己的实体中会更好。

为了实现这个目标,什么是合适的设计模式?

这纯粹是一篇评论文章,所以我很惊讶它还没有结束。话虽这么说...对我来说,这取决于您输入文件的格式。

在我的公司,我们使用 JSON 表示来表示无穷无尽的事物。我们存储 JSON 个文件。我们在 REST 调用中传递 JSON。这很常见。我有一个名为 JSON_Serializable 的虚拟基础 class,它带有 toJSONfromJSON 方法,所有要执行此操作的 classes 都会实现这些。

我认为这 100% 合理。 class 能够序列化自身并没有错。

您控制输入文件的格式吗?这是一种你会经常使用的格式吗?如果是这样,那么使 class 足够智能以从字符串序列化就没有错了。

我写了一个 http 服务器,它涉及解析请求和对服务器客户端识别的内容的响应。两者都适合构建器模式(https://refactoring.guru/design-patterns/builder)

这是请求生成器的 http 示例 https://bitbucket.org/ptroen/crossplatformnetwork/src/master/OSI/Session/HTTP/HTTP_Request_Builder.h 他们也是同一文件夹中的响应生成器

用例类似于从 txt 文件流构建内容或向 txt 文件流构建内容。但是取决于数据的嵌套可能会更复杂所以最好先写需求

我认为这是使用 so-called Method Object 模式的好机会。您可以在各种网站上阅读有关该模式的信息。不过,我发现最好的描述是在 Kent Beck 的书 Implementation Patterns.

的第 8 章中

从这个模式将应用于构造函数而不是常规方法的意义上来说,您的用例是不寻常的,但这是次要的。