之前設計 Physics class,裡面最主要的功能就是 simulate,既然如此,就用 intention-revealing name: Simulator 取代意圖不明的 Physics name。取好名字十分重要,平均來說,寫一行新程式,就要看四行舊程式,有時還得修舊程式。既然常常往前看,何不把舊程式弄好看一點,好看的舊程式,可以幫程式設計師省下不少時間。
為了達到這種境界,我又改了一些 codes,這次還是以 BubbleBall Level One 當例子:
class LevelOneTest {
public:
LevelOneTest() {
simulator_ = new Box2dSimulator();
simulator_->setEdge(...);
simulator_->setPlayer(...);
simulator_->setGoal(...);
}
~LevelOneTest() {
delete simulator_;
}
void setPiece(const Vector2& position, float angle) {
simulator_->setTriangle(...);
}
Simulator* simulator_;
};
struct TestItem { ... };
TEST(LevelOneTest, StressTest) {
TestItem item[] = { ... };
for (int i = 0; i != arraysize(item); ++i) {
LevelOneTest test;
test.setPiece(...);
EXPECT_EQ(..., IsGoaledAfter(...));
}
}
Simulator 的界面:
struct Body {
Vector2 position;
float angle;
BodyType type;
};
class Simulator {
public:
virtual ~Simulator() {}
virtual void setPlayer(...) = 0;
virtual void setGoal(...) = 0;
virtual bool isGoaled() const = 0;
virtual void setEdge(...) = 0;
virtual void setRect(...) = 0;
virtual void setTriangle(...) = 0;
virtual void setCircle(...) = 0;
virtual void simulate(float time_step) const = 0;
virtual std::vector<Body> body(...) const = 0;
virtual Body player() const = 0;
};
為了好名字,改再多次都值得。
沒有留言:
張貼留言