Какой подход лучше при передаче настроек объекту? - PullRequest
1 голос
/ 28 сентября 2011

Я хочу установить начальные значения полей в объекте, используя $ config.Какой подход лучше с точки зрения более чистого и более обслуживаемого кода?Также я хотел бы добавить, что объект будет инициализирован на фабрике, а не напрямую клиентом.

1.Я передаю $ config объекту

<?php
class UserGreeting {
  private $config;
  public function __construct($config){
      $this->config=$config;
  }

  public function greetings(){
    echo 'Hello, '.$this->config->get('username');
  }
}
?>

Плюсы:

  • Простота передачи нескольких параметров

Минусы:

  • Класс связан с $ config (верно?).Я имею в виду, что кроме определенных соглашений об именовании интерфейса и конфигурации $ config, я не могу просто подключить этот класс к другой программе, не вводя $ config
  • В коде клиента не обязательно знать, какие параметры используются
    объект, но это более общая мысль

2.Я устанавливаю поля вне объекта

<?php
class UserGreetingFactory{
   public function __construct($config){
     $this->config=$config;
   }
   public function getUserGreeting(){
     $userGreeting=new UserGreeting();
     $userGreeting->setUserName='John Doe';
     return $userGreeing;
   }
} 

class UserGreeting {
   private userName;
   public function setUserName($userName){
     $this->userName=$userName;
   }
   public function greetings(){
     echo "Hello, {$this->userName}";
   }
  }
?>

Плюсы:

  • Классу все равно, откуда берутся его параметры

  • Можно легко использовать повторно

  • Легче тестировать (правда?).Я имею в виду, что мне не нужно иметь дело с настройкой $ config

Минусы:

  • Factory \ Builder должен знать, какие параметры нужноpass

  • Множество дополнительного кода для установщиков и параметров передачи

Ответы [ 4 ]

1 голос
/ 28 сентября 2011

Первый раствор с впрыском ctor.Но вместо специальной конфигурации я бы просто передавал реальные объекты.В вашем случае объект User.

<?php
class UserGreeting
{
    private $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function greet()
    {
        printf('Hello, %s!',  $this->user->getName());
    }
}
0 голосов
/ 28 сентября 2011

Первый способ лучше из-за внедрения зависимости. Этот код будет легче тестировать и поддерживать. Третий способ - использовать шаблон Visitor для внедрения зависимостей.

0 голосов
/ 28 сентября 2011

Вы можете использовать статический класс со статическими методами. По сути они похожи на CONSTS, но вы можете применять все виды правил в классе статической конфигурации - например, чтобы они соответствовали интерфейсу.

Config::getUserName();

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

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

0 голосов
/ 28 сентября 2011

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

С точки зрения ООП, вы не должны помещать это в одну переменную. У объекта есть свойства. Имя пользователя на самом деле является свойством, поэтому вы должны использовать его как свойство. Это означает, что в классах PHP вам нужно сделать его общедоступной переменной и установить переменные при создании объекта.

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