Кодирование стандартов: Большая сумма аргументов

У меня та же проблема, и, как говорит piquadrat, это досадная ошибка, связанная с поддержкой локализации. Изменение USE_L10N = True на False решает эту проблему, предполагается, что это исправлено в Django 1.3.

14
задан cletus 1 June 2009 в 23:38
поделиться

6 ответов

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

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

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

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

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

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

16
ответ дан 1 December 2019 в 09:33
поделиться

Я склоняюсь к решению 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)->...;
7
ответ дан 1 December 2019 в 09:33
поделиться

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

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

5
ответ дан 1 December 2019 в 09:33
поделиться

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

0
ответ дан 1 December 2019 в 09:33
поделиться

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

0
ответ дан 1 December 2019 в 09:33
поделиться

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

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
ответ дан 1 December 2019 в 09:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: