Как предотвратить передачу параметра из одной функции в другую - PullRequest
0 голосов
/ 27 августа 2009

Пример:

Class A {
     public function __construct() {
         $this->b_Instance = new B();
     }
     public caller() {
         $this->b_Instance->call_me($param1,$param2,$param3);
     }
}

Class B {
     public function __construct() {
         //lots of variables here
     }

     public function call_me($param1,$param2,$param3) {
         ...
         //do something with param1, but nothing with param2 and 3. just pass it.
         $this->do_something($param2,$param3);
     }

     private function do_something($param2,$param3) {
         ...
         //do something with param2 and 3
     }

     //lots of other functions here
}

Обычно я бы добавил его в конструктор B как переменную класса, однако конструктор уже заполнен множеством переменных, а параметры, передаваемые A-> caller (), используются только B-> call_me и B-> do_something в любом случае.

Каков элегантный способ предотвратить эту дополнительную передачу параметров из B-> call_me в B-> do_something? Или это даже проблема, и у меня просто ОКР?

Дополнительно: обратите внимание, что B-> call_me ничего не делает с param2 и 3, а только передает его B-> do_something, который является частной функцией.

Ответы [ 2 ]

0 голосов
/ 27 августа 2009

Другим решением будет использование объекта для инкапсуляции этих параметров (возможно, они связаны и выиграют от объединения затем в объект), поэтому у вас будет:

$this->call_me(new SomeObject($param1,$param2,$param3));

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

0 голосов
/ 27 августа 2009

Если эти переменные являются параметрами, относящимися только к call_me и do_something, они должны быть переданы как параметры ^^

Что я имею в виду:

  • они не должны храниться как переменные класса
  • они, очевидно, не будут такими глобальными / сессионными / другими.


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


Может быть, один вопрос будет: ваши методы не делают "слишком много вещей"?

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

...