Иногда пользователи предпочитают не раскрывать семейное положение, что нормально в моем домене.Таким образом, у меня есть данные, где пользователь состоит в браке или нет, и у меня есть данные, где я не знаю статус.Моя цель - убедиться, что функция проверки семейного положения, как показано ниже, возвращает только один тип данных.Хотя я использую 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.Я не уверен, что использование нескольких интерфейсов может решить эту проблему.Или я смотрю это совершенно неправильно, и нет ничего плохого в том, чтобы иметь типы возвращаемых значений, которые можно обнулять?