Где я должен поместить глобальные методы и переменные в приложение для Android? - PullRequest
3 голосов
/ 01 декабря 2010

Когда я пишу метод или использую переменную-член, я часто нахожу, что мне нужно поделиться ими в приложении.Но куда они должны идти?

Я могу создать подкласс Activity, но это падает, как только я использую MapView и вынужден использовать MapActivity, поэтому не все мои действия наследуются от моего подкласса.Есть ли способ обойти это?

Там, где наследование не применимо, я склонен помещать универсальные методы и переменные-члены в подкласс объекта Application, но я нахожу, что это создает беспорядок кода каккаждый класс должен либо получить доступ к объекту приложения через контекст, либо я должен передать его.

Я подозреваю, что было бы лучше создать MyApplication.getInstance () и хранить все в одном месте, вместо этогопередачи объекта приложения через классы приложения.но прежде чем я хотел посмотреть, что вы, ребята, должны были сказать.

Ответы [ 3 ]

5 голосов
/ 01 декабря 2010

Если вы хотите получить доступ к «Глобальному синглтону» вне действия и не хотите пропускать Context через все задействованные объекты для получения синглтона, вы можете просто определить, как вы описали, статический атрибут в вашем классе приложения, который содержит ссылку на себя. Просто инициализируйте атрибут в методе onCreate().

Например:

public class ApplicationController extends Application {
    private static ApplicationController _appCtrl;

    public static ApplicationController getAppCtrl()
    {
         return _appCtrl;
    }
}

Один пример с ресурсами: поскольку подклассы Application также могут получать ресурсы, вы можете обращаться к ним просто, когда определяете статический метод, который возвращает их, например:

public static Resources getAppResources()
{
    return _appCtrl.getResources();
}
2 голосов
/ 01 декабря 2010

Для глобальных методов используйте статический класс Util со статическими методами.Если вы не можете использовать статические методы, то методы не должны быть глобальными, и поместить их в класс, который имеет смысл.

0 голосов
/ 01 декабря 2010

Сначала прочитайте это:

Как объявить глобальные переменные в Android?

Теперь, почему вы не должны использовать статический синглтон. Использование синглтона - то же самое, что глобальная переменная. Глобальные переменные уменьшают вашу удобство обслуживания, потому что везде, где вы используете глобальную переменную, вы нарушаете модульность или вводите глобальные детали и предположения о вашем общем проекте. Ваша программа не может иметь две из этих переменных, потому что она ищет только в одном месте. Это означает, что ваша программа не может легко адаптироваться, когда у вас есть два экземпляра вместо одного.

Например, скажем, у меня есть метод playTurn (), и я реализую его так:

public void playTurn() {
   globalPlayer.incrementClock();
   globalPlayer.doSomething();
   globalPlayer.doSomethingElse();
}

Теперь, допустим, я хочу добавить второго игрока в микс. Ох, мой метод playTurn () предполагает использование одного игрока только тогда, когда он использует globalPlayer. Если я хочу добавить второго игрока в программу, я должен изменить этот метод. Делайте это много, и ваша программа очень жесткая и негибкая для изменения. Вместо этого, что если бы я сделал это:

public void playTurn(Player player) {
   player.incrementClock();
   player.doSomething();
   player.doSomethingElse();
}

Теперь можно сделать это:

playTurn( player1 );
playTurn( player2 );

Я могу повторно использовать playTurn () для player1 и player2, и мне не пришлось его менять. Мне просто пришлось сменить клиента этого метода.

Большую часть времени вы ленивы и хотите получить ссылку на некоторый объект, а глобальные переменные - это быстрый способ получить ссылки на хорошо известные объекты. Вместо этого лучше иметь один класс, который разрешает зависимости между приложением при запуске или в тот момент, когда это имеет смысл. Тогда только это одно место понимает, как ваш код составлен. Например,

public class Game {
   Player player1;
   Player player2;
   Board board;

   public void startGame() {
      BlueTooth blueTooth = BlueTooth.getChannel();

      player1 = new LocalPlayer();
      player2 = new NetworkedPlayer( blueTooth );

      board = new Board();

      player1.setOpponent( player2 );
      player1.setBoard( board );
      player2.setOpponent( player1 );
      player2.setBoard( board );
  }
}

Теперь у каждого есть свои зависимости, и им не нужно использовать статические переменные для поиска ссылок на вещи. Кроме того, player1 не должен знать о таких деталях, как, например, player2 находится в сети, или что он не связан с игрой. Важно отметить, что эти объекты, которые мы подключаем, имеют долгую жизнь, возможно, всю программу, но если им нужно создавать другие вещи во время выполнения, это нормально для них.

Скажем, например, нам нужно создать несколько игроков во время выполнения, основываясь на том, кто присоединяется к игре. Ну, мы могли бы создать PlayerManager, который мы можем создать при запуске, а затем создавать объекты Player на лету. PlayerManager - это простой старый объект, который мы создаем в Game при запуске новой игры.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...