Чрезвычайно повторяющийся код — это, как правило, плохо, и существуют шаблоны проектирования, которые могут помочь свести это к минимуму. Однако иногда это просто неизбежно из-за ограничений самого языка. Возьмите следующий пример из java.util.Arrays:
/**
* Assigns the specified long value to each element of the specified
* range of the specified array of longs. The range to be filled
* extends from index fromIndex, inclusive, to index
* toIndex, exclusive. (If fromIndex==toIndex, the
* range to be filled is empty.)
*
* @param a the array to be filled
* @param fromIndex the index of the first element (inclusive) to be
* filled with the specified value
* @param toIndex the index of the last element (exclusive) to be
* filled with the specified value
* @param val the value to be stored in all elements of the array
* @throws IllegalArgumentException if fromIndex > toIndex
* @throws ArrayIndexOutOfBoundsException if fromIndex < 0 or
* toIndex > a.length
*/
public static void fill(long[] a, int fromIndex, int toIndex, long val) {
rangeCheck(a.length, fromIndex, toIndex);
for (int i = fromIndex; i>> 1; // the fix
Приведенная выше строка встречается в исходном коде 11 раз!
Итак, мои вопросы:
Как на практике обрабатываются повторяющиеся Java-коды/документация? Как они разрабатываются, поддерживаются и тестируются?
Вы начинаете с «оригинала» и делаете его как можно более зрелым, а затем копируете и вставляете по мере необходимости и надеетесь ты не ошибся?
А если ты ошибся в оригинале, то просто исправь везде, если только тебе не удобно удалять копии и повторять всю репликацию процесс?
И вы применяете тот же процесс для кода тестирования также?
Выиграет ли Java от какой-то ограниченной предварительной обработки исходного кода для такого рода вещей?
Возможно, у Sun есть собственный препроцессор помочь писать, поддерживать, документировать и тестировать такой повторяющийся библиотечный код?
В комментарии требовался еще один пример, поэтому я извлек его из Google. Коллекции: com.google.common.base.Predicates, строки 276–310 (
Чрезвычайно повторяющийся код — это, как правило, плохо, и существуют шаблоны проектирования, которые могут помочь свести это к минимуму. Однако иногда это просто неизбежно из-за ограничений самого языка. Возьмите следующий пример из java.util.Arrays: [code]/** * Assigns the specified long value to each element of the specified * range of the specified array of longs. The range to be filled * extends from index fromIndex, inclusive, to index * toIndex, exclusive. (If fromIndex==toIndex, the * range to be filled is empty.) * * @param a the array to be filled * @param fromIndex the index of the first element (inclusive) to be * filled with the specified value * @param toIndex the index of the last element (exclusive) to be * filled with the specified value * @param val the value to be stored in all elements of the array * @throws IllegalArgumentException if fromIndex > toIndex * @throws ArrayIndexOutOfBoundsException if fromIndex < 0 or * toIndex > a.length */ public static void fill(long[] a, int fromIndex, int toIndex, long val) { rangeCheck(a.length, fromIndex, toIndex); for (int i = fromIndex; i>> 1; // the fix [/code] Приведенная выше строка [b]встречается в исходном коде 11 раз[/b]! Итак, мои вопросы:[list] [*]Как на практике обрабатываются повторяющиеся Java-коды/документация? Как они разрабатываются, поддерживаются и тестируются?
Вы начинаете с «оригинала» и делаете его как можно более зрелым, а затем копируете и вставляете по мере необходимости и надеетесь ты не ошибся? [*]А если ты ошибся в оригинале, то просто исправь везде, если только тебе не удобно удалять копии и повторять всю репликацию процесс? [*]И вы применяете тот же процесс для кода тестирования также? [*]Выиграет ли Java от какой-то ограниченной предварительной обработки исходного кода для такого рода вещей? [*]Возможно, у Sun есть собственный препроцессор помочь писать, поддерживать, документировать и тестировать такой повторяющийся библиотечный код? [/list]
В комментарии требовался еще один пример, поэтому я извлек его из Google. Коллекции: com.google.common.base.Predicates, строки 276–310 ([code]AndPredicate[/code]) против строк 312–346 ([code]OrPredicate[/code]). Исходный код этих двух классов идентичен, за исключением: [list] [*][code]AndPredicate[/code] vs OrPredicate (каждый встречается в своем классе пять раз) [*][code]"And("[/code] vs Or(" (в соответствующих методах toString()) [*][code]#and[/code] против #or (в комментариях @see Javadoc) [*][code]true[/code] vs false (при применении; ! можно переписать из выражения) [*][code]-1 /* all bits on */[/code] vs 0 /* все биты отключены */ в hashCode() [*][code]&=[/code] против |= в hashCode() [/list]