В чем преимущество некоторых констант, определенных в классе Menu? - PullRequest
0 голосов
/ 05 августа 2011

Я изучаю учебник «Блокнот»: http://developer.android.com/resources/tutorials/notepad/notepad-ex1.html

Я заметил, что код, который они предоставляют для добавления пункта меню,

  menu.add(0, INSERT_ID, 0, R.string.menu_insert);

INSERT_ID ранее определен как Menu.FIRST,Когда я смотрю на эту константу в классе, это int, установленный в 1. Определено, что есть также Menu.NONE, который является int, установленным в 0.

Это заставляет меня задуматься о двух вещах:

  • Какая польза от определения Menu.FIRST как 1 и Menu.NONE как 0?Почему бы просто не указать 1 и 0 во время вызовов функций? Тем более что ...
  • По сути, это то, что они сделали в этом вызове функции, предоставив 0. Почему бы не использовать Menu.NONE там, так как онипошли на проблему обеспечения другой константы, содержащейся в локальной переменной?

Из ссылки я обнаружил, что

android.view.Menu.add(int groupId, int itemId, int order, int titleRes)

где:

groupID : идентификатор группы, частью которой должен быть этот элемент.Это также можно использовать для определения групп элементов для изменения состояния партии. Обычно используется NONE, если элемент не должен быть в группе.

itemID : уникальный идентификатор элемента. Используйте NONE, если вам не нужен уникальный идентификатор.

order : Заказ для элемента. Используйте NONE, если вам не важен порядок. См. GetOrder ().

titleRes : идентификатор ресурса строки заголовка.[не важно для этого вопроса]

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

1 Ответ

0 голосов
/ 05 августа 2011

Как правило, использование констант имеет несколько преимуществ по сравнению с литералами жесткого кодирования.Логически названные константы могут улучшить читаемость вашего кода.В данном конкретном случае это не очень помогает, но

menu.add(Menu.NONE, INSERT_ID, Menu.NONE, R.string.menu_insert);

все же немного более читабельно, чем

menu.add(0, 1, 0, R.string.menu_insert);

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

В данном конкретном случае это выглядит как случай небрежного кодирования.Код несовместим с использованием констант.

...