scala语言可读性好么?

最近在学习这门语言,主要是受本站《程序员如何选择自己的第二语言》这个问题的影响,想找一门函数式语言来看看,正好以前搞过java,于是就选择了scala,虽然它不是纯种的函数式编程,但也具有一定的特色。

花了一个下午就把那本《Scala编程》看完了,基本语法都很简单,大多数跟一般语言差不多。但是因为scala是一门函数式语言,这些符号其实都是函数,理解了这一点剩下的都容易了。但是问题也来了,我现在可以写一点小东西了,但是我发现你写出来东西要让第二个人看得懂是一件非常不容易的事情,因为它的自由度太大了,比如在一般的语言里

if (array.contains(item))

在scala我们可以文艺的这样写,像诗一样

if (array contains item)

如果2x一点的,自己重载个操作符然后搞个倒置

if (item ~: array)

如果没有手册,你能理解在这些程序中奇奇怪怪的符号吗?scala有自己的编程指导规范么,这要是搞大规模开发岂不是要昏头了?

阅读 13.9k
14 个回答

首先,可读性是个因人而异的东西。有人觉得Java事无巨细的语法容易看懂,有人却觉得Java的语法太过冗长影响理解。(当然,brainfxxk肯定不容易读:P)

其次,任何语言总有“易读”和“难读”的写法,关键看怎么写,所以适当的编码规范和评审是很必要的。

最后,操作符重载应该基于操作符的语意,比如C++中<<操作符就应该用在输出相关的操作上,如果用*来输出会很奇怪。Just because you can doesn't mean you should.

代码是写给人看的,不是写给机器看的。

写给人看的代码,特别是大的工程,大部分都得多人协作完成。在这样的情况下,代码在保证语义正确的前提下,简洁、清晰、明了十分重要。虽然语言给你提供了多种实现方式,但是还是请尽量保证其可读性和可维护性更好。

对于你所列举的第三个类子,是反其道而行,因为 ~ 操作符对于大多数语言的含义是表示取反操作,用在这里,晦涩难懂,尽管代码更短小。

操作符重载,噩梦啊。我们团队要加一个重要规范,就是不准用操作符重载。

目前的scala还是过于复杂的,有点像特种兵。确实不怎么适合大规模的部队进攻

习惯函数式编程的,看着就舒服

个人观点,比Java简洁的多,而且我比较熟悉Haskell的语法,所以感觉很不错。

可能你没接触过common lisp,那就会更加变态了,完全可以用一种自己定义成另一种语言的格式。它的宏是功能非常强大,但同时也引出类似的很难读懂别人写的程序的问题。如果是团队开发,倒是可以规范自己团队内部的代码规范。

if (array contains item)

你知道支持单参数的函数可以写成这种方式的目的是什么么?你知道scala这个名字的意义是什么么?

update:
被踩了哈哈,我知道不该用问题来回答问题,不过一本经典的《Programming in Scala》从852页被翻译成492页中文,然后又被楼主一个下午搞定了,我基本上不知道该说什么好了。知道不知道即使不打算学scala,看这本书也一样受益匪浅?这不是一本语法书,里面对很多古老的和近代的语言的优缺点进行了总结和分析,并对oo和fp的区别和融合进行了探索,至少也会理解一下为何scala支持上面那种语法形式吧,这个支持可不是bug

另外,scala并不是一门函数语言

这只是没有按照标准风格罢了,团队协作的话自然要规范代码风格。
另外吐槽array contains item的我也是醉了,没有这种语法支持你怎么用1 + 1,scala允许这种语法是为了增强可读性

在语言固定的前提下,可读性就是你自己的写法问题了,遵循常用的 code style.然后合理的命名变量和写逻辑等等。至于复杂度或者由于 scala 自己的编程范式引起的代码阅读困难。这个就需要你看书去学习了。总之代码可读性大部分原因都是在程序员本身。不在于语言。

我个人的体会是,Scala的语法比较复杂,学习曲线陡峭,也许是自己太笨。

如果花了一个下午就学会了Scala,那堪称天才了。

个人认为语法比较简单的语言是C语言,但用好它也要花费数年的时间。

if (item ~: array)

这个里的函数名不是 ~: 吗?这算重载吗?
而且这不是 scala 对于DSL支持的优势吗? 好吧,三个??

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