Иногда пользователи предпочитают не раскрывать семейное положение, что хорошо в моем домене. Таким образом, у меня есть данные, где пользователь состоит в браке или нет, и у меня есть данные, где я не знаю статус. Моя цель — убедиться, что функция проверки семейного положения, как показано ниже, возвращает только один тип данных. Хотя я использую 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;
}
}
Мой вопрос: я не могу разделить возвращаемый тип объекта Null и функцию статуса реального объекта. Основное преимущество, согласно моему пониманию, в использовании шаблона нулевого объекта состоит в том, что функции более предсказуемы, как если бы это был тип возврата bool, тогда он всегда будет возвращать bool.
Как я могу реорганизовать мой код, чтобы функция
public function status(): ?bool
можно записать как
# for MaritalStatus class
public function status(): bool
а также
# for NullMaritalStatus class
public function status(): null
Это вообще возможно? Конечно, это не будет соответствовать MaritalStatusInterface. Я не уверен, что использование нескольких интерфейсов может решить эту проблему. Или я смотрю на это совершенно неправильно, и нет ничего плохого в том, чтобы иметь возвращаемые значения?
Задача ещё не решена.
Других решений пока нет …