我做了类似以下代码的事情:
void launchPipeline(IQueryFactory & queryFactory, IQuerySender &querySender, IValidateResponse &responseValidator)
{
std::unique_ptr<IQuery> query = queryFactory.getInstance();
/*
auto a,b,c = querySender.send(query);
//we just get a lot of params from that function
*/
if(responseValidator.validate(query, a, b, c)
{
//do something
}
}
class IValidateResponse
{
public:
virtual bool validate(IQuery & query, int a, int b, int c) = 0;
};
class QueryAValidator
{
public:
bool validate(IQuery & query, int a, int b, int c) override
{
const auto & queryA = dynamic_cast<const QueryA &>(query);
//do something
}
};
这段代码很完美,因为匹配了IQueryFactory
和IValidateResponse
的相应类型。但我在想是否有一些花哨的方法可以避免这种情况?
我正在考虑使用QueryVisitor
,但我不确定如何实现它,访问函数需要采用a、b、c等参数,这看起来在IQuery
接口上会很奇怪,例如 query.accept(visitor, a, b, c)
。
或者我可以将这些参数存储在访问器中,但这仍然感觉不太顺畅,特别是当编写测试时。目前我有所谓的“验证器测试”,其中我只需放置一个假响应并测试具体的验证器类,将访问器添加到其中会使它们变得更加复杂。
你会如何解决这个问题呢?
validate
不是声明为公共的,它是私有的。launchPipeline
如何调用此方法? - selbie