作者laechan (小太保)
看板mud_sanc
标题Re: [wizs] 系统撰写概要
时间Thu Jun 3 06:57:08 2010
这篇是额外补充,今天修改 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