Стандарты кодирования: большое количество аргументов - PullRequest
14 голосов
/ 29 мая 2009

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

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

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

Это вообще не проблема или это то, что должно и легко исправимо?

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

Ответы [ 6 ]

16 голосов
/ 29 мая 2009

Вообще говоря, если у вас более 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 голосов
/ 29 мая 2009

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

например, если требуются $ uCode и $ uName, а остальные необязательны ...

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

Иногда бывает полезно, чтобы ваши установщики возвращали $ this, чтобы вы могли объединять команды, например так:

$object = new MyObject($code, $name);
$object->setUTime($time)->setUArea($area)->...;
5 голосов
/ 29 мая 2009

Использовать шаблон строителя .. здесь

http://en.wikipedia.org/wiki/Builder_pattern

0 голосов
/ 02 июня 2009

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

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);
0 голосов
/ 29 мая 2009

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

0 голосов
/ 29 мая 2009

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

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