让一个类完成工作或将一个类分成C ++中的几个子类?

时间:2014-01-10 18:28:31

标签: c++ oop design-patterns

我有一个问题涉及如何定义一个类或设计几个类,然后让他们共同完成这项工作。我的任务是:

  • 1)识别图像上的一些物体;

  • 2)分析每个对象的特征;

  • 3)基于对象特征选择那些满足一些 标准。

我可以定义一个类来完成这项工作,例如,在C ++中:

class JobExecutive
    {
      public:
           void DoTheJob
           {
               IdentifyObjects();
               AnalyzeObjects();
               FindObjects();
            }
    }; 

或者我可以定义三个类:

class ObjectIndentifier()
{
 pulbic:
     std::vector<MyObject> objList;
     void identifyObjects();
}

   class ObjectFeatureAnalyzer()
   {
      public:
          std::vector<MyFeatures> featureList;
          std::vector<int> objSelect;
          void analysizeObjects( std::vector<MyObject> &objList);
   }
   class ObjectFinder()
  {
     public:
         std::vector<MyCoordinate> coordinatesAOI;
         void findObject(std::vector<int> &objSelect,std::vector<MyObject>  &objList);
  }

这三个类可以合并来完成这项工作:

ObjectIndentifier identifier;
identifier.identifyObjects();
ObjectFeatureAnalyzer analyzer;
analyzer.analysizeObjects(identifier.objList);
ObjectFinder finder;
finder.findObject(identifier.objSelect, identifier.objList);

最后,从finder.coordinatesAOI变量可以获得有趣的信息,例如对象的坐标。所以我的问题是:哪种策略更好?谢谢。

1 个答案:

答案 0 :(得分:1)

在C ++和任何OO语言中,一个好的设计规则就是这样命名的Single responsibility principle

这条规则说一个班级只负责管理应用程序的一个方面,这个责任必须由班级封装。
因此,如果您的应用程序需要管理一些内容,则每个应用程序应仅由一个类管理,其他类可通过聚合访问/使用该服务。

考虑一个简单的编译器实现:

class tokenizer
{
    std::vector<tokens> tokenize( const std::string& code );
}:

class parser
{
    backend_bytecode parse( const std::vector<token>& tokens );
};

class optimizer
{
    backend_bytecode optimize( const backend_bytecode& bytecode );
};

class binary_generator
{
    executable generate( const backend_bytecode& bytecode );
};

class compiler
{
    tokenizer tokenizer;
    parser    parser;
    optimizer optimizer;
    binary_generator generator;

    executable compile( const std::string& code );
};

每个类负责实现编译过程的一个步骤。这减少了耦合,并且比单一类等价物更容易处理,因为不同的编译阶段可以由不同的开发人员并行工作。