首页 > 解决方案 > 避免垂头丧气,双重派送

问题描述

我做了类似于以下代码的事情:

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
    }
};

它工作得很好,因为匹配类型IQueryFactoryIValidateResponse被注入。但我想知道是否可以以某种奇特的方式避免这种情况?

我正在考虑QueryVisitor但我不确定如何实现它,访问函数需要采用 a、b、c 参数,这在IQuery界面上看起来很奇怪,比如query.accept(visitor, a, b, c).

或者我可以将这些参数存储在访问者中,但这仍然感觉不顺畅,尤其是在编写测​​试时。现在我有所谓的“验证器测试”,我只是简单地放置假响应并测试具体的验证器类,向其中添加访问者会使它们更加复杂。

你会怎么解决?

标签: c++unit-testingoop

解决方案


在 IQuery 中定义一个纯虚函数并将其命名为 foo(int a, int b, int c)。在 QueryA 中,您在动态转换之后使用您用“//do something”定义的代码覆盖 foo。用 query.foo(a, b, c) 替换动态转换


推荐阅读