Как добиться создания иммутабелтных структур? Добрый день, не могу понять как мне это сделать на этом примере..$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 Спасибо Всем за помощь!
Для создания иммутабельных структур вам нужно обеспечить неизменяемость объектов в процессе работы с ними. В данном случае, кажется, что проблема заключается в том, что методы 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
Теперь каждый метод возвращает новый объект, на основе которого можно производить дальнейшие операции, не изменяя исходные объекты.
Для создания иммутабельных структур вам нужно обеспечить неизменяемость объектов в процессе работы с ними. В данном случае, кажется, что проблема заключается в том, что методы 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
Теперь каждый метод возвращает новый объект, на основе которого можно производить дальнейшие операции, не изменяя исходные объекты.