[筆記] 將共用的資料定義獨立出來
當不同元件有相似的資料時,應該把相同的部份整理出來成為一個獨立的資料定義,並在用到的地方使用這個資料定義。如果元件之間各自定義的話,當要新增或修改資料時,所有用到的地方都得要一併更新,既秏時又費力,且容易出錯,會是一場災難。
資料各自定義的問題
例如在程式中有個代表玩家資訊的資料,在玩家物件、公會成員、排行榜中都有用到:
public class PlayerData
{
public string Name;
public uint AvatarId;
public uint Level;
public uint ExperiencePoints;
}
public class GuildMemberData
{
public string Name;
public uint AvatarId;
public uint Level;
public GuildRole Role;
}
public class LeaderboardPlayerData
{
public string Name;
public uint AvatarId;
public uint Level;
public uint Rank;
}
如果各自定義的話,一個問題是,每次要傳送資料時,所有的欄位資料都要同步一次:
public class GuildMember
{
private GuildMemberData _data =
new GuildMemberData();
public void UpdateData(PlayerData playerData)
{
_data.Name = playerData.Name;
_data.AvatarId = playerData.AvatarId;
_data.Level = playerData.Level;
}
}
public class LeaderboardPlayer
{
private LeaderboardPlayerData _data =
new LeaderboardPlayerData();
public void UpdateData(PlayerData playerData)
{
_data.Name = playerData.Name;
_data.AvatarId = playerData.AvatarId;
_data.Level = playerData.Level;
}
}
另一個問題是,如果要新增資料欄位的話,每個用到的地方都得要各別新增,而且有同步資料的地方,也要新增對應的功能:
取出共用定義
如果將這些重複的資料獨立出來的話,要新增資料只要找到那個定義就可以:
public class PlayerBasicData
{
public string Name;
public uint AvatarId;
public uint Level;
public uint TitleId;
}
public class PlayerData
{
public PlayerBasicData PlayerBasicData;
public uint ExperiencePoints;
}
public class GuildMemberData
{
public PlayerBasicData PlayerBasicData;
public GuildRole Role;
}
public class LeaderboardPlayerData
{
public PlayerBasicData PlayerBasicData;
public uint Rank;
}
也可以集中提供資料同步的函式,而不是定義在每個元件中:
public class PlayerBasicData
{
public string Name;
public uint AvatarId;
public uint Level;
public uint TitleId;
public static void Copy(
PlayerBasicData from, PlayerBasicData to)
{
to.Name = from.Name;
to.AvatarId = from.AvatarId;
to.Level = from.Level;
to.TitleId = from.TitleId;
}
}
public class GuildMember
{
private GuildMemberData _data =
new GuildMemberData();
public void UpdateData(PlayerBasicData playerBasicData)
{
PlayerBasicData.Copy(
playerBasicData, _data.PlayerBasicData);
}
}
如此一來,如果有新增資料欄位的話,也可以方便找到要更新的地方。
總結
當發現有些資料在不同的地方重複出現時,就應該考慮把這些資料整理出來。尤其越是基本的資料,越晚改動的成本就越高。因為越晚修改,用到的地方只會越來越多,而且對應元件的功能也是基於拿到的資料製作的,所以要改動時,牽涉的程式範圍就會很廣。