在26重新开始生活:第6部分-重构很有趣!!!

我醒来,为我的女友和我自己在花园里浇水时为我做早餐……荞麦煎饼,亚麻籽粉和鸡蛋! 之后,我戳了一把CodeWars SWIFT套件,然后去了攀岩馆。

“ Fizz Buzz布谷鸟钟”的使用说明…©CodeWars

我成功地完成了kata,但是它是一种非常基本的方式,几乎只能用else if语句,因为这是早上我可以从大脑中抽出的全部,但是我知道在脑后它可以重新以凉爽,漂亮的方式完成。 我认为这就像抱石:每增加一行不必要的代码=一次额外的不必要的动手,就像一根火柴。 坚强的登山者可以通过较少的动作和风格来发送问题。 实力更强的编码人员可以用更少的代码行完成任务,并且令人眼前一亮。

解决方案版本 1个

第1版,共6版

当我到达攀岩馆时,我收到了我的旧室友Keng的信息,他刚好是一名代码专家,机器学习天才以及让我着迷的人。 他建议我考虑进行重构 ,以使编码更上一层楼。

[重构],Aka以更清晰,更简洁的方式重写代码。 一种保养

〜坑

过去,我回过头来重做一些旧的CodeWars选项卡,并应用完成后获得的新知识,但是直到今天我才意识到实际上有一个专门的术语(“重构”,以及假设我实际上是在使代码变得整洁而不恶化,所以在与康妮(Connie)在健身房锻炼了很长时间之后,我们开着一辆无AC的汽车回家,照顾了一些琐事。

解决方案版本 2

当我坐在电脑前的时候,我从早上起就直接玩同样的kata,以及如何重构它。 我从消除let t = time.components(separatedBy: ":") 。

第2版​​,共6版

.components(separatedBy:)是一个返回数组的String实例方法。 因此,我没有声明一个数组变量t然后分别访问它的项目,而是直接通过我的hour变量和minute常数来访问该数组的项目(以前是t )。

解决方案版本 3

只是出于好奇……缺乏理解……我想看看guard声明会多么有用。 我守卫的条件是hour <= 12 。 但是事实证明,我不得不加倍代码。 这可能是我所有解决方案中最糟糕的一种,但最后仍然有效。

第3版,共6版

在攀登过程中,这相当于一次攀登到一块巨石的顶部,然后可能再次进行攀登并重新攀登。

解决方案版本 4和5

处理kata的24HR时钟并将其转换为12HR令我有些烦恼,我想找出一种更优雅地处理该时钟的方法。

从Ver。 1和2,我有:

  ... 
如果小时> 12 {
小时-= 12
}
如果分钟== 0 &&小时== 0 {
...
版本4和5(共6个)

我注意到0被视为12 (因为00:00从技术上来说是12:00 am,对吗?),所以我可以以某种方式消除...&& hour == 0块。

 如果小时== 0 || 小时> 12 { 
小时= abs(小时-12)
}
  • abs() 返回整数的绝对值
  • 所以0 — 12会在我想要的12:00 am给我12
  • 13...23会给我1:00–11:00pm

对于版本5,我试图实现一个switch语句,以便摆脱重复的else-if语句。 到目前为止,我对技术术语的看法还很模糊:我目前不确定如何将表达式用作我的switch语句的用例。 看到

case 3,6,9,12,18,21,24,27,33,36,39,42,48,51,54,57:

我只想要minute % 3 == 0但出现错误的情况:

  solution.swift:9:21:错误:“布尔”类型的表达式模式无法匹配“整数”类型的值 
案例分钟%3 == 0:
~~~~~~~~~~~ ^ ~~~

因此,在我学会如何做之前,我将坚持使用3、6、9等。

解决方案版本 6

6之6

在这里,我意识到hour仅在minute == 0时才重要,因此我可以嵌套到switch minute { case 0: 。 我想相信这可以节省一些计算能力……?

好奇心使我知道是否可以进一步简化处理hour代码。 通过一些谷歌搜索,我偶然发现了模式匹配运算符 ~= 。 虽然仍然需要进一步研究才能真正理解和根深蒂固,但这是我在阅读针对基本操作员的Apple Swift文档时不记得看到的东西。

最后,重构很有趣。 我想认为我在此过程中整理了我的代码…向在那里感到畏缩的编码人员道歉…我加强了一些工作,学习了新的操作员,并指出了我想弄清楚的内容。

我想我很快就会完成一些基本的Swift和Xcode工作,所以这就是为什么我在Web开发上花了很多时间后又跳回Swift的原因:HTML,JavaScript和CSS。 我仍将尽力保持这些状态,但是我们会看到的。 只有命运知道我会往哪个方向走!

晚安!

1–6版进行比较…请注意每个版本的时间 。 😛

我之前已经定义了两件事要学习:

  • 1. “ 我只需要[switch语句] case ,其中 minute % 3 == 0 但我得到一个错误:”
  • 2. “ 我偶然发现了 模式匹配运算符 ~= 。 仍然需要进一步研究才能真正理解和根深蒂固。”

我在Patterns上研究了docs.swift.org ,以便可以了解有关Pattern Matching运算符的更多信息。 我一心一意地从顶部记笔记,最终到达了Type-Casting Patterns ,然后开始关注is-type和pattern-as-type 。 鉴于上述的学习目标(1.) ,我读了一条引起我注意的台词。

有关使用switch语句将值与is和as模式进行匹配的示例,请参见对Any和AnyObject进行类型转换。

因此,我单击了链接以了解有关Any和AnyObject的类型转换的信息 。 该示例使用一个包含许多不同类型的Array things :

  var Things = [Any]()things.append(0) 
Things.append(0.0)
Things.append(42)
Things.append(3.14159)
Things.append(“ hello”)
Things.append((3.0,5.0))
things.append(电影(名称:“捉鬼敢死队”,导演:“伊万·雷特曼”))
things.append({((name:String)->“ Hello,\(name)”}中的字符串)

然后,他们使用as-pattern进行了带有各种case的switch语句。

 对于事物中的事物{切换事物{ 
情况0为Int:
打印(“零作为整数”)
情况0为Double:
打印(“零为双精度”)
案例让someInt作为Int:
print(“ \(someInt)的整数值”)
假设让someDouble作为Double,其中someDouble> 0:
打印(“ \(someDouble)的正双精度值”)

这种case let someDouble as Double where someDouble > 0:就像我试图找出的一样。

let someDouble是一个与thing相匹配的临时值, where我可以应用一个我想为真的条件。 我猜想我可以根据需要省略as ,结果证明我是对的。

回到CodeWars,我希望减少“手动”处理的这一行:

case 3,6,9,12,18,21,24,27,33,36,39,42,48,51,54,57:

所以我在脑海中假设这行是可行的:

let arbitraryName where someCondition -> true

版本7(共6个)…有效!

如此重构!…

抱歉,这很难执行。 我几乎和自己不在同一页上。