Я вижу этот паттерн повсюду в своем коде и в библиотеках, но, кажется, нигде не могу найти его имени или абстракции.
Пример (псевдокод)
T foo( T x, void f(T&) )
{
T y = x;
f( y );
return y;
}
В основном: возьмите значение и функцию, которая преобразует это значение. Сделайте копию значения, преобразуйте его и верните.
Примеры из жизни (C++)
T operator+(const T& x, const T& y)
{
T z = x; // Make a copy
operator+=(z, y); // Modify in place
return z;
}
Vector3 Vector3::normalized() const
{
Vector3 x = *this; // Make a copy
x.normalize(); // Modify in place
return x;
}
T sorted(T const& x)
{
T y = x; // Make a copy (yeah, yeah, could have passed by value)
sort( y ); // Modify in place
return y;
}
По сути, у вас есть встроенная функция (с побочными эффектами) и вы делаете из нее неуместную функцию (без побочных эффектов).
Есть ли название у этого узора? Знаете ли вы какие-либо библиотеки или языки, которые его используют? Очевидно, что функциональные языки не будут его использовать, потому что у них изначально нет ссылочно-непрозрачных функций.
f
является алгоритмом in-situ, то естьf(x)
мутируетx
-- он ничего не возвращает. - person Peter Alexander   schedule 16.11.2010