问问题
1430 次
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 回答