избегая длинных констант класса в качестве параметров - PHP - PullRequest
0 голосов
/ 21 июля 2009

пример:

class Vendor_ClassName_Helper {
    CONST FIRST_OPTION  = 1;
    CONST SECOND_OPTION = 2;

    public function __construct($option, $otherArgument) {

    }
}

код клиента:

$obj = new Vendor_ClassName_Helper(Vendor_ClassName_Helper::FIRST_OPTION, $var);

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

Ответы [ 5 ]

4 голосов
/ 21 июля 2009

Я думаю, что ясность лучше короткого кода. Вы можете попытаться придумать разные слова, выражающие одинаковую или разную форму. Для вашего примера это не так уж плохо, как указал Омега, и его метод разделения объявлений на несколько строк также хорош.

Вот еще одна хитрость: в зависимости от того, что делают ваши опционные константы, вы можете использовать метод фабрики вместо ключевого слова new.

Например,

class Example {
    private function __construct() { }

    public static method createA(..) { 
        //configure for mode A
        $cls = new self; 
        return $cls;
    }

    public static method createB(..) { 
        //configure for mode B
        $cls = new self; 
        return $cls;
    }
}

$x = Example::createA();
3 голосов
/ 21 июля 2009

Я избегаю длинных строк и улучшаю читаемость на большинстве языков, разбивая параметры на их собственные блоки ...

$obj = new Vendor_ClassName_Helper(
    Vendor_ClassName_Helper::FIRST_OPTION, 
    $var
);

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

То, что у вас здесь, не так уж и плохо :)

2 голосов
/ 21 июля 2009

Если вы передаете константу в конструктор, она предлагает вместо этого создать подклассы:

class Vendor_ClassName_Helper {
  public function __construct($otherArgument) {
  }
}

class Vendor_ClassName_Helper_First extends Vendor_ClassName_Helper {
}

class Vendor_ClassName_Helper_Second extends Vendor_ClassName_Helper {
}
1 голос
/ 21 июля 2009

без использования более короткого имени для имен классов или констант (и сделать ваш код невозможным для понимания, чего вы определенно не хотите) , нет, я не думаю, что есть выход - - по крайней мере, не в PHP <5.3 </p>

PHP 5.3 добавляет пространства имен в PHP; с ними вы можете прийти к чему-то более короткому / лучшему; но это означает использование PHP 5.3, который не предлагается многими хостинговыми компаниями (5.3.0 был выпущен в конце июня этого года, поэтому может пройти некоторое время, прежде чем он станет доступен везде ...)

Для получения дополнительной информации о пространствах имен в PHP (и цитировать только пару ссылок) :

0 голосов
/ 21 июля 2009

Я думаю, что нет лучшего пути (нет динамического пути):

class LongClassName
{
    const B = 3;
}

class LCN
{
    const B = LongClassName::B;
}

echo LCN::B;
...