Переопределение конструктора нарушает LSP?

Обсуждаем, как правильно строить приложения
Ответить
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Переопределение конструктора нарушает LSP?

Сообщение Nex-Otaku »

Допустим, я хочу запихнуть в исключение какой-то массив полезных данных.
Позже эти данные будут обработаны при отлове исключения.

Что-то вроде

Код: Выделить всё

throw new MoneyException(['cost' => $cost, 'overflow' => true]);
Нет ничего проще, наследуем новый класс от стандартного Exception.

Код: Выделить всё

class MoneyException extends \Exception
{
    public $error;
    public function __construct(array $error)
    {
        parent::__construct();
        $this->error = $error;
    }
}
Всё работает. Но при этом, как я понимаю, нарушается LSP.

Ведь конструктор переписан, и уже нельзя создать исключение "по-старому".

Код: Выделить всё

throw new MoneyException('Big bad overflow');
Но имеет ли это значение, если мой код 100% должен использовать MoneyException только с массивом, и никак иначе?

Если строго следовать LSP, то класс должен выглядеть так

Код: Выделить всё

class MoneyException extends \Exception
{
    public $error;
    public function __construct($message = null, $code = 0, Exception $previous = null, array $error = [])
    {
        parent::__construct();
        $this->error = $error;
    }
}
А вызов вот так

Код: Выделить всё

throw new MoneyException(null, 0, null, ['cost' => $cost, 'overflow' => true]);
Но это же некрасиво. Везде эти "null, 0, null" будут мозолить глаза.

Кто что думает? Можно так нарушать?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Переопределение конструктора нарушает LSP?

Сообщение ElisDN »

Можно. LSP относится только к общеиспользуемому интерфейсу, а данный конструктор кроме Вас никто не использует.
frostealth
Сообщения: 6
Зарегистрирован: 2017.03.31, 20:07

Re: Переопределение конструктора нарушает LSP?

Сообщение frostealth »

Можно попробовать именованые конструкторы

В качестве примера:

Код: Выделить всё

class MyException extends \Exception
{
    public static function nonExistingFile($filename)
    {
        return new self("File '{$filename}' does not exist");
    }
}

throw MyException::nonExistingFile('/path/to/non/existing/file.ext');
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Переопределение конструктора нарушает LSP?

Сообщение Nex-Otaku »

ElisDN писал(а): 2017.05.03, 23:04 Можно. LSP относится только к общеиспользуемому интерфейсу, а данный конструктор кроме Вас никто не использует.
Спасибо.
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Переопределение конструктора нарушает LSP?

Сообщение Nex-Otaku »

frostealth писал(а): 2017.05.03, 23:07 Можно попробовать именованые конструкторы
Хороший вариант, спасибо.
Ответить