Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 面向对象或模块化文件和数据I/O技术?_Oop_Design Patterns_Io_Modularity - Fatal编程技术网

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

Oop 面向对象或模块化文件和数据I/O技术?,oop,design-patterns,io,modularity,Oop,Design Patterns,Io,Modularity,似乎每次我编写任何处理获取、推送、读取或写入操作的代码时,整个代码都是临时的、难看的,并且在该应用程序的上下文之外完全不可用。更糟糕的是,每次我设计这些东西时,我都感觉必须重新发明轮子。在我看来,I/O操作的本质是非常线性的,不太适合模块化或面向对象的模式 我真的希望有人能告诉我我错了是否有面向对象或模块化文件和数据I/O的技术/模式?我可以遵循一些惯例来增加代码的可重用性吗?我知道有各种工具可以使读取单个文件变得更容易,比如XML解析器等,但我指的是使用这些工具的更大的设计 问题不仅限于一种语

似乎每次我编写任何处理获取、推送、读取或写入操作的代码时,整个代码都是临时的、难看的,并且在该应用程序的上下文之外完全不可用。更糟糕的是,每次我设计这些东西时,我都感觉必须重新发明轮子。在我看来,I/O操作的本质是非常线性的,不太适合模块化或面向对象的模式

我真的希望有人能告诉我我错了是否有面向对象或模块化文件和数据I/O的技术/模式?我可以遵循一些惯例来增加代码的可重用性吗?我知道有各种工具可以使读取单个文件变得更容易,比如XML解析器等,但我指的是使用这些工具的更大的设计

问题不仅限于一种语言;我在Java、C、Matlab、Python和其他语言中遇到了同样的问题

这个问题的一个子主题是关于。这个问题似乎是指一种工厂模式,在这种模式下,文件的内容被构建,然后最终写入磁盘。我的问题是关于总体架构,包括用于写操作的工厂,以及用于读/取操作的工厂(此处插入模式)

我能想到的最好的东西就是一个门面图案。。。但神圣的烟雾是那些外表丑陋的代码

有人请告诉我存在一种模式,在这种模式中,我可以重复使用我的一些代码,或者至少遵循一个模板,以便将来读写

有人问了这个问题,但答案是针对那个提问者的问题的,并不完全有用


例子 这只是一个例子,是基于我去年做的一个项目。请随意提供一个不同的例子

我们的计划是一个物理沙箱。我们希望加载描述沙箱中对象的物理属性的XML数据。我们还需要加载包含3D渲染信息的.3DS文件。最后,我们需要查询SQL数据库以找出谁拥有什么对象

我们还需要能够支持三维模型格式时,他们出来。我们还不知道这些文件会是什么样子,但我们希望提前设置代码框架。这样,一旦我们获得了新的数据模式,加载例程就可以快速实现

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

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

如果没有某种设计模式,即使是少量的对象也会很快形成紧密耦合的网络

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


编辑自3周前

以前,我为我第一次问这个问题时所面临的问题提供了一堆伪代码,但后来我决定它混淆了我的主要问题。只需说一句:我不得不为那组特定的读取操作使用大约2000行非常不稳定的代码,它在处理和组织方面做得非常少,我再也不能在另一个项目上使用它了

我希望以后避免编写此类代码。

使用构建器模式从对象导出数据(渲染),并使用他命名的反向构建器模式进行初始化

这些导出器/导入器对象(如他所称)是域模型本身的一部分,这是一种模型应该使用不同的数据源保存和创建自己的方式


此解决方案可能没有完全解决您的问题或问题的细节,但我想与您分享我为统一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操作相关的抽象类,该类包含一组抽象方法,如果存在可重用性,则很少包含其他方法。所有外部系统,如数据库、文本。。。可以扩展这个抽象类并完成特定的工作

你能把一个
zohoFile
当作一个对象,扩展一个抽象的
.File
?因此,每次新的应用程序/客户机出现时,您只需要实现特定于它的抽象方法
getZohoFiles
将只创建
List
并对每个对象调用
get
(或其他)方法。@ketan这是一个很好的开始,但您是否可以进一步扩展和概括它?
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);
}