diff -r 000000000000 -r 4553c2885ce6 samples/sidemeanings/src/org/apidesign/sidemeanings/math/Arithmetica.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/sidemeanings/src/org/apidesign/sidemeanings/math/Arithmetica.java Fri Mar 27 20:30:39 2009 +0100 @@ -0,0 +1,94 @@ +package org.apidesign.sidemeanings.math; + +/** Rewrite of original + * + * Arithmetica + * class from the composition project + * to follow the eliminate fuzzy modifiers rule. + * + * @author Jaroslav Tulach + * @version 5.0 + */ +// BEGIN: design.sidemeanings.arith +public abstract class Arithmetica { + // BEGIN: design.sidemeanings.arith.sumTwo + public final int sumTwo(int one, int second) { + return overridableSumTwo(one, second); + } + protected abstract int overridableSumTwo(int one, int second); + protected final int defaultSumTwo(int one, int second) { + return one + second; + } + // END: design.sidemeanings.arith.sumTwo + + public final int sumAll(int... numbers) { + return overridableSumAll(numbers); + } + protected abstract int overridableSumAll(int... numbers); + protected final int defaultSumAll(int... numbers) { + if (numbers.length == 0) { + return 0; + } + int sum = numbers[0]; + for (int i = 1; i < numbers.length; i++) { + // do I want to call sumTwo or defaultSumTwo? That is a question! + sum = openUpToSubclasses() ? + sumTwo(sum, numbers[i]) : + defaultSumTwo(sum, numbers[i]); + } + return sum; + } + + public final int sumRange(int from, int to) { + return overridableSumRange(from, to); + } + protected abstract int overridableSumRange(int from, int to); + protected final int defaultSumRange(int from, int to) { + int len = to - from; + if (len < 0) { + len = -len; + from = to; + } + int[] array = new int[len + 1]; + for (int i = 0; i <= len; i++) { + array[i] = from + i; + } + // BEGIN: design.sidemeanings.arith.the.question + // Again, an API author has to ask what sumAll one wants to call? + // Am I about to open up to subclasses or do I want default impl? + return openUpToSubclasses() ? + sumAll(array) : + defaultSumAll(array); + // END: design.sidemeanings.arith.the.question + } + + boolean openUpToSubclasses = true; + boolean openUpToSubclasses() { + return openUpToSubclasses; + } + + + // BEGIN: design.sidemeanings.arith.factory + public static Arithmetica create() { + return new Arithmetica.Impl(); + } + private static class Impl extends Arithmetica { + @Override + protected int overridableSumTwo(int one, int second) { + return defaultSumTwo(one, second); + } + + @Override + protected int overridableSumAll(int... numbers) { + return defaultSumAll(numbers); + } + + @Override + protected int overridableSumRange(int from, int to) { + return defaultSumRange(from, to); + } + } + // END: design.sidemeanings.arith.factory + +} +// END: design.sidemeanings.arith