gpt4 book ai didi

performance - Coffeescript 中的自定义集合和可变性

转载 作者:行者123 更新时间:2023-12-02 08:52:19 24 4
gpt4 key购买 nike

我正在阅读有关 CoffeeScript 的资料,但仍在尝试定位该语言、可以做什么、最佳实践是什么等等;我更习惯于强类型语言(AS3、Java、Scala),所以我的两个问题可能会让你微笑:)

问题一:自定义集合

您如何看待自定义收藏? JS/CS 是这方面最弱的语言之一;例如,没有 Array.remove,您必须改用繁琐的 splice() 方法。一些函数库(如下划线)通过提供将数组/对象作为第一个 arg 的函数来增强 API,但考虑到我更愿意编写的选择:

list fancyFunction 3, 4

而不是

fancyFunction list 3, 4

假设我创建了一个 List 类;是否可能,如果是,该类(class)能够使用 CS 的理解语法的先决条件是什么?最坏的情况是,我猜 List 可能有一个 toArray() 方法,并且通常的 CS 操作可以在该返回值上执行,但我希望有更好的解决方案。

理想情况下,我希望能够定义丰富的自定义集合,但又不会以失去理解等为代价。

问题 2:可变性

一般来说,人们对在 CS/JS 中非常小心可变性有何看法?

当我在网上阅读各种代码时,我的印象是一切都是可变的,人们普遍认为最好不要打扰,而是减少代码行数。

例如,可变与不可变的基本 Point 类:(希望我没有做错什么)

可变

class Point
constructor: (@x, @y) ->

不可变

class Point
constructor: (x, y) ->
@x = -> x
@y = -> y

没有那么复杂,但语法有点怪异。另一个考虑因素是 JS 并不是人类已知的最快的东西,并且为了成为纯粹主义者而不得不在循环中创建大量对象可能会适得其反,性能明智。不过,我没有对创建新 Point 对象与更改其中成员的成本进行基准测试。

想象一个大型应用程序,其中包含许多通过瘦 API 进行通信的模块。你不想传递不可变对象(immutable对象)吗?还是您执行防御性复制?

注意:我并不是要尝试让 CS 适应我所知道的语言;相反,我想知道重用一些在其他语言中理所当然的概念是否有意义。

谢谢

最佳答案

我认为对此的简短回答是 JavaScript 用途广泛,但不安全。没有静态类型,也没有什么是不可变的(除了在您的示例中被隔离在不同的范围内)。有些人试图与这种松散作斗争——例如,谷歌大量注释他们的代码,JavaDoc 风格。但主流的 JavaScript 程序员不会。他们很少将实例变量隐藏在 getter 后面,或者当您在他们期望 bool 值时使用字符串调用他们的 API 时抛出异常。这在一定程度上是出于实际原因——JS 是我所知道的唯一一种人们经常谈论其代码字节大小的语言——但它也反射(reflect)了该语言的周边文化,在这种文化中,文档和测试的值(value)远高于手握的值(value)。

所以,简而言之,我会坚持

constructor: (@x, @y) ->

并编写一些好的测试。毕竟,您无法防止任何可能的 API 滥用。最好通过良好的文档和测试来明确其正确用法。

顺便说一句,Underscore 确实提供了一种替代语法,让您可以按所需的顺序编写代码:

_(list).remove ...

或者您可以扩展 [Array] 原型(prototype)。参见 Sugar.js一些很好的例子。

关于performance - Coffeescript 中的自定义集合和可变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7627992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com