面向对象或模块化文件和数据I/O的技术?

10
每次我写涉及获取、推送、读取或写入操作的代码时,整个代码都是临时的、丑陋的,并且完全无法在该应用程序之外使用。更糟糕的是,感觉每次设计这些东西都要重新发明轮子。在我看来,I/O 操作的性质非常线性,不适合模块化或面向对象的模式。
我真的希望有人能告诉我我错了。是否有面向对象或模块化文件和数据 I/O 的技术/模式?是否有一些约定可以遵循以添加一些代码可重用性?我知道存在各种工具使读取单个文件更容易,例如 XML 解析器等,但我指的是使用这些工具的更大设计。
问题不限于一种语言;我在 Java、C、Matlab、Python 等中都遇到了同样的问题。
这是一个关于何时保存对象的问题,它涉及到编程和文件操作。该问题似乎涉及到工厂模式,其中文件的内容被构建,最终写入磁盘。我的问题是关于整体架构,包括用于写操作的工厂,以及用于读取/获取操作的(在此插入模式)
我能想到的最好的解决方案是外观模式...但是那些外观中的代码实在是太丑陋了。
请有人告诉我是否存在一种模式,可以重用我的一些代码,或者至少为未来的读写操作提供一个模板。
有人问过模块化设计,但答案都是针对该提问者的问题,并不完全有用。

示例

这只是一个示例,基于我去年做的一个项目。可以随意提供其他示例。

我们的程序是一个物理沙盘。我们想要加载描述沙盘中物体物理属性的XML数据。我们还需要加载包含3D渲染信息的.3DS文件。最后,我们需要查询SQL数据库以了解谁拥有哪些物体。

当支持新的3D模型格式时,我们也需要能够支持这些格式。我们还不知道这些文件的样子,但我们想预先设置好代码框架。这样,一旦我们获得新的数据架构,加载例程就可以快速实现。

来自所有3个来源的数据将用于创建我们软件中的对象实例。

稍后,我们需要将物理信息(如位置和速度)保存到数据库中,并将自定义纹理信息保存到本地文件中。我们不知道纹理将是什么类型的文件,因此我们只想布置好代码结构,以便稍后可以插入保存代码。

没有某种设计模式,即使是少量的对象也会迅速导致紧密耦合的网络。

No pattern network

外观模式可以将对象/数据与相应的文件解耦,但这只是将问题集中在输入和输出外观中,很快就会变成一个噩梦般的混乱。此外,对象/数据现在与外观紧密耦合,因此并没有真正获得模块化。

Facade network


从三周前编辑...

之前,当我第一次提出这个问题时,我提供了一堆伪代码,但后来我决定它使我的主要问题变得晦涩难懂。可以说:我不得不使用大约2000行非常奇怪的代码来进行那个特定的读取操作,它在处理和组织方面做得很少,我将永远无法在其他项目中再次使用它。

我希望将来避免编写这样的代码。


你能把一个 zohoFile 当作一个对象来处理,它继承了一个抽象的 ..File 吗?这样,每当有新的应用程序/客户端出现时,你只需要实现特定于该应用程序/客户端的抽象方法即可。然后,getZohoFiles 只需创建 List<ZohoFile> 并在每个对象上调用 get(或其他)方法。 - ketan vijayvargiya
@ketan 这是一个不错的开始,但你能否再更加详细和概括一些呢? - drmuelr
3个回答

3

也许您的问题或疑问有些细节并未完全得到解决,但我想分享一下我在统一 I/O 操作方面所采取的方法。我之前在几种不同的高级语言中使用过这种策略。当与序列化结合使用时,这种策略的效果最佳。

看起来基本的 I/O 操作是保存 / 放置 和加载 / 获取。以下是最抽象的通用接口:

public interface ObjectRepository
{
    <T> void save(string resourceId, T obj);
    <T> T load(string resourceId);
}

这种策略适用于所有类型的I/O操作,只要资源id(数据库UUID/GUID/String、文件路径、网络URL等)已知。
最简单的实现因语言和框架而异,但我发现最普遍适用的是依赖于标准序列化形式的实现,即二进制、XML和JSON。当使用专有对象时,我通常使用XmlFileRepository,将我的简单数据对象转换为Xml格式,并在选择的文件路径上保存/加载。
此外,如果与抽象工厂模式一起使用,甚至可以对单个对象类型使用多样化的数据格式输入和输出。示例代码:
public NewtonianObject load(string respositoryType, string resourceId) 
{
    ObjectRepository repo = RepositoryFactory.create(respositoryType);
    return (NewtonianObject)repo.load(resourceId);
}

public void exportAsXml(string fileName, NewtonianObject obj)
{
    ObjectRepository repo = RepositoryFactory.create("XmlFileRepository");
    repo.save(fileName, obj);
}

2

0

模板模式

在模板模式中,创建一个与I/O操作相关的抽象类,其中包含一组抽象方法和一些其他方法(如果存在可重用性)。所有外部系统,如数据库、文本等,都可以扩展此抽象类并执行特定的任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接