我有一项作业,我想弄清楚哪种模式更适合使用。
任务非常简单:
开发一个应用程序,该应用程序使用因客户而异的各种文本文件,将它们一一解析并以统一的形式保存到数据库中。该应用程序将被众多客户使用。
例如,一个 .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/