xxxInPlace or xxxCopy?
Jonathan M Davis
jmdavisProg at gmx.com
Wed Jan 19 19:11:28 PST 2011
On Wednesday 19 January 2011 18:36:55 so wrote:
> > And honestly, from the standpoint of code simplicity and
> > understandability,
> > there's a lot to be said for making copies being the default rather than
> > mutation. You can then use the InPlace versions if you need the boost in
> > efficiency.
> >
> > - Jonathan M Davis
>
> Isn't simplicity and understandability favors the in-place style on these
> type of algorithms?
> As Jesse Phillips said, it is same as sort.
No. I'd argue that it's clearer to see stuff like
auto newStr = replace(str, "hello", "world");
auto sorted = sort(newStr);
than to see stuff like
replace(str, "hello", "world");
sort(newStr);
If you have
replace(str, "hello", "world");
you don't know whether it's changed the value in place or if you're throwing
away a return value. However, if you have
auto newStr = replace(str, "hello", "world");
replaceInPlace(newStr, "world", "hello");
it's quite clear that the first one returns a value and the the second one does
it in place. Whereas if you have
auto newStr = replaceCopy(str, "hello", "world");
replace(newStr, "world", "hello");
the first one is clear, but the second one is only clear because seeing the first
one makes it obvious that the second one must be doing something different. And
even then, I'd argue that the name replaceCopy is more ambiguous than
replaceInPlace. I think that it's far more likely that a function xCopy is going
to have possible alternate meanings that xInPlace would, since not only is copy
both a verb and a noun, but it can be used in a lot more situations, whereas
InPlace is pretty limited and thus clear. Not to mention, if a function says
copy, that implies that it might actually be _copying_ rather than slicing,
which many xCopy functions would actually be doing rather than actually copying.
So, using Copy in the name is actual ambiguous _regardless_ of what the first
part of the function name is.
In functional languages, it's _required_ that a function return the changed
value instead of changing the one passed in. You're far less likely to
accidentally mutate stuff if you program that way, even if you're not dealing
with immutable or const values. I think that code is much cleaner if you program
in a functional style. The problem is, of course, that you can't constantly be
copying everything all the time, because there's a definite performance hit for
doing that. So, you have functions which make changes in place when you need to
do that.
So, I'd argue that it's generally better to program using a functional style if
you can and then use mutation if necessary for performance. x and xInPlace
support that while xCopy and x do not.
However, I think that the biggest argument in favor of using x and xInPlace is
that strings are by far the most used type of array, and they _need_ to use the
version which makes a copy or slices the array. So, if the x / xInPlace naming
scheme would result in x being used more than xInPlace, whereas xCopy / x would
result in xCopy being used the most. And I really think that the shorter version
should be the one which is going to be used the most. Not to mention, that's the
way that the string functions have been done thus far, so sticking to x /
xInPlace will break less code.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list