2013-06-19 59 views
1

所以我有一個類叫做Game,我需要根據它們的會話ID檢索數據庫中的Game幾個對象,所以我有這樣的方法:Java參數通過後GRASP

public ArrayList<Game> getGamesBySession 

好吧,但我必須在那裏傳遞一個參數,所以我會知道我想要檢索哪個會話的遊戲,並且我有兩種可能性。我可以通過int或者我可以傳遞Session的對象id,然後使用session.getID()。最後,兩者基本上會導致相同的事情,但我想知道的是另一回事。

我的問題是,這是一個更好的方法,如果我傳遞一個對象,是否意味着GameSession高度相關,並且違反了GRASP

回答

1

這取決於,是session.ID只是一個int?如果是這樣,我寧願通過整個會話,因爲getGamesBySession(session)getGamesBySession(int)清晰得多。

但是,您也可以考慮將int包裝到一個SessionIdentifier對象中,從而使該值具有更多的語義含義。 getGameBySession(SessionIdentifier)同樣清楚,並會阻止你從其他地方傳入一些隨機int ...

+0

是的,'sessionID'是一個'int'。基本上我的項目是一個非常簡單的項目,只是'Game'和'Session',其中'Session'基本上是'Game'對象的集合,但我也使用了一個數據庫,因此我需要使用ID進行搜索以獲取所有'遊戲的特定'Session'(通過'id')。不是'SessionIdentifier'太多了嗎?一個整數類的整數?但是,我接受批評,這就是爲什麼我要求幫助:-) – Nikola

+1

「裸」int(或任何其他原始值)的問題是它沒有語義含義 - 它只是一個標量值。以Date構造函數('Date(int,int,int)')。把年,月和日混在一起很容易。 ('日期(年,月,日)')更清晰了......通過製作小型的基本包裝器,您將更多的語義含義添加到參數中,同時爲開發人員和編譯器提供附加信息可能需要更長的時間才能將年份轉換爲月份參數) – MattDavey

+0

這些小型原始包裝的另一個好處是數據驗證有一個明顯的生活場所。例如'Days'類可能會將值限制爲1-31 - 這是一個在「naked」int中不存在的約束。這可以使您無需在代碼庫中複製簡單驗證('assert days> 0 && days <= 31')... – MattDavey