在开始学习计算机工程之前,我曾经在 Rails(之前的 PHP)中进行过很多 Web 编程。
从那时起,我在 C 语言中完成了很多学校作业,并在 Objective-C 中完成了一些个人工作(Mac 的东西)。我学会了喜欢静态类型。
但现在我不得不做一些专业的 Web 开发(自由职业),并且再次选择了 Rails。我发现编写非语义类型检查测试真的很烦人。我是从 C 和 Objective-C 编译器中免费获得的。我喜欢点击 Build 并让系统检查我的所有代码,看看 A 可以调用 B,B 可以调用一些晦涩的库 C,等等。我所要做的就是测试语义。但是对于 Rails,我是编译器。:(
有没有人踩过同样的路?使用 C# 和 Java + x 框架进行 Web 开发 ASP.NET MVC 是我唯一的选择吗?寻求一些建议,甚至是一些同情......:P
顺便说一句,我特别提到了 Rails 而不是 Ruby,因为我不介意 Ruby 对脚本等简单事物的动态特性。但是由于 Rails 依赖于这么多的 gem,而且通常会添加许多其他的 gem,动态类型就成了一个问题。
谢谢!
编辑:
我跟进了 pst 的建议并研究了 Scala。在阅读由该语言的创建者 Martin Odersky 撰写的《Scala 编程》一书时,我偶然发现了这段文字,它在很多方面表达了我的担忧,甚至更多。非常有趣的阅读。
摘自 Martin Odersky 的 Programming in Scala 第 52 页:
Scala 是静态类型的
静态类型系统根据变量和表达式持有和计算的值的种类对它们进行分类。Scala 是一种具有非常先进的静态类型系统的语言。从类似于 Java 的嵌套类类型系统开始,它允许您使用泛型参数化类型,使用交集组合类型,以及使用抽象类型隐藏类型的细节。这些为构建和组合您自己的类型奠定了坚实的基础,因此您可以设计同时安全且灵活使用的界面。
如果您喜欢 Perl、Python、Ruby 或 Groovy 等动态语言,您可能会觉得 Scala 的静态类型系统被列为其强项之一有点奇怪。毕竟,没有静态类型系统被一些人认为是动态语言的主要优势。反对静态类型的最常见论点是它们使程序过于冗长,阻止程序员按照自己的意愿表达自己,并使软件系统的某些动态修改模式成为不可能。
然而,这些论点通常并不反对一般的静态类型的想法,而是反对特定的类型系统,这些系统被认为过于冗长或过于僵化。例如,Smalltalk 语言的发明者 Alan Kay 曾经说过:“我不反对类型,但我不知道任何类型系统不是完全痛苦的,所以我仍然喜欢动态类型。”< /p>
我们希望在本书中让你相信 Scala 的类型系统远非“完全痛苦”。事实上,它很好地解决了关于静态类型的两个常见问题:通过类型推断避免冗长,通过模式匹配和几种编写和组合类型的新方法获得灵活性。排除这些障碍后,可以更好地理解静态类型系统的经典优势。这些好处中最重要的是程序抽象的可验证属性、安全重构和更好的文档。
可验证的属性
静态类型系统可以证明不存在某些运行时错误。例如,他们可以证明以下属性:布尔值永远不会添加到整数;私有变量不能从其类外部访问;函数应用于正确数量的参数;只有字符串被添加到一组字符串中。
今天的静态类型系统无法检测到其他类型的错误。例如,它们通常不会检测到非终止函数、数组边界违规或除以零。他们也不会检测到您的程序不符合其规范(假设有规范,那就是!)。因此,静态类型系统被一些人认为不是很有用。争论的观点是,既然这样的类型系统只能检测简单的错误,而单元测试提供了更广泛的覆盖范围,那么为什么还要使用静态类型呢?
我们认为这些论点没有抓住重点。尽管静态类型系统当然不能替代单元测试,但它可以通过处理一些原本需要测试的属性来减少所需的单元测试数量。同样,单元测试也不能代替静态类型。毕竟,正如 Edsger Dijkstra 所说,测试只能证明错误的存在,而不能证明错误的存在。因此,静态类型提供的保证可能很简单,但它们是任何测试都无法提供的形式的真正保证。
安全重构
静态类型系统提供了一个安全网,让您可以高度自信地更改代码库。例如,考虑向方法添加附加参数的重构。在静态类型语言中,您可以进行更改,重新编译系统并简单地修复导致类型错误的所有行。完成此操作后,您一定会找到所有需要更改的地方。这同样适用于许多其他简单的重构,例如更改方法名称,或将方法从一个类移动到另一个类。在所有情况下,静态类型检查都可以确保新系统与旧系统一样工作。
文档
静态类型是由编译器检查正确性的程序文档。与普通注释不同,类型注释永远不会过时(至少在包含它的源文件最近通过编译器时不会过时)。此外,编译器和集成开发环境可以利用类型注释来提供更好的上下文帮助。例如,集成开发环境可以通过确定进行选择的表达式的静态类型并查找该类型的所有成员来显示可供选择的所有成员。