Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 被设计模式淹没。。。从哪里开始?_C++_Design Patterns - Fatal编程技术网

C++ 被设计模式淹没。。。从哪里开始?

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)

我正在编写一个简单的原型代码来演示和分析物理代码的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);
  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);
  }
};