Re: [wizs] 系統撰寫概要

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間15年前 (2010/06/03 06:57), 編輯推噓0(000)
留言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
文章代碼(AID): #1C1k77gK (mud_sanc)
文章代碼(AID): #1C1k77gK (mud_sanc)