因为没有类别代码了,现在每个类(Shape,Line,Rectangle,Circle)里面的所有属性就不会有时用得到,有时用不到了。现在我们也可以给它们取一些好听点的名字了(比如在Line里面,p1这个属性可以改名为startPoint了)。现在四种异味只剩一种了,那就是,在drawShapes里面还是有一大串if-then-else-if。我们下一步,就是要去掉这长长的一串。
消除代码异味:如何去掉一大串if-then-else-if(或者switch)
经常地,为了去掉if-then-else-if或者switch,我们需要先保证在每个条件分支下的要写的代码是一样的。在drawShapes这个方法里面,我们先以一个较抽象的方法(伪码)来写吧!
class CADapp {
void drawShapes(Graphics graphics, Shape shapes[]) {
for (int i = 0; i < shapes.length; i++) {
if (shapes[i] instanceof Line) {
画线条;
} else if (shapes[i] instanceof Rectangle) {
画长方形;
} else if (shapes[i] instanceof Circle) {
画圆;
}
}
}
}
条件下的代码还是不怎么一样,不如再抽象一点:
class CADApp {
void drawShapes(Graphics graphics, Shape shapes[]) {
for (int i = 0; i < shapes.length; i++) {
if (shapes[i] instanceof Line) {
画出形状;
} else if (shapes[i] instanceof Rectangle) {
画出形状;
} else if (shapes[i] instanceof Circle) {
画出形状;
}
}
}
}
好,现在三个分支下的代码都一样了。我们也就不需要条件分支了:
class CADApp {
void drawShapes(Graphics graphics, Shape shapes[]) {
for (int i = 0; i < shapes.length; i++) {
画出形状;
}
}
}
最后,将“画出形状”这个伪码写成代码吧!
class CADApp {
void drawShapes(Graphics graphics, Shape shapes[]) {
for (int i = 0; i < shapes.length; i++) {
shapes[i].draw(graphics);
}
}
}
¥299.00
¥399.00
¥29.00
¥498.00