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 思想,应该可以帮助您清理代码。