2009-05-28 2 views
14

Эй, я из выпускника колледжа. Я работаю над проектом, который, как я ожидал, в конечном итоге будет поддерживаться кем-то другим. Я продолжаю сталкиваться с раздражающей ситуацией в этом проекте, и это объекты, для которых требуется множество частных переменных и, как результат, очень длинные конструкторы.Стандарты кодирования: большое количество аргументов

Помимо переменных имен, нет стандартного кодирования. Мне интересно, как бороться с подобными. Иногда я боюсь, что в будущем я увижу некоторые из своих собственных кодов в dailywtf!

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

Является ли это общей проблемой, не связанной с проблемой, или это то, что должно и легко можно исправить?

public function __construct($uCode = '', $uName = '', $uTime = '', $uArea = '', $uDomain = '', $uText = '', $uId = '', $uNum = '', $uVideo = 0, $uAudio = 0, $uImage = 0){ 
+0

+1 для озвучивания Вашего беспокойства – talonx

+0

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

ответ

16

Вообще говоря, если у вас более 4 аргументов, вам лучше использовать временный объект или массив. Часто многие параметры, потому что это необязательно, и это может стать довольно неудобным и подверженным ошибкам довольно быстро. Итак:

class MyClass { 
    public function __construct($options) { ... } 
... 
} 

$o = new MyClass(array(
    'uCode' => 'some value', 
    'uText' => 'another value', 
)); 

Сравните это:

$o = new MyClass('some value', '', '', '', '', 'another value'); 

Обратите внимание, как версия массив включает в себя только то, что вы хотите передать.

7

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

например, если $ UCODE и $ uName необходимы, но остальные являются необязательными ...

public function __construct($uCode = '', $uName = '') {} 
public function setUTime($uTime) {} 
public function setUArea($uArea) {} 
... 

Это иногда может быть полезно, чтобы ваши сеттеры вернуть $ это, так что вы можете команды цепи, как так что:

$object = new MyObject($code, $name); 
$object->setUTime($time)->setUArea($area)->...; 
+0

+1, это часто, как я это делаю –

+0

+1, мне тоже нравится – Galen

0

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

0

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

0

вы можете использовать магические методы

class abc { 

    private $allowed = array(
     'uCode', 
     'uId' 
    ); 

    public function __set($name, $value) { 
     if (in_array($name, $this->allowed)) { 
      $this->$name = $value; 
     } 
    } 

    public function __call($name, $args) { 
     if (substr($name, 0, 4) == "set_") { 
      $var = substr($name, 4); 
      if (in_array($var, $this->allowed)) { 
       $this->$var = $args[0]; 
      } 
     } 
    } 

} 

$abc = abc(); 
$abc->uCode = 123; 
$abc->set_uId(123); 
Смежные вопросы