0

有时用户不想透露婚姻状况,这在我的领域中很好。所以我有用户是否已婚的数据,我有我不知道状态的数据。我的目标是确保下面的婚姻状况检查功能仅返回单一类型的数据。虽然我使用的是 php,但我确信这适用于任何语言。

这是界面

interface MaritalStatusInterface
{
    public function status(): ?bool;
}

这意味着状态可以返回真或假,在某些情况下为空。这是我的实现。

class MaritalStatus implements MaritalStatusInterface
{
    const SINGLE  = 0;
    const MARRIED = 1;

    private $status;

    public function __construct(int $status)
    {
        if($status !== self::SINGLE && $status !== self::MARRIED)
        {
            throw new \InvalidArgumentException("Given marital status '$status' is invalid. Marital status should be either single as " . self::SINGLE . " or married as " . self::MARRIED, 7263);
        }
        $this->status = $status;
    }

    public function status(): ?bool
    {
        return ($this->status)?true:false;
    }
}

现在,当我无法获取婚姻状况数据时,这是 null 对象。

class NullMaritalStatus implements MaritalStatusInterface
{

    private $status;

    public function __construct()
    {
        $this->status = null;
    }

    public function status(): ?bool
    {
        return $this->status;
    }
}

我的问题是我无法拆分 Null 对象和真实对象状态函数的返回类型。根据我的理解,使用空对象模式的主要好处是函数更容易预测,就好像它是 bool 返回类型,那么它将总是返回 bool。

如何重构我的代码,以便函数

public function status(): ?bool

可以写成

# for MaritalStatus class

public function status(): bool

# for NullMaritalStatus class

public function status(): null

甚至可能吗?这肯定不符合 MaritalStatusInterface。我不确定使用多个接口是否可以解决它。还是我以一种完全错误的方式看待它,并且拥有可为空的返回类型并没有错?

4

0 回答 0