我用过的编程语言不算少, 但是一直没有找到我十分满意的编程语言, 因为我没有找到这样的编程语言: 它恰好包含全部我喜欢的语法, 并且恰好不包含任何我讨厌的语法。
OO是必不可少的特性。
有了多态, 我才可以放心地写业务逻辑, 而把具体实现交给每个子类来完成。
如果没有多态, 代码可能会变成一大段丑陋的switch来判断类型。
一般的程序,都是操作对象, 而只有模板,才可以让我们对类型本身进行操作。
比如实现一个有N个类型组成的列表, 并对它进行取头/取尾/取第i个/取子串/比较相等/计算长度等操作。
函数作为第一类值, 我觉得这是一个伟大的发明, 绝对具有划时代意义。
在一个需要事件驱动的应用场景下, 如果函数作为第一类值, 那么注册事件回调的代码将会减少很多很多。
我不喜欢花括号, 也不喜欢begin/end。
而且我觉得缩进对于代码来说很重要。
而使用缩进来表达语句块真是一个伟大的想法。 它不但强制保证了代码的可读性, 还避免了输入花括号/begin/end的烦恼。
列表推导的语法简直是太方便啦!
它不但比map简洁、高效, 而且可读性更好。
在一些语言中, 想要遍历一个集合对象, 还需要写一个迭代器的类。
而如果有生成器的语法, 只需要一个函数,几行代码就可以完成相同的功能。
而coroutine可以很方便实现这样的功能: 函数A执行一段, 暂停下来执行函数B。 函数B执行一段, 暂停下来继续执行函数A。 如此往复。
我觉得函数的参数应该有类型限制。
否则如果我写一个库, 允许用户传各种奇怪的值来。 那么只有两种结果: 要么写一大堆代码来检查参数类型, 要么完全不管库的安全性。
这二者有共同点是, 有字符串的表达能力, 但是只占一个整数的内存空间。
有了编译错误,我才能放心地做重构。
比如我把一个函数的第一个参数从Foo类型改成了Bar类型, 那么我还需要把所有调用这个函数的地方改一下。
漏改了某一处调用怎么办?
如果没有编译错误, 我必须到运行时才能够发现漏改了一处调用。 而且如果我测试的覆盖不全的话, 这种疏忽可能会留在代码中, 引发更大的错误。
如果有编译错误, 所有这些检查可以交给编译器来完成。 避免将错误留到运行期。
我非常讨厌Warning。
我的观点是, 如果发生了错误, 就应该抛个异常。
Warning这种东西, 大多数人根本不理它, 所以它根本没有存在的价值。
我觉得AOP这种东西, 既不易写, 也不易维护, 简直是一个反人类的存在。
隐式类型转换也绝对不能忍。
类型信息是很重要的, 而且隐式类型转换很容易造成一些不易发现的BUG。
有的语言提出Interface的概念完全是为了避免多继承。
但是我觉得多继承没有错, 是使用的人根本不了解多继承, 竟然发明出来Interface这么一个多余的东西。