Страница 1 из 1

Помогите понять код

Добавлено: 21 апр 2013, 23:15
Siemenstim
Добрый день.
Есть такой код:

Код: Выделить всё

public static final List<String> COLORS = Arrays.asList(new String[] { "red", "orange", "yellow", "green", "blue", "azure", "viollet", "grey", "white", "black" });
private static final List<String> FIRST_SET = Arrays.asList(new String[] {"black", "blue", "green", "yellow" });
private List<String> mColors;

private void initColors() {
		ArrayList localArrayList = new ArrayList(COLORS);
		localArrayList.removeAll(FIRST_SET);
		this.mColors = new ArrayList();
		this.mColors.addAll(FIRST_SET);
		this.mColors.addAll(localArrayList);
	}
Почему сразу не написать this.mColors = new ArrayList(COLORS); , а нужно 5 строчек текста, если в конце-концов в mColors окажутся все данные из COLORS, а localArrayList - больше нигде не используется?

Re: Помогите понять код

Добавлено: 21 апр 2013, 23:19
Foenix
отформатируйте, а то мы тоже не понимаем

Re: Помогите понять код

Добавлено: 21 апр 2013, 23:23
Siemenstim
Как отформатировать?

Re: Помогите понять код

Добавлено: 21 апр 2013, 23:25
Foenix
в редакторе есть кнопочки разные.

Re: Помогите понять код

Добавлено: 22 апр 2013, 01:06
KamiSempai
Похоже на индийский код :)

Re: Помогите понять код

Добавлено: 22 апр 2013, 06:41
Tamachi
По-моему это код из примера, демонстрирующий, как правильно работать со списками строк.
Вначале показано как можно создать константный массив строк.
Затем приведен пример того, как можно его использовать в коде.

COLORS и FIRST_SET -- это константы класса
mColors -- переменные класса.

initColors() -- метод класса.

Если предположить, что mColors -- это цвета, используемые для раскраски пользовательнского интерфейса,
то такой подход позволяет менять раскраску приложения, изменив только первые две строчки.
Очень грамотный подход, позволяющий избавить разработчика от ползанья по коду всякий раз когда надо перекрасить интерфейс.

Пусть цвета хранятся в одном месте, а код, раскрашивающий приложение -- в другом.

Re: Помогите понять код

Добавлено: 22 апр 2013, 12:43
Siemenstim
Это часть кода программы, где из COLORS рандомно выбирается 4 цвета, на экран выводится 4 квадрата с соответствующими цветами. FIRST_SET - уже выбранные цвета при загрузке программы.
Вопрос остается в силе: Зачем создавать localArrayList и играться с ним, если сразу можно сделать так: this.mColors = new ArrayList(COLORS)?

Re: Помогите понять код

Добавлено: 22 апр 2013, 21:27
Tamachi
Siemenstim писал(а):Это часть кода программы, где из COLORS рандомно выбирается 4 цвета, на экран выводится 4 квадрата с соответствующими цветами. FIRST_SET - уже выбранные цвета при загрузке программы.
Вопрос остается в силе: Зачем создавать localArrayList и играться с ним, если сразу можно сделать так: this.mColors = new ArrayList(COLORS)?
На самом деле в методе initColors() происходите следующее:
1. Создается временный массив localArrayList
2. В него заносятся цвета COLORS
3. Затем из него удаляются цвета FIRST_SET
4. Затем в него опять заносятся цвета FIRST_SET
(то есть теперь есть гарантия, что НИ ОДИН из цветов FIRST_SET не повторяется дважды)
5. Затем полученные цвета _добавляются_ (именно добавляются, а не присваиваются) в свойство mColors

Думаю, это просто демонострация.
Но что мешает тебе оформить COLORS и FIRST_SET как параметры метода initColors.
Тогда путем последовательного вызова initColors(...) ты сможешь добавлять/удалять группы цветов.

Re: Помогите понять код

Добавлено: 22 апр 2013, 23:25
Siemenstim
Tamachi писал(а):
На самом деле в методе initColors() происходите следующее:
1. Создается временный массив localArrayList
2. В него заносятся цвета COLORS
3. Затем из него удаляются цвета FIRST_SET
4. Затем в него опять заносятся цвета FIRST_SET
(то есть теперь есть гарантия, что НИ ОДИН из цветов FIRST_SET не повторяется дважды)
5. Затем полученные цвета _добавляются_ (именно добавляются, а не присваиваются) в свойство mColors

