Re: [wizs] 系統撰寫概要
看板mud_sanc (Sanctuary - 聖殿)作者laechan (小太保)時間15年前 (2010/06/03 06:57)推噓0(0推 0噓 0→)留言0則, 0人參與討論串6/6 (看更多)
這篇是額外補充,今天修改 group_rank 時剛好有看到的。
有時候,當你撰寫一個系統時,你可能會發現有些事情是重
覆會一直在做的,即有些程式段會不斷重覆地出現。
例如以家族為例可能其中一個程式段如下...
leader_group_ob=(object)GROUP_OB->query("groups/"+leader);
member_data=leader_group_ob->query("members/"+member);
member_data=({"","",t3,t4}); // 將 member_data 做更動
leader_group_ob->set("members/"+member,member_data);
leader_group_ob->save_room();
因為變更族階在 set、change、clean 時都會用到,每次用
到就是要做上面五行,這時一個直覺的想法就是將它寫成一
個函數...
string c_data_term(string leader,string member,mixed data)
{
object leader_data_ob;
mixed member_data;
if(leader && leader_data_ob=GROUP_OB->query("groups/"+leader))
{
if(member && member_data=leader_group_ob->query("members/"+member))
{
member_data=data;
leader_group_ob->set("members/"+member,member_data);
leader_group_ob->save_room();
return "";
}
else
return "沒有 "+member+" 這個族員的資料!!\n";
}
else
return "沒有 "+leader+" 這個族長的資料!!\n");
}
這樣要變更某族員資料時...
c_data_term(leader,member,({"","",t3,t4}));
呼叫這一行即可。
技巧一點的寫法,例如你要變更所有族員的資料..
varargs string c_data_term(string leader,string member,mixed data,int check)
if(check>0)
leader_group_ob->save_room();
也就是說,我們如果用 check 來當做額外的控制,那麼
當沒有 check 時,它只做 set 而不對 leader_group_ob
做 save_room(),這通常是用在迴圈裡頭...
for(i=0;i<n-1;i++)
c_data_term(leader,members[i],({"","",t3,t4}));
// 離開迴圈時 i = n-1
c_data_term(leader,members[i],({"","",t3,t4}),1);
就是「做到最後一個時才讓它 save_room」的意思。
當有一天,你發現自己會在自己的程式中撰寫三個以上類似上
面的函數,甚至有一天你會想先把這些函數寫進一個函數庫裡
頭的時候(例如家族就是 new_group_1.c,也就是MERCHIOR),
那你實際上就是已經在寫所謂的「系統」。
Laechan
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.117.9.179
討論串 (同標題文章)
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章
15
19