c++ - 寻求帮助将 SOLID 原则应用于文件 I/O 问题
问题描述
我正在尝试更多地了解设计模式和原则。我通常在理论上理解它们,但在将它们应用于现实世界的问题时,我发现自己很难。这将是一个更长的问题,要给出所有相关的上下文,我非常感谢任何关于如何正确构建它的建议。
目前,我正在尝试在现代 C++ 中为称为 TextGrid 的特定类型的结构化文件(从我没有编写的不同软件导出)实现文件管理器(读取和写入)。这个文件可以有三种不同的“风格”(它们都存储相同的信息,只是使用不同的格式):
- 短文本文件
- 长文本文件
- 二进制文件
所有口味都有相同的扩展名。用户通常不知道他们正在处理哪个文件,您必须阅读文件的开头才能分辨出区别。
现在我明白了将表示存储在文件中的结构化数据的类 TextGrid 从 I/O 中分离出来通常是有意义的。所以会有一个类TextGrid
和一个(静态)类TextGridManager
。
这就是我迷路的地方。我应该在自己的课程中实现阅读和写作吗?我是否应该实现一个抽象类 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(...);
推荐阅读
- kubernetes-helm - 根入口与路径入口冲突
- flask - 不同版本端点部署的 ApiKey 安全性
- android - 非系统应用之间可以使用 sendOrderedBroadcast 吗?
- c - gdb - 打印宏名称而不是值
- java - JProgressBar 内的 Java swing 不透明 JProgressBar
- docker - TeamCity - docker-compose - 无法映射 URL
- html - 如何在自定义样式的 html 范围输入上具有透明背景?
- r - 使用前导值的操作填充 NA
- python - 我无法使用 Python 和 Facebook Marketing API 获取所有 Facebook 活动的统计信息
- git - 合并到特定分支后如何创建对 master 的合并请求