2011年2月24日 星期四

Clean Code - Meaningful Names

最重要的一點就是 Use intention-revealing names,其他都是本規則的延伸。

之前設計 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;
};

為了好名字,改再多次都值得。

沒有留言:

張貼留言