【问题标题】:Should I separate or keep them in same class?我应该将它们分开还是留在同一个班级?
【发布时间】:2017-08-12 01:10:23
【问题描述】:

我的UserService 中有一些方法。

class UserService {

   Token generateTokenForLogin(String phone);  
   User login(String phone, String token);

   Token generateTokenForRegistration(String phone);
   User register(String phone, String token);

   Token generateTokenForForgotPassword(String phone);
   User forgotPassword(String phone, String token, String newPassword);

   User updateUser(UpdateUserRequest request);
}

我应该把这些方法分开

class LoginService {

   Token generateTokenForLogin(String phone);  
   User login(String phone, String token);
}

class RegistrationService {

   Token generateTokenForRegistration(String phone);
   User register(String phone, String token);
}

class UserPasswordService {

   Token generateTokenForForgotPassword(String phone);
   User forgotPassword(String phone, String token, String newPassword);
}

class UserService {

    User updateUser(UpdateUserRequest request);
}

每种方法都有10+ LOC,我想知道哪种方法更好,谢谢。

【问题讨论】:

    标签: oop domain-driven-design


    【解决方案1】:

    在 OOP 中有 SOLID 原则。 S 代表单一职责,每个功能/类都应该有明确定义的目的。从它的外观来看,我会说你的 UserService 类不遵循这个原则。我确实会分离出功能,但我会有不同的方法。将其分为 2 个类,用户服务和令牌生成器,如....

    class UserService {
    
       User login(String phone, String token);
       User register(String phone, String token);
       User forgotPassword(String phone, String token, String newPassword);
       User updateUser(UpdateUserRequest request);
    }
    
    class TokenGenerator {
    
       String newLoginToken(String phone);  
       String newRegistrationToken(String phone);
       String newForgotPasswordToken(String phone);
    }
    

    现在您的班级已适当分开。 TokenGenerator 专用于生成令牌,UserService 专用于用户服务。

    单独说明,我喜欢您的自记录函数名称,但它似乎有点冗长。我将函数名称更改为更简洁。最后,为什么您的“生成令牌”函数返回类型令牌,但登录、注册和忘记密码令牌的令牌类型为字符串?如果可以的话,使用内置变量类型来避免不必要的复杂性。

    为了获得最大的灵活性和稳健性,我建议创建一个interfaceiUserService。以GoogleAPI UserService Interface 为例

    最后,我认为您担心代码的质量真是太好了。将来,我会查看Code Review Stack Exchange。本次交流专门针对此类问题。

    【讨论】:

    • 很高兴我能帮上忙!如果此答案或任何答案解决了您的问题,请考虑通过单击复选标记接受它。
    猜你喜欢
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多