代码之家  ›  专栏  ›  技术社区  ›  Jonathan Parker

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

oop
  •  1
  • Jonathan Parker  · 技术社区  · 16 年前

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

    问题是我不确定在哪里放置验证逻辑。 目前我有一个BuyMembership类,它对buy()方法进行了验证。 但是,在向导开始时不会调用此函数,在向导中,我需要验证用户是否唯一,是否有资格购买成员资格。

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

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

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

    更新:

    我需要验证他们何时进入向导(检查他们是否已经登录),如果他们没有,他们将注册为新用户,否则我必须检查他们是否有正确的设置购买会员资格,因为所有用户都不能购买会员资格。这就是为什么我需要两组验证。一个是他们是否有资格注册,另一个是他们输入注册的实际数据。但是,我想再次检查他们是否合格,当他们作出最后的交易,以防他们不知何故使它通过了第一个向导步骤,或如果Web服务(在我做的逻辑)是从其他地方在以后调用。

    另一个更新:

    我的决定增加了一个答案。


    蒂亚 乔纳森。

    4 回复  |  直到 13 年前
        1
  •  5
  •   ChrisN    16 年前

    你在这里说的是三件非常不同的事情,就像艾伦所说的,你需要按照单一责任的原则去做,就像这样。

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

    验证程序的任务通常是验证用户提供的信息,而不是验证授权。单一责任原则规定,在您的情况下,它们必须由两个对象来处理。

    传递不同的参数对象是可以的,但是我认为授权不应该真正地传递给BuyMembership对象,这听起来像是应该在外部处理的事情。

    我的2美分。

        3
  •  0
  •   regex    16 年前

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

    至于什么时候进行验证,我认为在调用实际的buy方法之前,推迟验证没有任何问题。只要在向导的步骤中,您没有向它们释放任何信息,而是只从表单收集数据。您需要关注身份验证的主要时间是,您实际向用户下订单或发布信息时,这些信息应该锁定在某个数据库中。

    如果你提供更多的细节,你想做什么,我会完善我的答案,以帮助你多一点。这是一个相当广泛的问题,所以这是我目前能想到的最好的问题。

        4
  •  0
  •   Dvir Berebi    13 年前

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