为什么重构键入的语言更容易?

时间:2014-05-27 10:32:29

标签: php programming-languages hacklang

我正在阅读Facebook Hack language的文档,它说其中一个优点是可重构性。为什么Hack比PHP更容易重构,因为它是部分键入的?

2 个答案:

答案 0 :(得分:2)

首先,PHP 类型。它不是静态类型,但它肯定有一个定义良好的类型系统。不同类型的系统有不同的目标,但通常类型是将代码的某些部分标记为某种特定的东西"并标记代码的其他部分以使用某些"事物"。例如。变量标记为"这是一个int" ,另一个函数标记为"此参数必须是int"

使用这些标签的方式,地点和时间因语言而异。 PHP非常宽松,允许您将字符串传递给标记为需要整数的函数,因为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本身使用;您依赖第三方工具进行运行前分析。

答案 1 :(得分: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相当。

关于静态类型是否真正有助于重构的意见是mixed。当然,它使IDE能够使用您的代码做出奇特的事情。