Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 关于分组或分离相似函数/方法的问题_Function_Methods_Correctness - Fatal编程技术网

Function 关于分组或分离相似函数/方法的问题

Function 关于分组或分离相似函数/方法的问题,function,methods,correctness,Function,Methods,Correctness,我将举一个我必须在我正在编写的程序中实现的真实示例: 我有一个数据库,记录了过去三年保龄球中心每一场比赛的得分。使用GUI,您可以选择搜索每条车道上的最佳分数、搜索两个日期之间的最佳分数、搜索每周的最佳分数等 我想知道实现这一点的最佳方式是什么。我是否应该编写如下代码: public Vector<Scores> grabMaxScores(sortType, param1, param2) { if(sortType.equals("By lane")) .

我将举一个我必须在我正在编写的程序中实现的真实示例:

我有一个数据库,记录了过去三年保龄球中心每一场比赛的得分。使用GUI,您可以选择搜索每条车道上的最佳分数、搜索两个日期之间的最佳分数、搜索每周的最佳分数等

我想知道实现这一点的最佳方式是什么。我是否应该编写如下代码:

public Vector<Scores> grabMaxScores(sortType, param1, param2)
{
    if(sortType.equals("By lane"))
        ...
    else if(sortType.equals("Between given dates")
        ...
}
公共向量grabMaxScores(sortType,param1,param2)
{
if(sortType.equals(“按车道”))
...
else if(sortType.equals(“在给定日期之间”)
...
}
还是为每种类型编写不同的方法并在侦听器中调用正确的方法更合适

public Vector<Scores> grabMaxScoresBetweenDates(startDate, endDate)
{
    ...
}

public Vector<Scores> grabMaxScoresByLane(minLane, maxLane)
{
    ...
}
public Vector grabMaxScoresbetween日期(开始日期、结束日期)
{
...
}
公共矢量抓取MaxScoresBylane(minLane,maxLane)
{
...
}
我不一定要问这个特定的问题,这只是我发现当我编码多个原理相同但参数不同的方法时经常问自己的问题


我可以看出使用每种方法都有很好的理由,但我想知道是否有一种“更正确”或标准的编码方式。

您使用的方法也可以。但是如果您想添加一些新功能,如“在周五晚上获得最低分数”,您将需要再添加一个函数,这不是一件好事


由于数据库中已有数据,您可以生成数据库查询,以获取所需的结果并显示。因此,您无需每次修改代码。

在我个人看来,我更喜欢您的第二个选项,而不是第一个选项。这是因为您有机会精确地了解t的类型参数。例如,
minLane
maxLane
可能只是整数,但是
startDate
endDate
很可能是
Date
对象。如果你能真正指定你想要的,通常会更好,因为这样可以减少对施法和范围检查等的需要。此外,我会发现因为函数名只是说明了您要做的事情,所以它的可读性不高

然而,我可能有另一个想法,这是您第一个示例的一种变体(如果您熟悉的话,我实际上从Java的Comparator获得了这个灵感)。而不是将字符串作为第一个参数传递,而是传递某种类型的
选择器
对象。
选择器
将是类或接口的名称,类似于(在Java中):

如果
选择
方法“likes”
next
的值被赋予它,它可以存储该值供以后使用。如果它不喜欢它,它可以简单地丢弃它,并保留它已经拥有的任何值。处理完所有数据后,将保留最佳值,并可以通过调用
getBest
来请求。当然,您可以更改接口以适合您的需要特殊需求(例如,您可能期望检索多个值。此外,泛型可能也会有很大帮助)


我喜欢这个想法的原因是,现在你的函数是非常通用的。为了添加新的功能,你不需要添加函数,也不需要修改你已经拥有的任何函数。相反,你的代码的用户可以简单地定义他们自己认为合适的
选择器的实现。这允许你的代码更具组合性,这使得它更易于使用。唯一的不便是需要定义
选择器的实现,不过,您也可以提供几个默认的实现。

这似乎是个好主意,我不知道您可以这样做。我不熟悉选择器的概念,但我一定会在它出现时仔细阅读这似乎是最好的解决方案,将来可能也会对我有很大帮助。我用Java编写了这个应用程序,所以我在实现它时不会有任何问题。非常感谢!我不确定我是否正确理解了选择器,所以如果我要问的问题没有意义,很抱歉,但不必传递不同的选择器根据您希望搜索数据的方式,与使用不同的方法相同?这个想法很好,但我不明白为什么它“更好”,因为您必须修改新案例的代码(创建一个新选择器而不是新方法)使用这些模式的最大原因是,代码的用户永远不会被限制在他们能做的事情上。如果你选择为所有事情实现一个新方法,那么其他人只能做你想做的任何事情(这不是所有事情)。即使此代码只供您自己使用,我认为编写代码时也值得,因为其他人也会使用它,在这种情况下,可扩展性非常重要。请澄清一下(我会接受您的回答),您所说的模式是,如果另一个程序员想要修改我的代码以添加新功能,他只需要将一个新的选择器对象传递给我的方法,而不必定义一个新的选择器对象/修改旧的方法。创建一个新的类来“选择”是不是也需要很多工作创建一个新方法的正确值是什么?你说的很有道理,而且看起来会更干净,但我看不出它如何使程序更具可扩展性,因为两种方法都可以创建一个新函数(尽管不同)当然,创建一个类和创建一个方法一样重要。问题是,任何程序员都可以创建一个类,但你是唯一可以添加方法的人。如果你想了解更多信息,我相信这是一个示例。
interface Selector {
    public void select(Score next);
    public Score getBest( );
}