Стандарты кодирования: большое количество аргументов
Эй, я из выпускника колледжа. Я работаю над проектом, который, как я ожидал, в конечном итоге будет поддерживаться кем-то другим. Я продолжаю сталкиваться с раздражающей ситуацией в этом проекте, и это объекты, которым требуются многие частные переменные и, как результат, очень длинные конструкторы.
Помимо имен переменных, нет стандартного кодирования. Мне интересно, как бороться с подобными. Иногда я боюсь, что в будущем я увижу свой собственный код на dailywtf!
Я старался приложить некоторые из этих аргументов в других классах, но в этой ситуации это действительно не имеет смысла.
Является ли это общей не-проблемой или это что-то, что нужно и которое можно легко исправить?
public function __construct($uCode = '', $uName = '', $uTime = '', $uArea = '', $uDomain = '', $uText = '', $uId = '', $uNum = '', $uVideo = 0, $uAudio = 0, $uImage = 0){
Ответы
Ответ 1
Вообще говоря, если у вас более 4 аргументов, вам лучше использовать временный объект или массив. Часто многие параметры, потому что это необязательно, и это может стать довольно неудобным и подверженным ошибкам довольно быстро. Итак:
class MyClass {
public function __construct($options) { ... }
...
}
$o = new MyClass(array(
'uCode' => 'some value',
'uText' => 'another value',
));
Сравните это с:
$o = new MyClass('some value', '', '', '', '', 'another value');
Обратите внимание, что версия массива включает только то, что вы хотите передать.
Ответ 2
Я склоняюсь к решению 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)->...;
Ответ 3
Использовать шаблон строителя.. здесь
http://en.wikipedia.org/wiki/Builder_pattern
Ответ 4
Если у вас слишком много аргументов, это признак того, что ваш метод может делать слишком много. Попробуйте, если вы можете разбить задачу на многие более мелкие задачи и реорганизовать метод. Если это не удается, переход в класс со всеми параметрами должен быть точным.
Ответ 5
Вы можете назначить столько параметров массиву и передать этот массив в свой __construct, чтобы вы могли иметь только один параметр массива.
Ответ 6
вы можете использовать магические методы
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);