返回NULL与返回没有数据的obj

Returning NULL vs returning an obj with no data

本文关键字:返回 obj 数据 NULL      更新时间:2023-10-16

这是一个相当普遍的API设计问题,而不是C++相关的问题,无论如何,对于预期返回类实例的函数,通常接受什么:如果出现问题,返回NULL,或者返回该类的无数据实例?

这是我的实际代码:https://github.com/alexandernst/cpp-bitstring/blob/76030321b3a424236c3380067a0dc4f132fb8369/src/Bits.cpp#L360

通常我会返回NULL或throw。失败的代码需要尽早理解。

返回一个"坏掉的"对象的替代方法需要每个函数理解对象坏掉并进行处理

NULL/sthrow要求您为每个构造处理一个错误,如果它失败了

问问自己这个问题:

"我的职能承诺是什么,因此客户的期望是什么?

如果函数承诺返回一个对象,如果不能,则抛出异常。例外情况表示无法履行承诺。

例如:

T make_t(Arg arg);  // promises to make a T, should throw if it can't

如果函数承诺它可能返回一个对象,那么在接口中表示:

boost::optional<T> maybe_make_t(Arg arg);

在这种情况下,如果没有创建对象,而只是一个空的optional<T>,我们就不会期望出现异常。因为我们已经返回了一个可选值,所以调用者必须在使用该值之前对其进行检查(或者出现异常)。他现在受到保护,不受自己逻辑错误的影响。

如果可以避免的话,尽量避免总是返回指针。它们会给您的呼叫者带来逻辑难题。

也许(出于某种原因)你想避免异常,但仍然安全地报告失败以遵守承诺?

有一种方法:

boost::variant<T, std::string> make_t_or_reason_why_not(Arg arg);

现在,您强制调用方使用静态访问者来处理您的结果(这很好!它强制调用方覆盖所有代码路径)。

承诺是您返回一些东西,并且它将Tstring,解释为什么没有生成T