C++ 被设计模式淹没。。。从哪里开始?
我正在编写一个简单的原型代码来演示和分析物理代码的I/O方案(HDF4、HDF5、使用并行IO的HDF5、NetCDF等)。由于重点是IO,程序的其余部分非常简单:C++ 被设计模式淹没。。。从哪里开始?,c++,design-patterns,C++,Design Patterns,我正在编写一个简单的原型代码来演示和分析物理代码的I/O方案(HDF4、HDF5、使用并行IO的HDF5、NetCDF等)。由于重点是IO,程序的其余部分非常简单: class Grid { public: floatArray x,y,z; }; class MyModel { public: MyModel(const int &nip1, const int &njp1, const int &nkp1, const int &numProcs)
class Grid
{
public:
floatArray x,y,z;
};
class MyModel
{
public:
MyModel(const int &nip1, const int &njp1, const int &nkp1, const int &numProcs);
Grid grid;
map<string, floatArray> plasmaVariables;
};
我有一点面向对象的经验,但在设计模式方面很少,所以我最近获得了。OOP设计器:您建议我使用哪种模式将I/O与myModel
对象集成?我有兴趣回答这个问题,原因有两个:
- 了解有关一般设计模式的更多信息
- 应用我学到的知识,帮助重构一个庞大的旧的粗糙的/遗留的物理代码,使其更具可读性和可扩展性
我倾向于将Decerator模式应用于
myModel
,因此我可以将I/O职责动态附加到myModel
(即是否使用HDF4、HDF5等)。然而,我并不认为这是应用的最佳模式。在我开始编写代码之前,一本接一本地阅读《四人帮》这本书,感觉像是培养不健康的咖啡因上瘾的好方法。您推荐什么模式?只需编写代码即可。在编写代码时,尝试识别代码中的模式(重要的是,不仅仅是GOF模式)。如果你不能,不要担心——在你的下一个项目中,只需再次编写代码,然后再次尝试识别该项目和第一个项目中的模式。这就是所有的设计模式——你反复做的事情。只有当你至少有一点经验的时候,谈论这些问题才是明智的。GOF这本书并不是一个解决方案的目录。就我个人而言,我不会去尝试找出应该应用的模式。相反,我只想简单地关注如何修改代码,使其更具可读性和可维护性
在某个时刻,你会做的足够多,真正的模式将开始显现。在这一点上,请回到GoF手册,找出如何最好地调整它们。我同意Neil的观点,即最好“发现”代码中休眠的模式,而不是试图将现成的想法强加给设计。为此,我推荐Josh Kerievsky—这是一本值得一读的书,它让您深入了解如何在日常开发工作中实际使用和使用模式 也就是说,例如在库中使用了Decorator,因此您的想法有一个先例:-)“您建议我使用哪种模式将I/O与myModel对象集成?” 你问错问题了。您应该问的问题是,“如何将模型与I/O分离?” 有很多答案。我看到的一个有趣的设置是Robert C.Martin使用代理。您使用decorator的想法也有优点 我强烈反对那些告诉你不要担心模式的人。的确,您应该让问题决定解决方案,但除非您真正尝试使用模式,否则您将永远无法识别它们,也无法在架构讨论中使用它们;模式对于能够讨论设计和架构非常重要,如果你没有足够的词汇,你将在此类讨论中受到严重阻碍
也许比模式更重要的是学习导致它们的原理。学习打开/关闭原则(主要原则)和LSP。还要记住诸如单一责任原则和其他原则。设计模式是遵循这些原则而诞生的,因此,密切了解它们将有助于你认识到模式何时能被应用,以及为什么一个特定的模式能有助于超过另一个模式。 < P>。这里有C++的设计模式的例子(首先):设计是极简主义的,但它给出了示例和建议 对于您的问题,我认为
装饰器不合适。装饰器的目标是添加一些东西。传统的示例是在油漆上添加框架
在这里,我认为您正朝着战略
发展。策略的思想是在运行时选择如何执行任务。它通常与AbstractFactory
结合使用,给定一个键,它将返回正确的具体策略
例如,假设您根据文件扩展名选择策略:
class IDecoder
{
public:
virtual void execute(Model& model, File const& file) const = 0;
private:
};
class HDF4: public IDecoder
{
public:
virtual void execute(Model& model, File const& file) const;
private:
};
class DecoderFactory
{
public:
static std::auto_ptr<IDecoder> Get(std::string const& fileName);
private:
};
class Model
{
public:
Model(std::string const& fileName)
{
std::auto_ptr<IDecoder> decoder = DecoderFactory::Get(fileName);
File file(fileName);
decoder->execute(*this, file);
}
};
类IDecoder
{
公众:
虚空执行(模型和模型、文件常量和文件)常量=0;
私人:
};
HDF4类:公共IDecoder
{
公众:
虚拟空执行(模型和模型、文件常量和文件)常量;
私人:
};
类解码工厂
{
公众:
静态std::auto_ptr Get(std::string const和fileName);
私人:
};
类模型
{
公众:
模型(标准::字符串常量和文件名)
{
std::auto_ptr decoder=DecoderFactory::Get(文件名);
文件名;
解码器->执行(*此,文件);
}
};
+1。我最讨厌的是那些试图让解决方案符合模式的人。谢谢!集中精力学习/遵循原则似乎是发现模式的自然方式。我最近读了马丁的报纸,但没听说过LSP。你有参考资料吗?利斯科夫替代原则-在概念上类似于合同设计。-马丁也有一篇关于这一点的论文,我相信。
class IDecoder
{
public:
virtual void execute(Model& model, File const& file) const = 0;
private:
};
class HDF4: public IDecoder
{
public:
virtual void execute(Model& model, File const& file) const;
private:
};
class DecoderFactory
{
public:
static std::auto_ptr<IDecoder> Get(std::string const& fileName);
private:
};
class Model
{
public:
Model(std::string const& fileName)
{
std::auto_ptr<IDecoder> decoder = DecoderFactory::Get(fileName);
File file(fileName);
decoder->execute(*this, file);
}
};