
Почему важно разделять логику и мутации состояния в коде
Одна из самых частых архитектурных ошибок — функции, которые одновременно считают результат и изменяют состояние системы.
Например:
function calculateTotalPrice(Order $order): float
{
$total = 0;
foreach ($order->items as $item) {
$total += $item->price * $item->qty;
}
$order->total = $total;
$order->save();
return $total;
}
Здесь функция:
- считает цену
- меняет состояние объекта
- пишет в базу
Это усложняет тестирование, повторное использование и делает код менее предсказуемым.
Лучше — разделить чистую логику и мутации
function calculateTotalPrice(array $items): float
{
$total = 0;
foreach ($items as $item) {
$total += $item->price * $item->qty;
}
return $total;
}
Мутация состояния:
$total = calculateTotalPrice($order->items);
$order->total = $total;
$order->save();
Теперь код:
- проще тестировать
- проще переиспользовать
- легче читать
- меньше скрытых побочных эффектов
Если функция что-то сохраняет, отправляет или пишет — это mutation.
Если читает данные и возвращает результат — это pure logic.
Разделяйте их — и архитектура станет заметно чище.