當不同元件有相似的資料時,應該把相同的部份整理出來成為一個獨立的資料定義,並在用到的地方使用這個資料定義。如果元件之間各自定義的話,當要新增或修改資料時,所有用到的地方都得要一併更新,既秏時又費力,且容易出錯,會是一場災難。

資料各自定義的問題

例如在程式中有個代表玩家資訊的資料,在玩家物件、公會成員、排行榜中都有用到:

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);
    }
}

如此一來,如果有新增資料欄位的話,也可以方便找到要更新的地方。

總結

當發現有些資料在不同的地方重複出現時,就應該考慮把這些資料整理出來。尤其越是基本的資料,越晚改動的成本就越高。因為越晚修改,用到的地方只會越來越多,而且對應元件的功能也是基於拿到的資料製作的,所以要改動時,牽涉的程式範圍就會很廣。

標籤: ,

分類:

更新時間: