gpt4 book ai didi

design-patterns - 如何抽象这段代码,这样我就不会破坏 DRY 原则

转载 作者:行者123 更新时间:2023-12-02 02:10:34 26 4
gpt4 key购买 nike

我有两种方法可以从 CSV 中提取数据

private Car processCar (String [] row) {
Car c = new Car();
c.setCarId(Integer.parseInt(row[CSVColumns.carid.index]));
....
return c;
}

private Driver processDriver(String[] row) {
Driver d = new Driver(row[CSVColumns.name.index]);
sys.setAge(row[CSVColumns.age.index]);
...
return d;
}

现在,在从数据库中提取数据时,我需要再次使用这两种方法,但需要稍作改动

private Car processCar (ResultSet rs) {
Car c = new Car();
c.setCarId(rs.getInt("Id"));
....
return c;
}

private Driver processDriver(ResultSet) {
Driver d = new Driver(rs.getString("Name));
sys.setAge(rs.getString("Age"));
.....
return d;
}

有没有办法简化这个,这样我就不用重复了?此外,每个方法都包含很多 getter/setter,所以我不想复制粘贴内容并进行更改...

最佳答案

抽象数据源并使用通用接口(interface)

想法是使用通用适配器将 ResultSet 或 CSV 转换为一致接口(interface)背后的通用内容:

interface CarDataSource {

getCarId();
//...

}

还有两个实现:

class CsvDataSource implements CarDataSource {

private final String[] row;

public CsvDataSource(String[] row) {
this.row = row;
}

public int getCarId() {
return Integer.parseInt(row[CSVColumns.carid.index]);
}

//...

}

class ResultSetDataSource implements CarDataSource {

private final ResultSet rs;

public ResultSetDataSource(ResultSet rs) {
this.rs = rs;
}

public int getCarId() {
return Integer.parseInt(rs.getString("Name));
}

//...

}

这就是你如何使用它:

private Car processCar(CarDataSource s) {
Car c = new Car();
c.setCarId(s.getCarId());
....
return c;
}

提供 new CsvDataSource()new ResultSetDataSource()

具有两个实现的抽象工厂:

非常相似的方法,创建和抽象工厂:

interface CarFactory {

Car create();

}

有两个实现:

class CsvCarFactory implements CarFactory {

private final String[] row;

public CsvDataSource(String[] row) {
this.row = row;
}

public Car create() {
Car c = new Car();
c.setCarId(Integer.parseInt(row[CSVColumns.carid.index]));
//...
return c;
}

}

class ResultSetCarFactory implements CarDataSource {

private final ResultSet rs;

public ResultSetCarFactory(ResultSet rs) {
this.rs = rs;
}

public Car create() {
Car c = new Car();
c.setCarId(rs.getInt("Id"));
//...
return c;
}

//...

}

组合

我不喜欢上面的任何一种方法,因为它们引入了很多样板文件而没有增加太多值(value)。但第一种方法一旦减少就很有希望。

只有一个 processCar()String[] 作为参数。但是,如果您有一个 ResultSet,只需先将其转换为 String[],方法是将列提取到数组中的后续项中:

public String[] toStringArray(ResultSet rs)

另一个方向的转换使得 ResultSet 是基本格式也是可能的,但是 ResultSet 单独实现要困难得多。

关于design-patterns - 如何抽象这段代码,这样我就不会破坏 DRY 原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13166652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com