Как добиться создания иммутабелтных структур? Добрый день,
не могу понять как мне это сделать на этом примере..$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
186 +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 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир