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

Ответить
Siemenstim
Сообщения: 9
Зарегистрирован: 16 апр 2013, 14:04

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

Сообщение Siemenstim » 21 апр 2013, 23:15

Добрый день.
Есть такой код:

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

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 - больше нигде не используется?
Последний раз редактировалось Siemenstim 21 апр 2013, 23:27, всего редактировалось 1 раз.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 21 апр 2013, 23:19

отформатируйте, а то мы тоже не понимаем
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Siemenstim
Сообщения: 9
Зарегистрирован: 16 апр 2013, 14:04

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

Сообщение Siemenstim » 21 апр 2013, 23:23

Как отформатировать?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 21 апр 2013, 23:25

в редакторе есть кнопочки разные.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

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

Сообщение KamiSempai » 22 апр 2013, 01:06

Похоже на индийский код :)
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Tamachi
Сообщения: 203
Зарегистрирован: 17 апр 2013, 00:08

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

Сообщение Tamachi » 22 апр 2013, 06:41

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

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

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

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

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

Siemenstim
Сообщения: 9
Зарегистрирован: 16 апр 2013, 14:04

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

Сообщение Siemenstim » 22 апр 2013, 12:43

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

Tamachi
Сообщения: 203
Зарегистрирован: 17 апр 2013, 00:08

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

Сообщение Tamachi » 22 апр 2013, 21:27

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(...) ты сможешь добавлять/удалять группы цветов.

Siemenstim
Сообщения: 9
Зарегистрирован: 16 апр 2013, 14:04

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

Сообщение Siemenstim » 22 апр 2013, 23:25

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. Сильно не ругайся если спрашиваю глупости - я только учусь.

Tamachi
Сообщения: 203
Зарегистрирован: 17 апр 2013, 00:08

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

Сообщение Tamachi » 23 апр 2013, 06:13

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.
Там твои вопросы более детально обсуждаются.

Siemenstim
Сообщения: 9
Зарегистрирован: 16 апр 2013, 14:04

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

Сообщение Siemenstim » 23 апр 2013, 08:00

Теперь понял, спасибо!

Ответить