Chr*_*isW 6 refactoring static-typing weak-typing strong-typing
在我看来,关于静态/强类型编程语言最有价值的是它有助于重构:如果/当你更改任何API时,编译器会告诉你这个更改已经破坏了什么.
我可以想象用运行时/弱类型语言编写代码......但是如果没有编译器的帮助我无法想象重构,我无法想象在没有重构的情况下编写成千上万行代码.
这是真的?
Jas*_*ins 13
我认为,如果检查类型以及如何检查它们,你会感到困惑.运行时输入不一定很弱.
静态类型的主要优点正是你所说的:它们是详尽无遗的.您可以确信所有调用站点都符合类型,只需让编译器执行此操作即可.
静态类型的主要限制是它们在可以表达的约束中受到限制.这取决于语言,大多数语言具有相对简单的类型系统(c,java),而其他语言具有极其强大的类型系统(haskell,cayenne).
由于这种限制,类型本身是不够的.例如,在java类型中或多或少地限制为检查类型名称匹配.这意味着你想要检查的任何约束的含义必须被编码成某种命名方案,因此java代码常见的过多的间接和锅炉板.C++稍微好一些,因为模板允许更具表现力,但是不能接近使用依赖类型可以做的事情.我不确定更强大的类型系统的缺点是什么,但显然必须有一些或更多人在工业中使用它们.
即使您使用的是静态类型,也很可能无法检查您关心的所有内容,因此您也需要编写测试.无论静态打字是否能比你在样板中所需要的更省力,这种争论已经持续了很长时间,并且我认为对于所有情况都没有简单的答案.
至于你的第二个问题:
我们如何安全地重新考虑运行时类型的语言?
答案是测试.您的测试必须涵盖所有重要的案例.工具可以帮助您衡量测试的详尽程度.覆盖率检查工具可以让您知道测试是否涵盖了更多代码.测试变异工具(jester,heckle)可以让您知道您的测试是否在逻辑上不完整.验收测试让您知道您所写的匹配要求,最后回归和性能测试确保产品的每个新版本都保持最后的质量.
进行适当的测试与依赖复杂的类型间接的好处之一是调试变得更加简单.在运行测试时,您会在测试中获得特定的失败断言,这些断言清楚地表达了他们正在做的事情,而不是迟钝的编译器错误陈述(想想c ++模板错误).
无论您使用什么工具:编写您自信的代码都需要付出努力.它很可能需要编写大量测试.如果对错误的惩罚非常高,例如航空航天或医疗控制软件,您可能需要使用正式的数学方法来证明您的软件的行为,这使得这种开发非常昂贵.
我完全同意你的观点.动态类型语言应该擅长的灵活性实际上是使代码很难维护的原因.真的,如果在不实际更改代码的情况下以非平凡的方式更改数据类型,那么程序是否会继续工作?
同时,您可以检查传递的变量的类型,如果它不是预期的类型,则会以某种方式失败.你仍然需要运行你的代码来根除这些情况,但至少有些东西可以告诉你.
我认为Google的内部工具实际上是在进行编译,可能会对其Javascript进行类型检查.我希望我有这些工具.
归档时间: |
|
查看次数: |
1249 次 |
最近记录: |