SRP原则表明:
一个类或模块应该只有一个改变的原因
我有一些Facade类作为我的服务层类,例如SaleService,它提供了一些方法,例如SaveOrder(),CancelOrder(),CreateOrder(),GetAllOrders(),GetAllPlannedOrders()等。
我之所以将它们放在一起,是因为它们具有概念上的关系。
使用这些可能有多个改变原因的方法来编写这样的类是否违反了SRP?如果是,如何解决这个问题?
SRP原则表明:
一个类或模块应该只有一个改变的原因
我有一些Facade类作为我的服务层类,例如SaleService,它提供了一些方法,例如SaveOrder(),CancelOrder(),CreateOrder(),GetAllOrders(),GetAllPlannedOrders()等。
我之所以将它们放在一起,是因为它们具有概念上的关系。
使用这些可能有多个改变原因的方法来编写这样的类是否违反了SRP?如果是,如何解决这个问题?
SRP(单一职责原则)是指一个职责的实现细节发生变化时,即使该职责只是类的一小部分,也可能导致修改类。而 Facade(外观模式)不会以这种精细、更严重的方式违反 SRP,因为它只是一个表面上的反映——它不会在每次操作的内部发生变化时改变。它可能会在某个操作的名称发生变化时发生变化,这会导致一些脆弱性,但并不可怕,或者在我们想要通过 Facade 反映的操作被删除或添加时发生变化——但这更多地与 Facade 选择公开的内容有关,这实际上是其真正的职责。
我最常使用 Facade 是当我希望通过我的代码的单个入口点来消耗第三方组件时。其中一个例子是Anti-Corruption Layer 模式。然而,我通常会三思而后行地创建 Facade 到自己的代码中,因为你很容易被其便利性所吸引,这可能会阻止你真正思考对象之间的依赖关系。
我不确定在你的例子中 SaleService
是否真的是一个 Facade,因为服务通常不仅仅是重定向到某个业务行为(它们可以进行日志记录、授权、事务管理、协调多个对业务的调用等)。
是的,但外观模式的主要目的是切换责任分类维度。
外观将子系统中的所有对象封装成一个单一对象,并提供多个公共方法作为接口。
子系统中的对象根据业务实体进行分类。但外观的方法根据用例进行分类。
如果涉及仅一个用例的组件导入了外观,则该组件也可以看到外观的其他用例的方法。也就是说,在组件的视图中,外观具有多个职责。
因此,外观模式通常与接口隔离一起使用。