gpt4 book ai didi

c++ - 抽象工厂构建失败的最佳实践

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:49 24 4
gpt4 key购买 nike

背景

假设我们有一个抽象工厂的实现,调用如下:

std::string ObjectName = "An Object Name";
std::string Args = "Argument passed directly to constructor by the factory";

std::unique_ptr<MyBaseClass> MyPtr(ObjectFactory::Instance().Construct(ObjectName,Args));

工厂使用 std::map"An Object Name" 转换为构造函数,构造函数本身采用 std::string 作为论点。这个想法是用户比我更了解构造的对象,所以我应该让开,让用户将他们想要的任何信息传递给构造函数。

问题

Args 完全符合预期的形式时,这可以正常工作,但我不知道处理 duff 输入的最惯用方式。如果用户提供了无效的参数字符串会发生什么?

我可以想到以下几点:

  • 让对象的构造函数抛出异常
  • 要求对象提供一个bool Validate(std::string x)方法,检查x是否是一个有效的参数字符串
  • 让工厂使用默认构造函数,然后调用初始化方法(回避问题:如果 init 方法失败怎么办?)
  • 设置一个bool成员变量,如果为真,则意味着“这个对象不在正常状态”
  • 其他一些我没有想到的选择

最佳答案

抛出异常。您正在构造一个对象(尽管以不同于 new 的方式),失败是一个异常,如果它可能发生则需要处理。

“解决方案 2”与处理此问题无关,它更多的是如何确定错误输入。为此,它可能是一个可以接受的解决方案,但同样与手头的问题无关。

解决方案 3 使对象处于不确定状态以防失败,这是 Not Acceptable 。

解决方案 4 是另一种方法,如果您的语言没有异常支持,这是唯一的方法,但我们有。在我看来,这种情况下的异常严格来说更好,因为未能构造对象是一种破坏性如此大的行为,它应该需要替代代码或程序终止。

关于c++ - 抽象工厂构建失败的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30439042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com