我有一个问题涉及如何定义一个类或设计几个类,然后让他们共同完成这项工作。我的任务是:
1)识别图像上的一些物体;
2)分析每个对象的特征;
我可以定义一个类来完成这项工作,例如,在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
变量可以获得有趣的信息,例如对象的坐标。所以我的问题是:哪种策略更好?谢谢。
答案 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 );
};
每个类负责实现编译过程的一个步骤。这减少了耦合,并且比单一类等价物更容易处理,因为不同的编译阶段可以由不同的开发人员并行工作。