我将以一个真实的例子为例,我必须在我正在编写的程序中实现:
我有一个数据库,其中包含过去三年在保龄球中心举行的每场比赛的得分。使用GUI,您可以选择搜索每个车道上的最佳分数,搜索两个日期之间的最佳分数,搜索每周的最佳分数等。
我想知道实现这个的最好方法是什么。我应该这样写吗:
public Vector<Scores> grabMaxScores(sortType, param1, param2)
{
if(sortType.equals("By lane"))
...
else if(sortType.equals("Between given dates")
...
}
还是为每种类型编写不同的方法并在侦听器中调用正确的方法更合适?
public Vector<Scores> grabMaxScoresBetweenDates(startDate, endDate)
{
...
}
public Vector<Scores> grabMaxScoresByLane(minLane, maxLane)
{
...
}
我不一定要问这个特殊的问题,这只是一个问题,我发现经常问自己当我编写多个方法,原理是相同的,但参数不同。
我可以看到使用它们每个都有很好的理由,但我想知道是否有一种"更正确"或标准的编码方式。
就我个人而言,我更喜欢你的第二个选择。这是因为你有机会对参数的类型这样的事情做到精确。例如,minLane
和maxLane
可能只是整数,但startDate
和endDate
很可能是Date
对象。如果你能够明确你所期望的内容,那就更好了,因为这样可以减少对类型转换和范围检查等内容的需求。此外,我会发现它更具可读性,因为函数名只是说你想做什么。
然而,我可能有一个替代的想法,这是你的第一个例子的一种变化(我实际上从Java的比较器得到了这个灵感,如果你熟悉的话)。不是传递字符串作为第一个参数,而是传递某种Selector
对象。Selector
将是类或接口的名称,看起来像这样(在Java中):
interface Selector {
public void select(Score next);
public Score getBest( );
}
如果select
方法"喜欢"给定给它的next
的值,它可以存储该值供以后使用。如果它不喜欢它,它可以简单地丢弃它,并保留它已经具有的任何价值。处理完所有数据后,将保留最佳值,并可通过调用getBest
请求。当然,您可以更改接口以满足您的特定需求(例如,似乎您可能期望检索多个值)。此外,泛型也可能有很大帮助)。
我喜欢这个想法的原因是现在你的函数是非常通用的。为了添加新功能,您不需要添加函数,也不需要修改已有的任何函数。相反,代码的用户可以简单地定义他们自己认为合适的Selector
实现。这使得您的代码更加组合,从而使其更易于使用。唯一的不便之处是需要定义Selector
的实现,不过,您也可以提供几个默认的实现。
您使用的方法也可以工作。但是如果你想添加一些新功能,比如"在周五晚上获得最低分数",你将需要添加更多的功能,这有点不太好。
由于您已经在数据库中拥有数据,您可以生成数据库查询,该查询将获取所需的结果并显示。所以你不需要每次都修改你的代码