Стандарт кодирования Платформы Зенда PHP, который является более читаемым подходом?

Это - субъективный вопрос, мне нужны Ваши чувства и мысли о кодировании стандартов и форматировании методов.

Зенд PHP, кодирующий стандарт, требует для записи многострочных вызовов функции как это:

$returnedValue = $object->longMethodName(
    $argument1,
    $otherArgument,
    42
);

Я думаю, что следующий подход более читаем:

$returnedValue = $object->longMethodName($argument1,
                                         $otherArgument,
                                         42);

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

Какой ВЫ предпочитаете?

7
задан David Snabel-Caunt 4 March 2010 в 22:32
поделиться

7 ответов

Второй подход оставляет вам одну дополнительную проблему: длина строки. Стандарт кодирования Zend предлагает следующее: «Максимальная длина любой строки Код PHP состоит из 120 символов ».

Это означает, что если вам нужны хорошие (длинные, описательные) имена переменных, и у вас есть одно имя для возвращаемого значения, объекта, хорошо именованной функции и длинного параметра, вы гораздо более вероятно чтобы достичь этого предела в 120 символов.

Вдобавок к этому и в зависимости от вашего стандарта максимальная длина может составлять всего 80 символов или что-то среднее между ними.

Кроме того, мне больше нравится первый, если он используется неоднократно

$returnedValue = $object->longMethodName(
    $argument1,
    $otherArgument,
    42
);
$returnedValue = $object->longMethodName(
    $argument1,
    $otherArgument,
    42
);
$returnedValue = $object->longMethodName(
    $argument1,
    $otherArgument,
    42
);
$returnedValue = $object->longMethodName(
    $argument1,
    $otherArgument,
    42
);

$returnedValue = $object->longMethodName($argument1,
                                         $otherArgument,
                                         42);
$returnedValue = $object->longMethodName($argument1,
                                         $otherArgument,
                                         42);
$returnedValue = $object->longMethodName($argument1,
                                         $otherArgument,
                                         42);
$returnedValue = $object->longMethodName($argument1,
                                         $otherArgument,
                                         42);

Как сказал Пекка, меньше прыжков глазами.

14
ответ дан 6 December 2019 в 05:48
поделиться

Мне нравится стандарт PEAR, и он защищает первый из ваших примеров

$returnedValue = $object->longMethodName(
    $argument1,
    $otherArgument,
    42
);

, но я мог бы вместо этого сделать это для такого короткого набора параметров:

$returnedValue = $object->longMethodName(
    $argument1, $otherArgument, 42
);

РЕДАКТИРОВАТЬ: о! и для примера сидериала:

$notInlined = longInlinedMethod($argFoo, $argBar) + otherLongInlinedMethod();
$returnedValue = $object->longMethodName(
    $arg1, $notInlined, $arg3, $arg4
);
while ($val) {
    someStatement();
}
3
ответ дан 6 December 2019 в 05:48
поделиться

Мне больше нравится первый подход. Второй требует больше ввода и больше напрягает глаз IMO. Я думаю, что глаз - по крайней мере, у "западной", читающей слева направо части человечества - имеет тенденцию перескакивать к началу следующей строки, когда доходит до конца текущей, а во втором примере слишком много белого пространства для перескакивания. Возможно, семантически это не на 100% правильно, но обеспечивает хороший поток чтения.

10
ответ дан 6 December 2019 в 05:48
поделиться

Neither? Вариант A потенциально запутан, поскольку для блоков кода используется одинарный отступ. Вариант B проблематичен при длинных именах аргументов и/или глубоких отступах в коде.

Я предпочитаю двойной отступ для длинных списков аргументов.

Пример, по просьбе erenon:

$returnedValue = $object->longMethodName(
        $arg1, longInlinedMethod($argFoo, $argBar) + otherLongInlinedMethod(),
        $arg2, $arg3);
while ($val) {
    someStatement();
}
1
ответ дан 6 December 2019 в 05:48
поделиться

Я обычно использую Первый, но с закрывающей скобкой на той же строке или, по крайней мере, с тем же отступом, что и выше.

$returnedValue = $object->longMethodName(
    $argument1,
    $otherArgument,
    42
    );

$returnedValue = $object->longMethodName(
    $argument1,
    $otherArgument,
    42);

Мне кажется, это помогает избежать путаницы при вложении.

Однако: мой индентор в vim начал работать на том же уровне, что и парен (2, выше), и мне это нравится. Я прерываю его на длинных строках, которые нуждаются в помощи по упаковке, но в целом я думаю, что это приводит к читаемому коду, если вы в первую очередь сканируете имена методов вместо параметров.

Кстати, подобный отступ для вложенных логических операторов и тому подобное тоже хорошо работает.

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

1
ответ дан 6 December 2019 в 05:48
поделиться

Я предпочитаю первый по двум причинам:

  1. Он позволяет вам использовать клавишу Tab для отступа (или горячие клавиши для отступа / удаления), не беспокоясь о добавлении дополнительных пробелов, чтобы ваши аргументы выстроились в линию.
  2. Что еще более важно, вам не нужно изменять отступ аргументов, если длина вашей переменной, объекта или имени метода изменяется в первой строке.
1
ответ дан 6 December 2019 в 05:48
поделиться

Из двух предложенных вами вариантов мне больше нравится первый.

Если существует стандарт кодирования, я буду следовать ему. Однако на моей работе его нет, и я предпочитаю следующий:

$returnedValue = $object->longMethodName(
                                $argument1,
                                $otherArgument,
                                42
                            );

Мне проще сразу увидеть, что происходит присвоение переменной (из-за того, как отступают параметры и закрывающие скобки. В стандарте Zend нужно искать знак равенства, чтобы понять, что это присваивание, иначе его можно спутать с обычным многострочным вызовом функции.

Еще один комментарий... мои вызовы функций становятся многострочными, только если они превышают 120 символов. Все, что больше 120 символов, не будет видно в моей IDE с разрешением 1600x1200 при открытых панелях Workspace browser и Code Navigator.

В этой строке кода всего 74 символа, поэтому я бы сделал так:

class myClass
{
    public function myFunction(...)
    {
        $returnedValue = $object->longMethodName($argument1, $otherArgument, 42);
    }
}
2
ответ дан 6 December 2019 в 05:48
поделиться
Другие вопросы по тегам:

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