是否赋予客户端任何参数(可能包括传递重复项)的错误设计?

问题描述:

要求是客户只提交一个param是否赋予客户端任何参数(可能包括传递重复项)的错误设计?

我们需要搜索参数匹配firstNamemiddleNamelastName的记录。

这是一个春天的项目,我写了这个方法,它利用这样的春天数据:

List<Record> findByFirstNameOrMiddleNameOrLastName(String fn, String mn, String ln); 

而且从服务层,我打电话通过将重复的参数,因为此方法:

findByFirstNameOrMiddleNameOrLastName(param, param, param); 

当我这样做时,我得到了评论意见,即将三个不同参数传递给一个方法的同一个变量需要设计重新考虑。

我明白上面的说法,多次向方法传递相同的信息只是感觉不好。 我也明白,同样可以使用@Query注解,这将只取一个PARAM,解决这样的问题被写入(这是什么建议通过审核太):

@Query("{$or : [{ 'firstName' : ?0 }, { 'middleName' : ?0 }, { 'lastName' : ?0 }] }") 
List<Record> findByFirstNameOrMiddleNameOrLastName(String n); 


但是我点这里是的,我介绍了这种方法认为它是一个超级的方法,这样,如果一些其他的服务层其实是想通过不同的PARAMS搜索他们可以通过将不同的价值观像这样用同样的方法:

findByFirstNameOrMiddleNameOrLastName(fParam, mParam, lParam); 

同样任何其他组合都可以通过将不同的输入组合用于该方法而被使用。

我可能很幼稚这里,但我认为这种方法的优点是:作为权力,是给客户端的代码,因为它是它们的输入是决定同样的方法将如何查询不同,因此返回所需结果集。

如果我采用@Query方法,并且其他服务层确实需要通过不同的三个或两个参数进行查询,则必须编写不同的方法来完成此操作。 所以我的问题是应该做什么:

应该避免传递重复的参数,并因此编写一个新的方法,每次有新的配对查询要求时,或者应该给客户端代码的控制权传递他们想要的任何东西(甚至重复)只有一个通用的方法?

更新:

现在,我们已经走了与一个参数的解决方案。例如:

@Query("{$or : [{ 'firstName' : ?0 }, { 'middleName' : ?0 }, { 'lastName' : ?0 }] }") 
List<Record> searchRecords(String n); 

但我仍然对此有所讨论和建议。

我也标记了这个问题供版主注意,要求将其移至codereview.stackexchange。com

+1

如果您需要的是一种基于相同值进行搜索的方法,那么这就是您需要实现的方法。您的3参数解决方案不能解决当前存在的问题,它可能永远不会存在。所以我个人会同意你的评论者,这个问题是基于意见的,对于这个网站不是很好,https://codereview.stackexchange.com/可能是一个合适的地方。 – Oleg

问题给你,如果明天你的应用程序支持用户的nickname字段,你的搜​​索用例必须扩展到包含昵称。你会添加一个更多的参数到您的存储库接口的方法影响所有的客户端,或者你宁愿抽象它在查询?
从设计的角度来看,您正在向消费者提供一个search操作,参数匹配的字段是消费者(服务层)无法知道的实现细节,因此查询注释是更好的方式。
如果将来出现不同的配对需求,那么我想将字段视为用例的一部分,而不是数据库实现细节。在这种情况下,你的方法可以有两组参数,一组参数,另一组是需要查询的字段。在你的数据库实现中,你可以有一个查询来匹配字段的参数。