摆脱丑陋的演员阵容

时间:2014-04-12 21:22:19

标签: java casting

Add.java

public class Add implements Value, Reducible{
Value left;
Value right;
public Add(Value left, Value right){
    this.left = left;
    this.right = right;
}

@Override
public String toString(){
    return (left + " + " + right);
}

@Override
public Value reduce(Machine environment) {
    Value val = new Add(left, right);
    if(left instanceof Reducible){
        ((Add)val).left = ((Reducible) ((Add)val).left).reduce(environment);
    }
    else if(right instanceof Reducible){
        ((Add)val).right = ((Reducible) ((Add)val).right).reduce(environment);
    }else{
        val = new VNumber(((VNumber)((Add)val).left).getValue() + ((VNumber)((Add)val).right).getValue());
    }
    return val;
}

}

Value.java

public interface Value {
    public abstract String toString();
}

Reducible.java

public interface Reducible {
public abstract Value reduce(Machine environment);
}

Add.reduce非常难看。它是遵循法规的完美代码,但它几乎不可读。有没有办法摆脱那些丑陋的演员?

1 个答案:

答案 0 :(得分:2)

你真的为自己的生活变得艰难。一开始你已经'左'和'右':你不需要让它们从'val'中恢复。其次,当你不打算在三个案例中使用它时,以及当你还没有正确的参数时,你不应该预先创建一个新的Add()。

以这种方式尝试:

public Value reduce(Machine environment) {
    if(left instanceof Reducible){
        return new Add(((Reducible)left).reduce(environment), right);
    }
    if(right instanceof Reducible){
        return new Add(left, ((Reducible)right).reduce(environment));
    }
    return new VNumber(((VNumber)left).getValue() + ((VNumber)right).getValue());
}

E&安培; OE。但我会非常努力地使用Generics。当然还有一个缺少的情况,“左”和“右”都是可以减少的吗?