1
4

1 回答 1

2

不,“这样”的项目没有设计模式。

设计模式不是目标。

所以,让我直说一些猜测:

  • 你想要轻量级代码(因为否则你会使用 Java,对)
  • 你想要可维护的代码(因为否则,意大利面就可以了)
  • 你想要惯用的代码

这是我要做的:

  • 在单独的头文件中声明类
  • 使用前向定义来减少头部耦合
  • 在相应的源文件中移动实现
  • 将不需要的实现依赖项排除在头文件之外。可选择在此处使用 Pimpl Idiom。

    例如,如果您使用库 X 来实现Y::frobnicate,请不要包含libX.h在您的Y.h. 相反,Y.cpp仅包含它。

    如果您发现需要libX.h在标头中声明类成员,请使用 Pimpl Idiom。

我不知道你还想要什么:)

也许,如果您需要“接口”,请考虑使用模板组合。政策、战略、状态模式。例如,而不是

    #include <set>

    struct ISensors {
        virtual int get(int id) const = 0;
        virtual int set(int id, int newval) const = 0;
        virtual std::set<int> sensors() const = 0;
    };

    class Drive {
        void update();
        Drive(ISensors &sensors);

      private:
        ISensors &sensors;
    };

你可以考虑

template <typename Sensors>
class Drive {
    void update();
    Drive(Sensors &sensors);

  private:
    Sensors &sensors;
};

这使您可以自由地Sensors以任何静态编译的方式实现。“限制”是依赖项的注入需要静态定义/类型化。好处是最终的灵活性和零开销:例如,您不能拥有虚拟成员函数模板,但您可以将其用作Sensors策略:

struct TestSensors {
    int get(int)      { return 9;  } 
    int set(int, int) { return -9; } 

    template<typename OutputIterator>
    OutputIterator sensors(OutputIterator out) const {
        int available[] = { 7, 8, 13, 21 };
        return std::copy(std::begin(available), std::end(available), out);
    }
};

using TestDrive = Drive<TestSensors>;
于 2015-10-18T21:42:24.183 回答