java - 您可以建议什么模式来解决任务?

标签 java oop design-patterns text-files

我有一项作业,我想弄清楚哪种模式更适合使用。

任务非常简单:

开发一个应用程序,该应用程序使用因客户而异的各种文本文件,将它们一一解析并以统一的形式保存到数据库中。该应用程序将被众多客户使用。

例如,一个 .csv 文件可以包含以下负载:

day,time,year,name,surname
01,12:00,2019,Andrey,Arshavin
... 

另一个文件可能如下所示:

day,time,year,fullName,country
01,12:00,2011,Cristiano Ronaldo,Portugal
...

数据库表有以下列:

date(Timestamp),firstName(String),secondName(String)

该项目的目标是提供设计清晰的解决方案。

我的第一个想法是创建不同的 DTOs针对不同的客户和一个Entity类(class)。在读取每个 .csv 时,创建 List<DTO>通过使用工厂方法并将其转换为 List<Entity>并坚持下去。

但是我怎样才能使它更具可扩展性和可维护性呢?我认为意大利面条代码对于每个新客户来说不是一个好主意,我必须添加

"if that customer then return such new object"

最佳答案

简介:您还没有指定的框架或库,所以我想您将从头开始编写所有代码。

<小时/>

The first idea that I have is to create different DTOs for different customers

鉴于您所写的内容,这意味着已经了解所有客户的文件格式。
它们会随着时间而改变吗?
如果出现新客户或更改其文件格式,您可以添加新类吗?
如果不是,则此解决方案不适用。

persists into the database in a unified form

这意味着您将拥有一个用于存储此数据的数据库表。
鉴于每个文件都有不同的 header ,您需要以某种方式准备表来存储所有可能的 header ,或以某种方式映射它们。

<小时/>

然后,需要封装读取文件、解析文件、持久化文件的过程。
我的建议是有一个适当的类,它接收 CSV File 实例作为输入。
这就是我想象的代码流程

final File file = ... 

// Program against interfaces
final Parser parser = new CsvParser(file);
final ParseResult result = parser.parse();

// Headers and Rows provide access to each field or row via getters
final Headers headers = result.getHeaders();
final Rows rows = result.getRows();

// Decorator pattern to apply headers mappings, to have a unified layout
final Headers mappedHeaders = new MappingHeaders(headers, mapping);
persistence.save(mappedHeaders, rows);

对于解析阶段,一种简单而干净的方法是将每一行维护为 Object[]String[] 数组(决定是否要应用转换与否)。
如您所知,CSV 文件的每个字段均以逗号 (,) 分隔,这意味着您需要

  • 读取第一行,拆分它,并将生成的数组存储为headers/keys数组。
    headers = ["日","时间,"年","姓名","姓氏"]

  • 读取第二行,拆分它,将其存储在一个数组中,该数组的长度与标题的长度相同

  • 对每个后续行重复

这样,每个数组索引对应一个特定的列名称,可以通过 headers 数组检索该列名称。

好吧,我已经给了你一个总体愿景。现在就取决于您了,因为您比其他人更了解这些要求。

关于java - 您可以建议什么模式来解决任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55345214/

相关文章:

Java GridBagLayout - 组件从侧面掉落

javascript - 尝试使用 ajax 将数据发送到 OOP 类

java - Java 中的 OOP 解析方程

design-patterns - 观察者模式有哪些常见的错误处理机制?

sql - 后台服务尝试计数机制

java - 如何在 Java 中实现具有内部依赖性的惰性评估有状态类?

java - 枚举的字段是否必须是可序列化的?

java - Plus.Builder.build() 抛出 java.lang.NoSuchFieldError : MAJOR_VERSION

python - 在python中访问另一个类中一个类的私有(private)变量

java - 如何在 Mac OS X Leopard 上的 dtrace 中使用热点探测?