Как добиться создания иммутабелтных структур? Добрый день,
не могу понять как мне это сделать на этом примере..$a = RUB(10)->mul(5);
$b = ($a->add(USD(5))->sub(RUB(3)))->mul(2);
$b->describe(); // возвращает строку '((10RUB) * 5 + 5USD - 3RUB) * 2'
$a->describe(); //(10RUB) * 5
Я сделал но изменяю объект в ходе работы,
в итоге в $a->describe(); у меня вышло значение выше а т.е. '((10RUB) * 5 + 5USD - 3RUB) * 2'
а нужно //(10RUB) * 5
Спасибо Всем за помощь!

21 Авг 2019 в 07:01
167 +1
0
Ответы
1

Для создания иммутабельных структур вам нужно обеспечить неизменяемость объектов в процессе работы с ними. В данном случае, кажется, что проблема заключается в том, что методы mul, add и sub изменяют исходный объект, вместо того чтобы возвращать новый объект с результатом операции.

Чтобы исправить это, вам нужно изменить методы mul, add и sub так, чтобы они возвращали новый объект, а не изменяли текущий. Например, метод mul должен создать и вернуть новый объект с результатом умножения, не изменяя исходный объект.

Иммутабельное решение может выглядеть примерно так:

class Money {
public $amount;
public $currency;
public function __construct($amount, $currency) {
$this->amount = $amount;
$this->currency = $currency;
}
public function mul($factor) {
return new Money($this->amount * $factor, $this->currency);
}
public function add(Money $money) {
if ($this->currency != $money->currency) {
throw new Exception('Currency mismatch');
}
return new Money($this->amount + $money->amount, $this->currency);
}
public function sub(Money $money) {
if ($this->currency != $money->currency) {
throw new Exception('Currency mismatch');
}
return new Money($this->amount - $money->amount, $this->currency);
}
public function describe() {
return $this->amount . $this->currency;
}
}
$a = new Money(10, 'RUB');
$b = $a->mul(5);
echo $b->describe(); // выводит 50RUB
$c = $b->add(new Money(5, 'USD'))->sub(new Money(3, 'RUB'))->mul(2);
echo $c->describe(); // выводит 94RUB

Теперь каждый метод возвращает новый объект, на основе которого можно производить дальнейшие операции, не изменяя исходные объекты.

20 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 95 172 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир