c++ - 避免垂头丧气,双重派送
问题描述
我做了类似于以下代码的事情:
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)
.
或者我可以将这些参数存储在访问者中,但这仍然感觉不顺畅,尤其是在编写测试时。现在我有所谓的“验证器测试”,我只是简单地放置假响应并测试具体的验证器类,向其中添加访问者会使它们更加复杂。
你会怎么解决?
解决方案
在 IQuery 中定义一个纯虚函数并将其命名为 foo(int a, int b, int c)。在 QueryA 中,您在动态转换之后使用您用“//do something”定义的代码覆盖 foo。用 query.foo(a, b, c) 替换动态转换
推荐阅读
- java - 在 Java 中,动作复制到剪贴板可在所有平台上移植
- python - Mypy “Union[str, Dict[str, str]]”的索引类型“str”无效;预期类型“Union [int, slice]”
- mysql - 常用词过滤
- javascript - 尝试单击子项时侧边栏子菜单折叠
- api - Vertex AI 内部服务器错误:从 UI 测试模型预测时出现错误 500
- php - 如何在 unpkg 上使用 UMD 集成 ReactRangeslider
- pandas - Clickhouse:通过pandas数据框插入数据并且单元格值为null时如何取列的默认值
- excel - 如何在文本中找到应用程序名称列表而无需手动搜索?
- javascript - 如何修复 Expo MediaLibrary“错误:无法将文件复制到外部存储”
- python - 在使用 Counter 的新行上显示字典的每个元素