c++ - 寻求帮助将 SOLID 原则应用于文件 I/O 问题

标签 c++ c++11 solid-principles

我正在努力学习更多关于设计模式和原则的知识。我通常在理论上理解它们,但我发现自己在将它们应用到现实世界的问题时遇到了困难。要提供所有相关背景,这将是一个较长的问题,我非常感谢任何有关如何正确构建此问题的建议。

目前,我正尝试在现代 C++ 中为一种称为 TextGrid(从我没有编写的不同软件导出)的特定类型的结构化文件实现文件管理器(读取和写入)。这个文件可以有三种不同的“风格”(它们都存储相同的信息,只是使用不同的格式):

  • 短文本文件
  • 长文本文件
  • 二进制文件

所有口味都具有相同的扩展名。用户通常不知道他们正在处理哪个文件,您必须阅读文件的开头才能区分。

现在我明白了,通常将代表存储在文件中的结构化数据的类 TextGrid 与 I/O 分开是有意义的。所以会有一个类 TextGrid 和一个(静态)类 TextGridManager

这就是我迷路的地方。我应该在他们自己的类(class)中实现阅读和写作吗?我是否应该实现一个抽象类 BaseTextGridManager 然后派生专门的类(我认为这将是开闭原则所推荐的)?但如果是这样,用户怎么知道要实例化哪个专用类,因为在知道如何解析文件之前必须读取文件的前几个字节?

我当然可以找到一种方法让它以某种方式工作,但我正在寻找有关如何优雅地完成它并遵循 SOLID 原则的建议。任何见解将不胜感激。

更新:

感谢这个问题下面的评论,我目前的计划是按以下方式组织它:

class TextGrid:
{
  // The representation of the TextGrid data
}

class TextGridManager:
{
public:
   static TextGrid readTextGridFile(const std::string& filename);
   static bool writeTextGridFile(const TextGrid& tg, const std::string& filename, const std::string& format);

private:
   TextGridManager(){};
   static TextGrid BinaryTextGridFactory(std::istream& file);
   static TextGrid ShortTextGridFactory(std::istream& file);
   static TextGrid LongTextGridFactory(std::istream& file);
}

我欢迎任何建设性的批评和反馈。

最佳答案

对于新的格式,您将添加新的编写器并让工厂知道。我不是 C++ 专家,但这并不重要。语法是 C# 的语法,省略了访问修饰符。

interface ITextGridReader {
    TextGrid read(filename);
}

class TextGridReader: ITextGridReader {
    // impl read(...);
}

interface ITextGridWriter {
    bool write(filename, textGrid);
}

class BinaryTextGridWriter: ITextGridWriter {
    // imp write(...);
}

class LongTextGridWriter: ITextGridWriter {
    // imp write(...);
}

// Calling code
ITextGridReader reader = new TextGridReader();
TextGrid textGrid = reader.read(...);
ITextGridWriter writer = Factory.CreateTextGridWriter(format);
writer.write(...);

关于c++ - 寻求帮助将 SOLID 原则应用于文件 I/O 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62937362/

相关文章:

c++ - 如何在 C++ 中使用运算符 ^

c++ - 使用 C++11 无限制 union 时的 VS 2013 异常

c++ - 如何在 c++ 中没有数组/算法的情况下在两个条件下对字符串进行排序?

java - 用于模拟变化很大的假模型的良好单元测试实践是什么?

c++ - Qt QByteArray 大小

c++ - 与 Arduino 的串行通信仅在重启后的第一条消息上失败

java - 使用抽象子类设置 super 属性

unit-testing - 单一职责/单元可测试性和实用性的平衡

c++ - 实例化函数模板的编译问题

c++ - constexpr 与匿名命名空间