1

我正在浏览 Facebook 的Hack 语言的文档,它说优点之一是可重构性。为什么 Hack 比 PHP 更容易重构,因为它是部分类型化的?

4

2 回答 2

2

首先,PHP是有类型的。它不是静态类型的,但它肯定有一个定义良好的类型系统。不同的类型系统有不同的目标,但通常类型将代码的一部分标记为某个“事物”,并将代码的其他部分标记为与某些“事物”一起使用。例如,一个变量被标记为“this is an int”,另一个函数被标记为“this parameter must be an int”

使用这些标签的方式、地点和时间因语言而异。PHP 非常宽松,允许您将字符串传递给标记为需要 int 的函数,因为 PHP 的类型杂耍将即时处理此类不兼容性(在某种程度上)。这仍然意味着您需要传递通常与预期类型兼容的值。您不能将数组传递给需要 int 的函数,因为这没有任何意义。

现在,工具可以使用此类型信息来帮助您构建有效的代码。如果您尝试将它知道的数组传递给它知道需要 int 的函数,您的 IDE 会警告您。这是一个很早就发现的错误。如果您的 IDE 不这样做,编译器或静态分析工具可能会这样做。这是一个稍后发现的错误,但仍然被捕获。尽管 PHP 在执行之前通常不会通过编译器运行。最后的手段是运行时系统在遇到不兼容的类型时抛出错误,这已经很晚了,可能很难捕捉和调试。

因此,具有严格类型注释的语言为这条链上的许多工具提供了大量信息,并有助于及早发现错误。当然不是所有情况下的所有错误,但它们可以帮助及早消除一大类错误。当您重构代码时,这对于避免将两个不兼容的代码段粘在一起非常有帮助。非常好的工具甚至可以根据这些兼容性元信息推断您的代码结构,并建议简化或重组。

但是,即使在普通的旧 PHP 中,您也可以获得类型注释的好处。许多 IDE 支持注释注释,例如:

/**
 * @param int $bar
 * @return string
 */
function foo($bar) {
   ...
}

这提供了与 Hack 中相同的类型信息:

function (int): string

除非它没有融入语言本身,并且实际上可能正确也可能不正确。但它提供了相同的好处,因为您的 IDE 等工具可以根据此信息帮助您编写代码。好的 IDE 甚至会根据对代码的推理自行检测类型,甚至指出注释与实际代码之间的差异。

因此,像 Hack 这样具有严格类型注释的语言具有开箱即用的显式类型系统的好处,并将这些类型作为编译过程的一部分强制执行,这有助于在代码实际运行之前更早发现某些问题跑。普通 PHP 只有非正式的类型注释*,外部工具可能使用也可能不使用,并且只会在运行时捕获实际问题。但是,这些工具确实存在,所以总体而言,IMO 几乎是一次洗礼。


* PHP确实为其 OO 组件以及一些复杂类型(如数组和可调用对象)提供了完整的正式类型提示支持。但同样,这些仅在 PHP 本身运行时使用;您依赖 3rd 方工具进行运行前分析。

于 2014-05-27T11:10:06.593 回答
0

我不使用 Hack,但据我从他们的文档中可以看出,它们允许非常精确的类型注释,比如

function(int, int): string // function that takes two ints and returns string

或者

array<string, int> // array with string keys and int values

与参数类型一起,这构成了一个丰富的类型系统,可与 C# 或Haxe相媲美。

关于静态类型是否真的有助于重构的意见不一。毫无疑问,它使 IDE 能够用你的代码做一些花哨的事情。

于 2014-05-27T10:53:18.460 回答