2013-06-19 32 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