PHP Zend Framework编码标准,哪种更易读?

时间:2010-03-04 20:45:35

标签: php zend-framework coding-style

这是一个主观问题,我需要您对编码标准和格式化实践的感受和想法。

PHP Zend编码标准需要编写如下的多行函数调用:

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

我认为以下方法更具可读性:

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

因为左侧只有一行,这表明这只是一个语句,参数更接近方法名称。

更喜欢哪一个?

7 个答案:

答案 0 :(得分:14)

第二种方法会给您留下一个额外的问题:线长。 Zend编码标准建议“任何PHP代码行的最大长度为120个字符。”

这意味着如果你想要好的(长的,描述性的)变量名称,并且碰巧有一个用于返回值,对象,一个好的命名函数和一个长参数,你更有可能达到120个字符限制。

除此之外,根据您的标准,最大长度可能只有80个Chars或介于两者之间。

此外,如果重复使用,我更喜欢第一个

$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);
像Pekka说的那样,少了眼睛跳跃。

答案 1 :(得分:10)

我更喜欢第一种方法。后者需要更多的打字,并且更加紧张眼睛IMO。我认为眼睛 - 至少是人类的“西方”,从左到右的阅读部分 - 当到达当前的那一行时往往会跳到下一行的开头,并且有太多的空白区域跳过第二个例子。它可能在语义上不是100%正确,但提供了良好的阅读流程。

答案 2 :(得分:3)

我喜欢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 :(得分:2)

在你提供的两个中,我更喜欢第一个。

如果有编码标准,我会遵循它。但是,在我的工作中没有,我更喜欢以下内容:

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

对我来说,更容易看到有一个变量赋值被完成(因为参数和右括号的缩进方式。使用Zend标准,你必须实际查找等号才能看到它是一个赋值,否则它可能与普通的多行函数调用混淆。

还有一条评论......如果超过120个字符,我的函数调用只会变成多行。任何超过120个字符的内容都不会在我的IDE中以1600x1200分辨率显示,并且Workspace浏览器和Code Navigator窗格打开。

这行代码只有74个字符,所以我会这样做:

class myClass
{
    public function myFunction(...)
    {
        $returnedValue = $object->longMethodName($argument1, $otherArgument, 42);
    }
}

答案 4 :(得分:1)

既不?选项A可能令人困惑,因为单缩进用于代码块。选项B存在长参数名称和/或深度缩进代码的问题。

我更喜欢继续参数列表的双缩进。

例如,根据erenon的要求:

$returnedValue = $object->longMethodName(
        $arg1, longInlinedMethod($argFoo, $argBar) + otherLongInlinedMethod(),
        $arg2, $arg3);
while ($val) {
    someStatement();
}

答案 5 :(得分:1)

我通常使用First,但是在同一行上使用右括号或者至少与上面的缩进相同。

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

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

对我来说,这似乎可以避免在嵌套时出现混乱。

然而:我在vim中的压头开始做同级别(2,上面),我喜欢它。我在需要包装帮助的长行上打破了它,但总的来说,如果你主要是扫描方法名而不是参数,我认为它会导致代码可读。

顺便说一下,对嵌套的布尔语句进行那种缩进也很有效。

如果它们不是太长,我也会在一行上对论点进行分组,这对于分组是有意义的。

答案 6 :(得分:1)

我更喜欢第一种,原因有两个:

  1. 它允许您使用Tab键进行缩进(或使用缩进/ unindent的热键),而无需担心添加额外的空格以使参数对齐。
  2. 更重要的是,如果变量,对象或方法名称的长度在第一行中发生变化,则不必修改参数缩进。