代码之家  ›  专栏  ›  技术社区  ›  Patrick

在整个应用程序中重用接口

  •  0
  • Patrick  · 技术社区  · 15 年前

    我目前正忙于重构应用程序中的重要部分。主要目的是尽可能消除不同模块之间的依赖关系。我现在偶然发现了以下问题:

    在我的应用程序中,我有一个定义了接口IDataProvider的GUI模块。该接口需要由应用程序实现,并用于向GUI模块“提供数据”。例如,可以为数据网格提供此IDataProvider,并使用它循环访问数据网格中应显示的所有实例,并获取它们的数据。

    现在有另一个模块(实际上还有很多模块)都需要类似的东西(比如报告模块、数据库集成模块、数学求解模块等等)。此时此刻,我可以看到我能做的两件事:

    • 我可以将IDataProvider从GUI层移动到一个更低的层,并在所有其他模块中重用这个相同的接口。
      • 这样做的好处是,应用程序更容易使用所有模块(它只需要实现一次数据提供程序)。
      • 缺点是我引入了模块和中心IDataProvider之间的依赖关系。如果有人开始使用一个模块所需的其他方法扩展IDataProvider,那么它也会污染其他模块。
    • 另一种选择是为每个模块提供自己的数据提供程序,并强制应用程序实现所有这些模块(如果希望使用所有模块)。
      • 优点是模块不依赖于公共部分
      • 缺点是我最终得到的是igridDataProvider、iReportDataProvider、IDatabaseDataProvider、IsolVerDataProvider。

    最好的方法是什么?如果所有模块都需要(几乎或完全)相同类型的接口,那么是否可以让它们依赖于相同的公共接口?

    如果我使用相同的IDataProvider接口,这是否会给将来带来棘手的问题(目前我还不知道)?

    4 回复  |  直到 15 年前
        1
  •  1
  •   André Caron    15 年前

    IDataProvider

        // Common module.
    class BasicDataProvider : IDataProvider
    {
    public:
        // common overrides...
    };
    
        // For modules requiring no specific methods...
    typedef BasicDataProvider ReportDataProvider;
    
        // Database module requires "special" handling.
    class DatabaseDataProvider : BasicDataProvider
    {
    public:
        // custom overrides...
    };
    
        2
  •  1
  •   Andy Thomas    15 年前

        3
  •  1
  •   Eric Fortin    15 年前

        4
  •  1
  •   Phil Miller    15 年前

    class myFoo{
    public:
        Bar getBar() =0;
    }
    

    class myBaz{
    public:
        Bar getBar() =0;
    }
    

    class MyAdaptor: public myBaz{
    public:
        MyAdaptor(myFoo *_input){
            m_Foo = _input;
        }
    
        Bar getBar(){ return m_Foo->getBar(); }
    
    private:
        myFoo* m_Foo;
    }
    

    myBaz myFoo