шаблон нулевого объекта не может решить проблему с несколькими типами возвращаемых данных - PullRequest
0 голосов
/ 19 ноября 2018

Иногда пользователи предпочитают не раскрывать семейное положение, что нормально в моем домене.Таким образом, у меня есть данные, где пользователь состоит в браке или нет, и у меня есть данные, где я не знаю статус.Моя цель - убедиться, что функция проверки семейного положения, как показано ниже, возвращает только один тип данных.Хотя я использую php, но я уверен, что это применимо к любому существующему языку.

Это интерфейс

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

Это означает, что статус может возвращать true или false, а в некоторых случаях null.Это была моя реализация.

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

Теперь это нулевой объект, когда я не могу получить данные о семейном положении.

class NullMaritalStatus implements MaritalStatusInterface
{

    private $status;

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

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

Мой вопрос: я не могу разделить возвращаемый типнулевого объекта и функции статуса реального объекта.Как я понимаю, основное преимущество использования шаблона нулевого объекта состоит в том, что функции более предсказуемы, как если бы это был тип возврата bool, тогда он всегда будет возвращать bool.

Как я могу реорганизовать свой код, чтобы функция

public function status(): ?bool

можно записать как

# for MaritalStatus class

public function status(): bool

и

# for NullMaritalStatus class

public function status(): null

Возможно ли это вообще?Конечно, это не будет соответствовать MaritalStatusInterface.Я не уверен, что использование нескольких интерфейсов может решить эту проблему.Или я смотрю это совершенно неправильно, и нет ничего плохого в том, чтобы иметь типы возвращаемых значений, которые можно обнулять?

...