gpt4 book ai didi

java - 删除具体示例中的代码重复

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:30:16 24 4
gpt4 key购买 nike

我有三种代码重复的方法。前两种方法几乎完全重复。第三个有点不同,因为应该绘制更多关于火灾的信息。

我想删除这个重复的代码并考虑使用内部类的模板方法模式。这是正确的方法还是有更好的解决方案?

private void drawWaterSupplies(Graphics g) {
double hScale = getWidth() / (double) groundMap.getWidth();
double vScale = getHeight() / (double) groundMap.getHeight();

int imageOffsetX = waterSupplyImage.getWidth() / 2;
int imageOffsetY = waterSupplyImage.getHeight() / 2;
for (Location l : groundMap.getWaterSupplyLocations()) {
int x = (int) (l.getX() * hScale);
int y = (int) (l.getY() * vScale);

g.drawImage(waterSupplyImage, x - imageOffsetX, y - imageOffsetY,
null);
}
}

private void drawEnergySupplies(Graphics g) {
double hScale = getWidth() / (double) groundMap.getWidth();
double vScale = getHeight() / (double) groundMap.getHeight();

int imageOffsetX = energySupplyImage.getWidth() / 2;
int imageOffsetY = energySupplyImage.getHeight() / 2;
for (Location l : groundMap.getEnergySupplyLocations()) {
int x = (int) (l.getX() * hScale);
int y = (int) (l.getY() * vScale);

g.drawImage(energySupplyImage, x - imageOffsetX, y - imageOffsetY,
null);
}
}

private void drawFires(Graphics g) {
double hScale = getWidth() / (double) groundMap.getWidth();
double vScale = getHeight() / (double) groundMap.getHeight();

int imageOffsetX = fireImage.getWidth() / 2;
int imageOffsetY = fireImage.getHeight() / 2;
for (Fire fire : groundMap.getFires()) {
Location l = fire.getLocation();
int x = (int) (l.getX() * hScale);
int y = (int) (l.getY() * vScale);

g.drawImage(fireImage, x - imageOffsetX, y - imageOffsetY, null);
// TODO: draw status bar showing state of fire below
}
}

最佳答案

在我看来,您的对象集合(FireWaterSupply 等)并不像它们应该的那样聪明。理想情况下,您应该能够说:

for (Fire f : groundMap.getFires()) {
f.draw(g);
}

并且每个对象都能够定位自身(使用其位置)、调整自身大小(因为 Fire 知道它将使用 FireImage 等)并绘制自身到提供的 Graphics 对象上。

为了更进一步,我希望将一个 Graphics 对象传递给您的 groundMap 这样:

groundMap.drawFires(g);

这个想法是,在 OO 中,您不应该询问对象的详细信息然后再做出决定。 相反,您应该告诉对象为您做事

关于java - 删除具体示例中的代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12690777/

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