似乎每次我编写任何处理提取,推送,读取或写入操作的代码时,整个代码段都是临时的,丑陋的,并且在该确切应用程序的上下文之外完全无法使用。更糟糕的是,每当我设计这些东西时,我都必须重新发明轮子。在我看来,I / O操作的本质是非常线性的,并不适合模块化或面向对象的模式。
我真的希望有人能告诉我这里错了。 是否存在面向对象或模块化文件和数据I / O的技术/模式?是否有一些约定我可以遵循添加一些代码重用性?我知道有各种工具可以让读取单个文件更容易,比如XML解析器等,但是我&#39 ; m指的是使用这些工具的较大设计。
问题并不仅限于一种语言;我在Java,C,Matlab,Python和其他人的同一个墙上。
关于what object should invoke saving的问题解决了这个问题的一个子主题。这个问题似乎是指工厂模式,其中构建了文件的内容,然后最终写入磁盘。我的问题是关于整体架构,包括用于写操作的工厂,还有用于读取/获取操作的(Insert Pattern Here)。
我能够想出的最好的东西是外观模式......但是圣洁的烟雾是那些外表的代码丑陋。
有人请告诉我一个模式,我可以重复使用我的一些代码,或至少按照模板进行将来的读写。
有人询问Modular Design here,但答案是针对该提问者的问题,并不完全有用。
这只是一个例子,它基于我去年做过的一个项目。随意提供一个不同的例子。
我们的程序是一个物理沙箱。我们想要加载描述该沙箱中对象的物理属性的XML数据。我们还需要加载包含3D渲染信息的.3DS文件。最后,我们需要查询SQL数据库以找出谁拥有哪些对象。
我们还需要能够支持3D模型格式。我们还不知道那些文件会是什么样子,但我们希望提前设置代码框架。这样,一旦我们获得新的数据模式,加载例程就可以快速实现。
来自所有3个来源的数据将用于在我们的软件中创建对象实例。
稍后,我们需要将物理信息(如位置和速度)保存到数据库,并将自定义纹理信息保存到本地文件。我们不知道纹理的文件类型,所以我们只想布置代码结构,以便稍后输入保存代码。
如果没有某种设计模式,即使是少数对象也会很快导致紧密耦合的网络。
外观可以将对象/数据与相应的文件分离,但所有这一切都将问题集中在输入和输出外观中,这可能会匆忙变成一场噩梦般的混乱。此外,对象/数据现在与立面紧密耦合,因此没有真正获得模块化。
以前,我为第一次提出这个问题时遇到的问题提供了一堆伪代码,但我已经决定它混淆了我的主要问题。我只想说:我必须使用大约2000行非常难以理解的代码来处理特定的读取操作,它在处理和组织方面做得非常少,而且我永远不能在另一个上使用任何一个再次投射。
我希望将来避免编写此类代码。
答案 0 :(得分:2)
Holub使用Builder Pattern从对象导出数据(渲染),并将其命名为Inverse Builder模式进行初始化。
这些导出器/导入器对象在他调用它们时是域模型模型本身的一部分,它是模型应该持久化并使用不同数据源创建自身的一种方式。
https://youtu.be/CYCNRCrX1zE?t=45m6s
http://www.javaworld.com/article/2072302/core-java/more-on-getters-and-setters.html
答案 1 :(得分:2)
您的问题或问题的细节可能没有通过此解决方案完全解决,但我想分享我为统一I / O操作所采取的方法。我以前用过几种不同的高级语言。与序列化结合使用时,此策略的扩展性最佳。
似乎两个基本的I / O操作是Save / Put和Load / Get。这是最抽象的通用接口,代表:
public interface ObjectRepository
{
<T> void save(string resourceId, T obj);
<T> T load(string resourceId);
}
此策略适用于所有类型的I / O操作,其中资源ID(数据库UUID / GUID / String,文件路径,Web 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操作相关的抽象类,如果存在任何可重用性,则该抽象类包含一组抽象方法和一些其他方法。所有外部系统如数据库,Text ...都可以扩展这个抽象类并完成特定的工作。