加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

记录Scala功能链

发布时间:2020-12-16 18:27:26 所属栏目:安全 来源:网络整理
导读:Scala(以及函数式编程,通常)提倡一种编程风格,您可以在其中生成表单的功能“链” collection.operation1(…).操作2(…)… 操作是地图,过滤器等的各种组合. 如果等效的Java代码可能需要50行,则Scala代码可以在1行或2行中完成.功能链可以将输入集合更改为完全
Scala(以及函数式编程,通常)提倡一种编程风格,您可以在其中生成表单的功能“链”

collection.operation1(…).操作2(…)…

操作是地图,过滤器等的各种组合.

如果等效的Java代码可能需要50行,则Scala代码可以在1行或2行中完成.功能链可以将输入集合更改为完全不同的输入集合.

Scala代码的缺点是10分钟后(从不介意6个月后),我无法弄清楚我在想什么,因为符号是如此紧凑,并且缺少类型信息(因为隐含类型).

你怎么记录这个?您是否在链条之前放置了一个大块注释,将优雅的1线解决方案转换为由39行评论组成的庞大的40行解决方案?你是否像这样穿插你的评论?

collection.
  // Select the items that meet condition X
  filter(predicate_function).
  // Change these items from A's to B's
  map(transformation_function).
  // etc.

别的什么?没有文件? (让他们猜测.他们永远不会“缩小”你,因为没有其他人可以维护代码.:-))

解决方法

我不会开始编写该代码(除非它是一次性使用的脚本或在REPL中播放).

如果我可以在一条评论中解释代码的作用并且读取正常,那么我将其保留为单行:

// Find all real-valued square roots and group them in integer bins
ds.filter(_ >= 0).map(math.sqrt).groupBy(_.toInt).map(_._2)

如果我不能通过仔细阅读命令链来理解这一点,那么我应该将其分解为功能不同的单元.例如,如果我期望某人没有意识到负数的平方根不是实数,我会说:

// Only non-negative numbers have a real-valued square root
val nonneg = ds.filter(_ >= 0)
// Find square roots and group them in integer bins
nonneg.map(math.sqrt).groupBy(_.toInt).map(_._2)

特别是,如果有人不熟悉Scala集合库,并且没有耐心花费5到10分钟来理解一行代码,那么他们不应该处理我的代码(也不是其他任何代码)这完成了一些他们不理解并且没有耐心去理解的非常重要的事情,或者我应该提前知道我提供了一个例如语言和数学教程,除了编写工作代码外,还可以编写一段解释后续行如何工作的段落,或者逐个命令地删除它,或者在每个匿名函数的开头包含注释来解释正在发生的事情(视情况而定) .

无论如何,如果你无法理解它的作用,你可能需要一些中间值.他们对精神重置非常有帮助(“我看不出如何从A到C!……但是……好吧,我能理解A到B.我能理解B到C.”)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读