Хорошо или плохо - используйте конструктор для инициализации модели из удаленного веб-сервиса - PullRequest
6 голосов
/ 26 июня 2011

Я хотел бы знать, хорошо это или плохо инициализировать мою модель по запросу к веб-сервисам, или лучше использовать другой открытый метод, вызываемый после конструктора

Например:

class Model {
    ModelData data;

    Model(Integer model_id) {
       data = Request.getDataFromWebServices(model_id);
    }
}

Ответы [ 6 ]

5 голосов
/ 26 июня 2011

Обычно рекомендуется использовать в качестве параметров аргумента конструктора обязательные для того, чтобы класс был функциональным (вместо использования сеттеров).
Так что в вашем случае, если model_id является обязательным для Model, это правильно, у вас это есть.
Теперь вы используете model_id для удаленного вызова метода.
Для выполнения удаленных вызовов методов может потребоваться больше времени, поэтому Model требуется больше времени для инициализации и может произойти сбой, например. по сетевым причинам.
Если API покрывает какое-либо исключение, исходящее либо от сетевого уровня, либо от фактической обработки и возвращающее хорошее значение для инициализации Model, то ИМХО, все должно быть в порядке.
Просто задокументируйте класс как занимающий больше времени для инициализации из-за доступа к сети

4 голосов
/ 26 июня 2011

Проблема не в использовании в конструкторе или где-либо еще, проблема в использовании глобальной переменной. Было бы намного лучше передать request экземпляром, чтобы показать зависимость в API модели:

class Model {
  final ModelData data;

  Model(Request request, int model_id) {
    data = request.getDataFromWebServices(model_id);
  }
}

или создайте более описательный фабричный метод:

class Model {
  static Model createModelFromWebServices(Request request, int model_id) {
    return new Model(request.getDataFromWebServices(model_id));
  }

  final ModelData data;

  Model(ModelData data) {
    this.data = data;
  }
}

Я использовал примитив int вместо Integer, потому что хотел показать, что null не является допустимым значением для model_id.

1 голос
/ 26 июня 2011

Похоже, это сильно зависит от ваших индивидуальных обстоятельств.

Лично я, вероятно, сделал бы конструктор частным и выставил бы открытый статический метод, называемый чем-то вроде "CreateModelFromService", чтобы всем, кто использует мой класс, было ясно, что существует большая вероятность, что метод может не сработать из-за такие вещи, как подключение к сети и т. д. Обычно я не ожидал бы такой ошибки при создании , казалось бы, не связанного с сетью класса.

Только мои $ 0,02

0 голосов
/ 26 июня 2011

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

Возможно, стоит рассмотреть фабрику для создания экземпляров модели, используя вместо этого веб-сервис. Это отделяет вашу модель от конкретного механизма сборки:

class Model {
    Model(ModelData data) { ... }
}

class ModelFactory {
    private Request request;

    Model create(Integer modelId) { 
        return new Model(request.getDataFromWebServices(modelId));
    }    
}
0 голосов
/ 26 июня 2011

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

0 голосов
/ 26 июня 2011

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

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