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非常难看。它是遵循法规的完美代码,但它几乎不可读。有没有办法摆脱那些丑陋的演员?
答案 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。当然还有一个缺少的情况,“左”和“右”都是可以减少的吗?