假設我有一個具有「xp」值的User對象。現在說我有一個包含XPLevels數組定義多少點都需要這個水平(除其他事項外)的XPLevelsModel:從邏輯中分離數據
class User
{
xp : int;
}
class XPLevelsModel
{
levels : XPLevel;
}
class XPLevel
{
...
xpRequired : int;
name : String;
...
}
好了,所以現在說我有許多方法,如「getCurrentLevel ()「」getPercentProgressThroughLevel()「等等這些方法應該在哪裏?
我可以把他們的用戶對象上:
class User
{
constructor(levelsModel:XPLevelsModel) : {}
xp : int;
getCurrentLevel() : int {}
getPercentProgressThroughLevel() : Number {}
...
}
但是我們添加更多的數據,如「生活」,「健康」等等等等,用戶將開始有很多的功能(不是很好成長在SoC)
我可以嘗試組這些東西成組分,如「XPComponent」,這是對用戶的對象:
class User
{
xp : UserXPComponent;
}
class UserXPComponent
{
constructor(levelsModel:XPLevelsModel) {}
points : int;
getCurrentLevel() : int {}
getPercentProgressThroughLevel() : Number {}
...
}
但問題是從靜止訪問該數據現在的遊戲意味着user.xp.getCurrentLevel(),它打破了Demeter的定律,再加上它的醜陋,難以測試,如果深度更深,會發生什麼?
還有一個選項,我想到了,能有這樣的:
class User
{
xp : int
}
class UserXPHelpers
{
constructor(levelsModel:XPLevelsModel) {}
getCurrentLevel(user:User) : int {}
getPercentProgressThroughLevel(user:User) : Number {}
}
這裏,我們已經分離出來的邏輯和數據,並通過方法傳遞給用戶。唯一的是,這是不是打破封裝?由於所有這些方法都依賴於用戶傳遞給他們,他們不應該與用戶住在一起嗎?
如果這是正確的解決方案,「助手」是否正確的名稱?
我希望你能幫助一次又一次地挑戰我的問題,並且現在只能將它表達爲一個查詢。
邁克
您使用哪種語言?如果您只關心第一個選項是類大小,只需使用[擴展方法](https://msdn.microsoft.com/en-gb/library/bb383977.aspx)。 – sdgfsdh
我儘量保持抽象,語言無關緊要。它更多的是一個普遍的問題 – mikeysee