Думаю, это просто демонострация.
Но что мешает тебе оформить COLORS и FIRST_SET как параметры метода initColors.
Тогда путем последовательного вызова initColors(...) ты сможешь добавлять/удалять группы цветов.
Это не демонстрация, а кусок реального кода (декомпилировал прогу и изучаю как она работает).
Хочу понять зачем они так сделали, ведь с учетом твоей поправки (п.5) можно весь код метода заменить одной строкой
this.mColors.addAll(COLORS);
ведь п.1-5 делают тоже самое (да еще и с лишним выделением памяти под localArrayList).
Получается мы вызываем метод ради одной строки кода? Зачем его тогда вызывать? Можно было-бы вместо вызова метода initColors() просто написать то, что я предлагаю. Или я чего-то не доучил еще?

p.s. Сильно не ругайся если спрашиваю глупости - я только учусь.

Re: Помогите понять код

Добавлено: 23 апр 2013, 06:13
Tamachi
Siemenstim писал(а):
Tamachi писал(а):
На самом деле в методе initColors() происходите следующее:
1. Создается временный массив localArrayList
2. В него заносятся цвета COLORS
3. Затем из него удаляются цвета FIRST_SET
4. Затем в него опять заносятся цвета FIRST_SET
(то есть теперь есть гарантия, что НИ ОДИН из цветов FIRST_SET не повторяется дважды)
5. Затем полученные цвета _добавляются_ (именно добавляются, а не присваиваются) в свойство mColors

Думаю, это просто демонострация.
Но что мешает тебе оформить COLORS и FIRST_SET как параметры метода initColors.
Тогда путем последовательного вызова initColors(...) ты сможешь добавлять/удалять группы цветов.
Это не демонстрация, а кусок реального кода (декомпилировал прогу и изучаю как она работает).
Хочу понять зачем они так сделали, ведь с учетом твоей поправки (п.5) можно весь код метода заменить одной строкой
this.mColors.addAll(COLORS);
ведь п.1-5 делают тоже самое (да еще и с лишним выделением памяти под localArrayList).
Получается мы вызываем метод ради одной строки кода? Зачем его тогда вызывать? Можно было-бы вместо вызова метода initColors() просто написать то, что я предлагаю. Или я чего-то не доучил еще?

p.s. Сильно не ругайся если спрашиваю глупости - я только учусь.
Лишнего выделения памяти не будет -- комппилятор прочухает и оптимизирует. Да и сборщик мусора есть.

Хорошо (по канонам) написанный код никогда не использует такие ляпы как
"переменная=значение".
Всегда лучше использовать
"setMyValue(myValue)" -- то есть использовать метод.

Прикинь: вдруг тебе в будущем потребуется отловить в коде все места, где изменяется какое-нибудь значение.
Подумай, что легче: пройтись по всему коду и сделать исправления везде где происходит изменение
или же просто подправить метод setMyValue?

Другой пример: вдруг тебе в будущем когда-нибудь захочется связать изменение твоего Value с каким-нибудь действием или событием. Например, при изменении цвета фона, совпадающего с цветом текста выдать предупреждение. Что проще: пройтись по всему коду и везде, где нужно дописать код или же чуть подправить
метод setMyValue?

Когда пишешь проект -- всегда надо оставлять зацепки на случай если "что-нибудь пойдёт не так как планировалось".

Чтобы в дальнейшем тебе было проще поддерживать проект -- всегда оформляй код так, чтобы потом долго не искать в коде место, "где надо поправить". И стремись к тому, чтобы это "поправить" нужно было только в одном-единственном месте.

Есть куча шаблонов проектирования, которые позволяют это сделать.

К сожалению, для андроида шаблоны проектирования ещё не написаны зато есть много шаблонов для Java.
Там твои вопросы более детально обсуждаются.

Re: Помогите понять код

Добавлено: 23 апр 2013, 08:00
Siemenstim
Теперь понял, спасибо!