【问题标题】:How to implement a modular system [closed]如何实现模块化系统[关闭]
【发布时间】:2017-09-01 00:55:36
【问题描述】:

我正在设计一个非常大的系统,我将使用 C# 和 .NET Framework 4.6.2 来实现(但我认为这与我的问题无关)。

该系统将包含我可以在一台计算机上使用或不使用它的模块。例如,如果我使用我的系统跟踪相机读取的数据矩阵,我将使用一个模块来读取数据矩阵,但在另一个安装中我不会安装该模块,因为我不会读取数据矩阵。

简而言之,我的系统将是一个带有许多用户控件的 Windows 桌面应用程序,如果这些功能可用,我可以使用这些控件来管理一些功能。

所有这些模块都可以保存统计信息。例如,在有摄像头读取datamatrix的模块中我想存储datamatrix的数量,我在一分钟内读取了多少,读取datamatrix的错误等。这不是这个模块的功能,所以我需要创建管理此统计信息的另一个模块。

有时我会使用统计数据,但有时不会。因此,我需要一种机制来准备所有模块以使用统计模块:

  1. 添加对统计方法模块的调用以保存数据。
  2. 添加一种将统计模块插入另一个模块的方法,并且不执行任何其他操作来使用它。

简而言之,如果我有“插件”到datamatrix模块中,请添加一种使用统计模块的方法,如果我没有插件,请不要使用它。

如果我已插入,我需要做一些准备数据矩阵模块以使用统计模块,但如果我没有插入,请不要抛出任何错误。

我想我需要为统计模块实现一个接口,以及一种将该模块的实例添加到 datamatrix 模块的方法。并且,在 datamatrix 模块上,在使用前检查统计模块是否可用。

你怎么看?有没有一种模式可以做到这一点?

【问题讨论】:

  • 您可能想要采用 OOP 方法,绝对是为了统计数据,它们会创建一些静态类并将它们放入库 (.dll) 中以供您共享方法
  • 如果您的模块有接口,您只需为每个模块设置一个保存/加载并调用它

标签: c# design-patterns architecture software-design


【解决方案1】:

我会这样做:

public interface IStatisticsModule {
    bool Enabled { get; }
    void Save(object stuff);
    // whatever else it can do
}

class NullStatistics : IStatisticsModule {
    public bool Enabled => false;

    public void Save(object stuff) {
        // do nothing or throw
    }
}

class RealStatisticsModule : IStatisticsModule {
    public bool Enabled => true;
    public void Save(object stuff) {
        // save
    }
}

public class DataMatrixModule {
    private readonly IStatisticsModule _stats;

    public DataMatrixModule(IStatisticsModule stats) {
        _stats = stats;
    }

    public void SomeOperation() {
        if (_stats.Enabled)
            _stats.Save(null);
    }
}

所以你总是将IStatisticsModule 注入到其他模块中,但是当你真的不需要收集统计信息时——你注入了虚拟的NullStatistics,它实现了相同的接口但什么都不做。还包括Enabled 属性,以便模块可以决定在不需要时不执行昂贵的统计计算。如果计算成本不高 - 模块甚至可以省略 IsEnabled 检查,只需调用相应的方法,如果不需要统计信息,该方法将不执行任何操作。

这基本上就是所有记录器的工作方式,它们有 Debug()IsDebugEnabled 之类的东西,但你可以省略 IsDebugEnabled 检查并调用 Debug(),如果该函数的参数计算成本不高。如果调试被禁用 - 它什么也不做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 2014-04-11
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2017-09-10
    相关资源
    最近更新 更多