Стандарты кодирования: большое количество аргументов

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

Помимо имен переменных, нет стандартного кодирования. Мне интересно, как бороться с подобными. Иногда я боюсь, что в будущем я увижу свой собственный код на 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)->...;

Ответ 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);