记录Scala功能链
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.”) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |