我有一个名为OAuthLogin
的课程,它支持通过OAuth登录用户。该网站还支持“传统”登录过程,没有OAuth。这两个流共享了很多代码,我需要在这些代码中区分它们。
我有一个静态方法OAuthLogin::isThis()
,它返回一个布尔值,无论当前登录流是否为OAuth(通过检查会话变量和URL参数)。
我不喜欢这个方法的名称,但我想不出更好的方法 - 我想这是一个常见的概念,因此应该有某种模式。
我不喜欢OAuthLogin::isThisOAuthLogin()
,因为这是多余的。
我想避免使用Login::isThisOAuth
,因为我希望将所有代码保留在OAuthLogin
类中。
我应该去OAuthLogin::is()
吗?有什么比这更好的吗?
感谢。
答案 0 :(得分:22)
您的OAuthLogin类应该只有one responsibility,这是为了让用户能够使用OAuth登录;这个类应该不了解“传统”登录过程。看到此类名的人(例如StackOverflow用户!)将假定此类仅负责使用OAuth的登录功能。
当你的两个登录进程共享大量代码时,你真的应该重构你的代码,以便你有一个带有公共代码的基类,然后为OAuth和Traditional登录提供单独的类,它们都将继承自base类。当您的代码执行时,您应该实例化适合该用户会话的登录类。
此外,由于您的OAuthLogin类是静态的,那么它将如何处理同时登录的许多用户?因此,重构它的另一个好理由是它不是静态的。
如果你绝对无法重构,那么在没有看到你的代码的情况下,听起来好像OAuthLogin类实际上是mediator,即它封装了一组类如何交互(在这种情况下是你的登录类)。因此,您可以将其命名为“LoginMediator”,而不是使用名称“OAuthLogin”。然后你可以拥有这些属性:
LoginMediator.isOauthLogin
和
LoginMediator.isTraditionalLogin
区分调解器用于该特定会话的不同类型的登录。虽然不是使用“繁体”一词,而是将此替换为您实际使用的其他身份验证机制(例如HTTP基本身份验证,HTTP摘要身份验证,HTTPS客户端身份验证等)。
请注意我为这些属性选择了intention-revealing名称。如果陌生人要读你的代码(例如我!),他们就很难从方法签名中理解“is()”和“isThis()”的目的。
但是,从长远来看我确实建议您重构代码,以便拥有具有离散职责的类,因为您会发现命名方法会更容易。< / p>
答案 1 :(得分:0)
我会向基类添加一个方法,它只返回登录类型。
类(伪代码)
class Login
method class
return self.class # Returns the current class.
end
end
用法是(也是伪代码):
if currentLogin.class == OAuthLogin
# ..
else
# ..
end
这将允许您稍后添加更多类型,而无需为每种登录类型添加特定于类型的方法,将控制流留在您的类之外。
答案 2 :(得分:0)
我建议其中一个:
OAuthLogin::isCurrent()
OAuthLogin::isCurrentLogin()
OAuthLogin::isCurrentFlow()
OAuthLogin::isCurrentLoginFlow()
OAuthLogin::isActive()
OAuthLogin::isActiveLogin()
OAuthLogin::isActiveFlow()
OAuthLogin::isActiveLoginFlow()
答案 3 :(得分:0)
OAuthLogin::isUsed()
怎么样?
答案 4 :(得分:-1)
我建议OAUthLogin::isLoggedIn().