OOP设计:可重复使用的验证应该在哪里?

时间:2009-02-11 00:41:26

标签: oop

我有一个向导,需要验证用户是否已登录,然后在结束时验证他们输入的所有详细信息是否正确。

问题是我不确定在何处放置验证逻辑。 目前我有一个BuyMembership类,它对Buy()方法进行了验证。 但是,这不会在向导开始时调用,我需要验证用户是否是唯一的并且有资格购买会员资格。

对于此验证,我创建了一个BuyMembershipValidation类,用于验证用户是否符合条件。

现在的问题是我必须将不同的参数对象传递给BuyMembershipValidation和BuyMembership类。这意味着数据被拆分。

有更好的方法吗?我应该只将部分信息加载到BuyMembership类中进行初始验证,然后加载其余的信息吗?

更新

我需要验证他们何时进入向导(检查他们是否已登录),如果他们不是,那么他们将注册为新用户,否则我必须检查他们是否有正确的设置来购买会员资格所有用户都无法购买会员资格。这就是我需要两套验证的原因。一个是他们是否符合条件,另一个是他们输入的实际数据进行注册。但是我想重新检查他们是否有资格进行最后的交易,以防万一他们以某种方式通过第一个向导步骤,或者如果Web服务(我正在做逻辑)从其他地方稍后调用点。

另一个更新:

我在决定中添加了答案。


TIA, 乔纳森。

4 个答案:

答案 0 :(得分:5)

你实际上在谈论三件非常不同的事情,就像Allain所说的那样,你需要按照单一责任的思路来思考这一点,OOP就像。

  • 身份验证:确保用户已知
  • 授权:确保用户可以访问应用程序中的某些逻辑
  • 验证:确保用户输入的数据有效/安全/预期或需要

答案 1 :(得分:1)

验证器的任务通常是验证用户提供的信息,而不是授权。单一责任原则规定,在您的情况下,他们绝对应该由两个对象交付。

传递不同的参数对象很好,但我认为授权不应该真正传递给BuyMembership对象,听起来应该是外部处理它的东西。

我的2美分。

答案 2 :(得分:0)

用户身份验证是一个广泛的主题。这实际上取决于您正在构建的应用程序类型。如果是Web应用程序,我建议使用其中一种标准方法进行身份验证:NTLM / kerberos

至于何时验证,在调用实际的Buy方法之前,我没有看到任何阻止验证的问题。只要在向导中的步骤中,您不会向它们发布任何信息,而只是从表单中收集数据。您需要关注身份验证的主要时间是您实际下订单或向用户发布应该被锁定在某个数据库中的信息。

如果您提供有关您要执行的操作的更多详细信息,我将优化我的答案以帮助您更多。这是一个相当广泛的问题,所以这是我现在能想到的最好的问题。

答案 3 :(得分:0)

我决定只参加一堂课。原因是IsEligible和Buy方法中存在共同的逻辑/行为。一个确定输入是否符合资格要求,另一个确认购买会员资格所需的所有细节均有效。我并不认为这与身份验证有关。身份验证在一个单独的Web控件中完成,我只需检查Identity.IsAuthenticated和用户名,看看他们是否已登录。然后检查他们的用户名,如果他们有资格购买,那么我让他们继续,否则显示错误消息。在输入验证方面,我已经在我的网页上有验证控件,但我在这里关注的验证是服务器端业务逻辑验证。出于这个原因,我认为它应该在业务逻辑类中。不是某些验证类与执行付款的逻辑分开。这可能只是我看待它的方式,但我认为这与BDD在保存数据的实体内保持验证的想法非常吻合。