Re: merging equal code (exercise in refactoring)
"Stefan Ram" <ram@zedat.fu-berlin.de> wrote in message
news:loop-refactor-20080120162253@ram.dialup.fu-berlin.de...
Eric Sosman <Eric.Sosman@sun.com> writes:
return format(source.toArray(
new java.lang.CharSequence[source.size()]);
A dual solution using Arrays.asList() is also possible.
This answer is better than my own, because it requires
the least amount of work of the programmer.
When a list is copied to an array or an array is copied
to a list, this needs O(n) operations. Therefore, I have
hesitated to use this myself. But a programmer's time
usually is more expensive than a processor's time.
My own solution tries to avoid an additional copy operation.
The code given was like
public static java.lang.CharSequence format
( PARAMETERS )
{ PREPARATION
for( LOOP_CONTROL )LOOP_STATEMENT
COMPLETION }
The ?LOOP_CONTROL? varied with ?PARAMETERS?, while
?PREPARATION?, ?LOOP_STATEMENT? and ?COMPLETION?
did not change.
When something varies with a parameter, the usual
solution is to make this a parameter, too.
But in Java, the LOOP_CONTROL of a for(:) statement
can not be used as a parameter (it would have to be
something like ?quoted code?).
So one has to invert the usual procedure and to make
everything else /except/ the loop control the ?parameter?.
This can be done by creating an object for the
PREPARATION, LOOP_STATEMENT and COMPLETION.
One can also abuse Collection API:
import java.util.*;
class Util {
private static class Formatter extends HashSet<CharSequence> {
StringBuilder result = new StringBuilder();
{
result.append( "Listing:\n" );
result.append( "[ " );
}
public boolean add(CharSequence component) {
result.append(component);
result.append("\n ");
return true;
}
CharSequence toCharSequence() {
if(result.charAt(result.length() - 2) != '[')
result.delete(result.length() - 3, result.length());
result.append(" ]");
return result;
}
}
public static <T extends CharSequence> CharSequence format(final T[]
source ) {
return new Formatter() {{ Collections.addAll(this,
source); }}.toCharSequence();
}
public static <T extends CharSequence> CharSequence format(final List<T>
source) {
return new Formatter() {{ addAll(source); }}.toCharSequence();
}
}
PL