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

功能Scala的重构/布局

发布时间:2020-12-16 09:14:22 所属栏目:安全 来源:网络整理
导读:这一个班轮… Console.println(io.Source.fromFile("names.txt").getLines.mkString.split(",").map{x:String = x.slice(1,x.length -1)}.sortBy { x = x}.zipWithIndex.map{t ={ (t._2 +1)*(t._1.map{_.toChar - "A"(0).toChar + 1}.sum)}}.sum); …是我的
这一个班轮…

Console.println(io.Source.fromFile("names.txt").getLines.mkString.split(",").map{x:String => x.slice(1,x.length -1)}.sortBy { x => x}.zipWithIndex.map{t =>{ (t._2 +1)*(t._1.map{_.toChar - "A"(0).toChar + 1}.sum)}}.sum);

…是我的解决方案Project Euler problem 22.它似乎工作,它写在(我的尝试)的功能风格.

这个例子有点极端,但是我的问题比较笼统 – 你最喜欢写/格式/评论功能样式代码?功能性方法似乎鼓励了一系列方法调用,我发现这可能会变得不可读,也没有任何明显的意见.

此外,当我编写程序代码时,我发现我写了一些方法,每个方法有一个目的和有意义的名称.当我编写功能代码时,我似乎正在开发一种习惯,生成一条像上面那样的线条,其中(对我来说)意义难以破译 – 而且个别的计算也难以在其他地方重新使用.在网上看到的功能代码很多很简单(对我来说)模糊不清.

我该怎么办?为计算的每个部分编写一些功能,名称在当前上下文中有意义? (即使他们只是一个地图的包装,比如说?)

对于我给出的例子,什么是更好的写作方式,并展示它?

(像所有的风格问题,这个都是主观的,但是没有理由应该得到论证!)

解决方法

一个微不足道的首次尝试整理它只是删除领先的控制台.尾随和explicit:String类型 – 所有这些都是不必要的 – 添加一些缩进并导入io.Source:

import io.Source
println(
  Source.fromFile("names.txt").getLines.mkString.split(",").map{
    x => x.slice(1,x.length -1)
  }.sortBy {x => x}.zipWithIndex.map{
    t =>{ (t._2 +1)*(t._1.map{_.toChar - "A"(0).toChar + 1}.sum)}
  }.sum
)

下一步是清理一下,使用模式匹配来映射元组列表和身份而不是x => x. toChar对于字符也是不必要的,单引号可用于表示字符文字.

import io.Source
println(
  Source.fromFile("names.txt").getLines.mkString.split(",").map {
    x => x.slice(1,x.length -1)
  }.sortBy(identity).zipWithIndex.map {
    case (v,idx) =>{ (idx+1)*(v.map{_ - 'A' + 1}.sum)}
  }.sum
)

还有一些更改也有助于使代码的意图更清晰:

import io.Source
println(
  Source.fromFile("names.txt").getLines.mkString.split(",")
  .map { _.stripPrefix(""").stripSuffix(""") }
  .sortBy(identity)
  .map { _.map{_ - 'A' + 1}.sum }
  .zipWithIndex
  .map { case (v,idx) => (idx+1) * v }
  .sum
)

下一步,使它更“功能”,就是将其分解为“功能”(偷偷摸摸,是吗?)理想情况下,每个功能都将有一个清楚表达其目的的名称,它将很短(旨在使其成为一个单一表达式,因此不需要大括号):

import io.Source

def unquote(s:String) = s.stripPrefix(""").stripSuffix(""")

def wordsFrom(fname:String) =
  Source.fromFile(fname).getLines.mkString.split(",").map(unquote)

def letterPos(c:Char) = c - 'A' + 1

println(
  wordsFrom("names.txt")
  .sortBy(identity)
  .map { _.map(letterPos).sum }
  .zipWithIndex
  .map { case (v,idx) => (idx+1) * v }
  .sum
)

wordsFrom是一个明显的1行内容,但是我将其拆分为在StackOverflow上更容易的格式化

(编辑:李大同)

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

    推荐文章
      热点阅读