OOP 添加新需求功能的最佳设计是什么
What would be the best design by OOP to add a new requirement functionality
所以我遇到了一些设计问题,我不确定如何解决它。
假设我们有这段代码
objectA.UserId;
objectA.ValueOne = new DerivedServiceOne().Calculate(values);
objectA.ValueTwo = new DerivedServiceTwo().Calculate(values);
objectA.ValueThree = new DerivedServiceThree().Calulate(values)
这些服务共享同一个接口 IBaseService。
某处出现了一个新要求,即我应该通过传递 userId 将 valueTwo 计算发送到 FirebaseNotification。在 _notificationService 中我还有一些额外的逻辑,因为有时我不发送 ValueTwo(业务逻辑)
objectA.ValueOne = new DerivedServiceOne().Calculate(values);
objectA.ValueTwo = new DerivedServiceTwo().Calculate(values);
_notificationService.ValidateValueTwoAndPush(userId, objectA.ValueTwo)
objectA.ValueThree = new DerivedServiceThree().Calulate(values)
最好的解决方案是什么?我不想破坏 Open/Close 原则。我可以尝试将所有这些逻辑放入 DerivedServiceTwo(具有新的依赖项),但随后我将破坏 LSP 以及一个附加参数
出现计算方法 (userId),它破坏了 SRP。
就我个人而言,我从来都不是一个会陷入所有这些 OOP 的人。通常,我会在需要去的地方实现逻辑,然后 abstract/refactor;而不是担心我可能会或可能不会满足哪些原则。
尽管如此,您似乎想要的是为任何服务提供一种机制,以根据某些事件触发 Firebase 通知。我将假设您稍后可能想要添加不同的通知服务,因此我将根据该规范调整我的答案。
牢记 OOP,我们主要关心的应该是封装通知服务的逻辑。此外,我们希望服务能够独立于客户端代码触发通知(即客户端不必调用 _notificationService.ValidateValueTwoAndPush
方法。
假设我们有一个通知服务 class 可以促进我们的应用程序与各种通知服务之间的所有通信。这个 class 的准系统定义可能是:
public class NotificationService
{
public void Trigger(object value, NotificationServiceType serviceDestination)
{
// ...
}
}
其中 Trigger
方法将带有指定 value
的通知发送到 serviceDestination
参数指定的目的地。 Trigger
方法的实现可以很复杂也可以很简单;然而,重要的是你有一些触发通知的机制——通过 NotificationService
class.
我们现在需要某种方式将通知服务传递到我们的其余服务中。一种方法(也许是最简单的方法)是使 NotificationService
成为单例。如果您只拥有一个,这很好,但如果您需要制作多个,这不是一个理想的解决方案。
另一种方法是将服务传递给所有需要它的服务。这可以通过创建一个抽象 class 来完成,它要求将 NotificationService
传递给构造函数。
public abstract class NotificationSender
{
protected NotificationService NotificationServiceInstance { get; private set; }
public NotificationSender(NotificationService notificationService)
{
NotificationServiceInstance = notificationService;
}
// ...
}
最后,如果您希望发送通知,您的所有服务都可以继承此抽象class。为此,他们将需要调用 NotificationSender
基本构造函数。
public class FooService : NotificationSender, IBaseService
{
public FooService(...parameters, NotificationService notificationService)
: base(notificationService)
{
// ...
}
public void SomeMethod()
{
// ...
// Sometime I want to send a notification...
NotificationServiceInstance.Trigger(...);
}
}
当然,这个想法会让您变得非常复杂。但是,这是一个基本的 OOP 思想,应该可以帮助您清理代码。
所以我遇到了一些设计问题,我不确定如何解决它。
假设我们有这段代码 objectA.UserId;
objectA.ValueOne = new DerivedServiceOne().Calculate(values);
objectA.ValueTwo = new DerivedServiceTwo().Calculate(values);
objectA.ValueThree = new DerivedServiceThree().Calulate(values)
这些服务共享同一个接口 IBaseService。
某处出现了一个新要求,即我应该通过传递 userId 将 valueTwo 计算发送到 FirebaseNotification。在 _notificationService 中我还有一些额外的逻辑,因为有时我不发送 ValueTwo(业务逻辑)
objectA.ValueOne = new DerivedServiceOne().Calculate(values);
objectA.ValueTwo = new DerivedServiceTwo().Calculate(values);
_notificationService.ValidateValueTwoAndPush(userId, objectA.ValueTwo)
objectA.ValueThree = new DerivedServiceThree().Calulate(values)
最好的解决方案是什么?我不想破坏 Open/Close 原则。我可以尝试将所有这些逻辑放入 DerivedServiceTwo(具有新的依赖项),但随后我将破坏 LSP 以及一个附加参数 出现计算方法 (userId),它破坏了 SRP。
就我个人而言,我从来都不是一个会陷入所有这些 OOP 的人。通常,我会在需要去的地方实现逻辑,然后 abstract/refactor;而不是担心我可能会或可能不会满足哪些原则。
尽管如此,您似乎想要的是为任何服务提供一种机制,以根据某些事件触发 Firebase 通知。我将假设您稍后可能想要添加不同的通知服务,因此我将根据该规范调整我的答案。
牢记 OOP,我们主要关心的应该是封装通知服务的逻辑。此外,我们希望服务能够独立于客户端代码触发通知(即客户端不必调用 _notificationService.ValidateValueTwoAndPush
方法。
假设我们有一个通知服务 class 可以促进我们的应用程序与各种通知服务之间的所有通信。这个 class 的准系统定义可能是:
public class NotificationService
{
public void Trigger(object value, NotificationServiceType serviceDestination)
{
// ...
}
}
其中 Trigger
方法将带有指定 value
的通知发送到 serviceDestination
参数指定的目的地。 Trigger
方法的实现可以很复杂也可以很简单;然而,重要的是你有一些触发通知的机制——通过 NotificationService
class.
我们现在需要某种方式将通知服务传递到我们的其余服务中。一种方法(也许是最简单的方法)是使 NotificationService
成为单例。如果您只拥有一个,这很好,但如果您需要制作多个,这不是一个理想的解决方案。
另一种方法是将服务传递给所有需要它的服务。这可以通过创建一个抽象 class 来完成,它要求将 NotificationService
传递给构造函数。
public abstract class NotificationSender
{
protected NotificationService NotificationServiceInstance { get; private set; }
public NotificationSender(NotificationService notificationService)
{
NotificationServiceInstance = notificationService;
}
// ...
}
最后,如果您希望发送通知,您的所有服务都可以继承此抽象class。为此,他们将需要调用 NotificationSender
基本构造函数。
public class FooService : NotificationSender, IBaseService
{
public FooService(...parameters, NotificationService notificationService)
: base(notificationService)
{
// ...
}
public void SomeMethod()
{
// ...
// Sometime I want to send a notification...
NotificationServiceInstance.Trigger(...);
}
}
当然,这个想法会让您变得非常复杂。但是,这是一个基本的 OOP 思想,应该可以帮助您清理代码。