嗯,当我在观看 SOLID 视频时,我想到了这一点。 单一责任原则表示"一个班级应该只有一个责任"。
这很好。但与此同时,我正在使用N-Layer模型构建的ASP.NET MVC 5项目。我们有UI层,存储库层,域层和要公开的服务层。在服务层,我们基本上每个域类(UserService
,CompanyService
等)有一个类。 UserService
类具有一个负责User
操作的责任,但另一方面,它具有许多不同的响应能力,如身份验证和处理该用户/公司关系。这违反了SRP原则吗?
答案 0 :(得分:7)
仅当您将所有多重责任实施置于内时,才会违反SRP。在SRP中,一个班级只能承担一项责任。管理用户操作是一项责任,但也可以分解为子责任,例如authorization
,company relation
等。
每个子责任都可以作为每个分离的类来实现。然后,您的UserService将这些子类一起用作aggregate services。例如:
public class UserService{
public UserAuthorizationService UserAuthorizationService = new UserAuthorizationService();
public UserCompanyRelationService UserCompanyRelationService = new
UserCompanyRelationService();
public bool IsAuthorized(){
// use UserAuthorizationService
}
public // whatever you do with UserCompanyRelationService
}
答案 1 :(得分:5)
当然。实际上,该类的代码行数必须非常大,这清楚地表明了代码的味道。
当你谈到单一的责任时,你应该考虑改变的原因。为什么我的代码会改变?在您放置的示例中,我可以想到几个原因:我决定更改auth系统,我的数据库工作方式,我进行验证的方式......所有这些都是使不同的类具有结果的线索{{ 1}},AuthService
,UserValidator
...
当您向我们描述您的课程所做的事情时,您使用了"和":" 这样的身份验证并处理该用户/公司关系" 。这是你班级做得太多的另一个症状。如果你不使用"和"来描述课程。你可能违反了原则
尽管您确信这些变更的可能性不会因为系统总是很好而发生,但它可以很好地划分代码,因为您可以更好地组织和测试代码。