【发布时间】:2016-09-03 15:33:19
【问题描述】:
来电者:
switch (type){
case "creature":
Creature returnActor2 = getNextCreature();
boolean isEat2 = actOnNearby(getRightChromosome(Config.HardCode.creature), returnActor2.getLocation());
if (isEat2) {
actOnCreature(returnActor2);
}
break;
case "monster":
Monster returnActor3 = getNextMonster();
boolean isEat3 = actOnNearby(getRightChromosome(Config.HardCode.monster), returnActor3.getLocation());
if (isEat3) {
actOnMonster(returnActor3);
}
break;
}
它将调用以下2个方法:
private Monster getNextMonster() {
ArrayList<Actor> nearbyActors = getActors();
Monster mine = new Monster();
for (Actor a : nearbyActors) {
if (a instanceof Monster) {
mine = (Monster) a;
}
}
return mine;
}
private Creature getNextCreature() {
ArrayList<Actor> nearbyActors = getActors();
Creature mine = new Creature();
for (Actor a : nearbyActors) {
if (a instanceof Creature) {
mine = (Creature) a;
}
}
return mine;
}
问题
可以看到,getNextXXXXX()方法都差不多,只是返回不同的对象,逻辑是一样的,怎么DRY呢? actOnXXXX() 似乎也属于 DRY 类别,但都差不多,对不同的对象使用相同的逻辑。如何解决?
【问题讨论】:
-
似乎是使用 Java 泛型的好情况
-
Creature和Monster的哪种行为同时涉及actOnCreature和actOnMonster?你能把这些方法的代码和getRightChromosome的代码贴出来吗? -
@Spotted 不一样,各有各的逻辑:P
-
在我看来,代码是非常程序化的,如果使用适当的类进行建模,问题可能会自行解决?一个迹象是几乎没有提到类,只有方法。例如,我可以想象(不知道具体细节)
Actor.actOnNearby()方法,它可以解决我假设的一些“强制转换”。
标签: java class oop object types