Ale*_*exG 2 collections performance immutability coffeescript
我正在阅读关于CoffeeScript的文章,我仍然试图定位语言,可以做什么,最佳做法是什么等等; 我更习惯强类型语言(AS3,Java,Scala)所以我的两个问题可能会让你微笑一下:)
问题1:自定义集合
您如何看待定制系列?JS/CS是这方面最弱的语言之一; 例如,没有Array.remove,你必须使用繁琐的splice()方法.一些函数库(如下划线)通过提供将数组/对象作为第一个arg的函数来扩充API,但是给出了我更喜欢的选择:
list fancyFunction 3, 4
Run Code Online (Sandbox Code Playgroud)
而不是
fancyFunction list 3, 4
Run Code Online (Sandbox Code Playgroud)
假设我创建了一个List类; 是否可能,如果是,这个类能够使用CS的理解语法的必要条件是什么?最糟糕的情况是,我猜List可以有一个toArray()方法,而且可以对该返回值执行常规的CS操作,但我希望有更好的解决方案.
理想情况下,我希望能够定义丰富的自定义集合,但不能以失去理解为代价等.
问题2:可变性
人们对CS/JS中的可变性非常小心的感受是什么?
当我在网上阅读各种代码时,我的印象是一切都是可变的,人们通常认为最好不要打扰并减少代码行.
例如,可变与不可变的基本Point类:(希望我没有做错事)
易变的
class Point
constructor: (@x, @y) ->
Run Code Online (Sandbox Code Playgroud)
不可变
class Point
constructor: (x, y) ->
@x = -> x
@y = -> y
Run Code Online (Sandbox Code Playgroud)
没有那么复杂但稍微怪异的语法.另一个考虑因素是JS并不是人类已知的最快的东西,并且为了成为纯粹主义者而不得不在循环中创建大量对象可能会产生反效果,性能明智.我没有对创建新Point对象的成本进行基准测试,而不是改变一个成员.
想象一个大型应用程序,其中有许多模块通过瘦API进行通信.你不想传递不可变对象吗?或者你会执行防御性副本吗?
注意:我并不是想尝试将CS改为我所知道的语言; 相反,我想知道重用其他语言中理所当然的一些概念是否有意义.
谢谢
我认为对此的简短回答是JavaScript是多功能的,但它不安全.没有静态类型,没有任何东西是不可变的(除了在你的例子中,通过被隔离在不同的范围内).有些人试图对抗这种松散 - 例如,谷歌大量注释他们的代码,JavaDoc风格.但主流的JavaScript程序员却没有.它们很少隐藏getter背后的实例变量,或者在用预期的布尔值调用带有字符串的API时抛出异常.这部分是出于实际原因 - JS是我所知道的唯一一种人们通常会谈论代码字节大小的语言 - 但它也反映了语言的周边文化,其中文档和测试的价值远高于手持.
所以,简而言之,我坚持下去
constructor: (@x, @y) ->
Run Code Online (Sandbox Code Playgroud)
并写一些好的测试.毕竟,你无法防止所有可能的API滥用.通过良好的文档和测试更好地使其正确使用.
顺便说一句,Underscore确实提供了一种替代语法,允许您按所需顺序编写代码:
_(list).remove ...
Run Code Online (Sandbox Code Playgroud)
或者你可以扩展[Array]原型.有关一些很好的例子,请参见Sugar.js.
| 归档时间: |
|
| 查看次数: |
620 次 |
| 最近记录: |