Re: [討論] friend的使用
※ 引述《tyc5116 (累人啊....)》之銘言:
: friend class在實務上有什麼例子是有絕對優勢嗎?
我想到的絕對優勢 那大概就是可以寫 quick and dirty code
就是老闆明天就要叫你生出東西
所以你沒時間為 class 添加適當介面的時候
說到 friend 我就想到前陣子的慘痛經驗
那時我正在為一個音樂遊戲寫遠端儲存玩家紀錄的功能
簡單地講,玩家在玩過遊戲後會有很多筆記錄
每筆記錄都是用一個 class 去存
簡化後大概像這樣
class Record {
private:
unsigned int _maxScore;
public:
Record() : _maxScore(0) {}
void setScore(unsigned int score)
{
if(score > _maxScore)
_maxScore = score;
}
void save()
{
// write score to some device...
}
};
這個 class 做的事就是把最高的分數記錄下來
而 save() 這個函式做的就是把分數存到某個記憶裝置上
以上是原本就有的功能,而我當時的工作是在 save() 添加一項網路操作
把分數存到我們的伺服器上,這樣就可以進行網路排名
然而因為一些外部限制,我們必須儘量減少網路傳輸
因此我就改成下列的做法:
class Record {
private:
unsigned int _maxScore;
bool _dirty;
public:
Record() : _dirty(false), _maxScore(0) {}
void setScore(unsigned int score)
{
if(score > _maxScore){
_maxScore = score;
_dirty = true;
}
}
void save()
{
if(_dirty){
// save score to our server...
}
// write score to some device...
}
};
減少傳輸量最簡單的方法就是用 dirty bit
只有變動過的資料才需要存到 server 上
但不幸的是上面的 code 在實際運作時仍然造成了嚴重的錯誤
因為 Record 的 friend class 不知道它多了一個 dirty bit
然後就快快樂樂地跳過 setScore 而直接跑去寫 _maxScore
自此之後我打死不再用 friend (好啦偶爾還是不得不用 就跟goto的頻率差不多)
friend 有一股邪惡的魔力
那就是當你看到某個 class 設定了許多 friend class 之後
就會知道它的介面絕對很爛
但要修改也力不從心 因為那堆 friend class 也要跟著改才行
於是這個 class 就會被放置play 被大家不停地添加 friend class
結論:請不要和 friend 當好朋友
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.168.127.111
推
09/20 05:00, , 1F
09/20 05:00, 1F
→
09/20 09:43, , 2F
09/20 09:43, 2F
推
09/20 13:59, , 3F
09/20 13:59, 3F
推
09/20 17:53, , 4F
09/20 17:53, 4F
→
09/20 19:23, , 5F
09/20 19:23, 5F
→
09/20 19:25, , 6F
09/20 19:25, 6F
→
09/20 20:23, , 7F
09/20 20:23, 7F
→
09/20 20:26, , 8F
09/20 20:26, 8F
→
09/20 22:01, , 9F
09/20 22:01, 9F
→
09/21 10:06, , 10F
09/21 10:06, 10F
→
09/21 10:21, , 11F
09/21 10:21, 11F
推
09/21 12:20, , 12F
09/21 12:20, 12F
討論串 (同標題文章)