戴夫·托马斯(Dave Thomas)的数据处理卡塔(Kata)的快速解决方案(3)

戴夫·托马斯(Dave Thomas)的数据处理卡塔(Kata)的快速解决方案(3)

保持干燥

在第3部分中,要求我们从第1部分和第2部分中干燥(不要重复自己)代码。我的完整解决方案可以在这里找到。

拿起先前编写的两个程序,并尽可能多地分解出通用代码,剩下两个较小的程序和某种共享功能。

第1部分和第2部分中的分配非常相似。 每一项都要求我们加载文件,将文件的文本提取到表中,清理每一行,选择我们感兴趣的列,然后查找并打印两列之间的差异最小的行名。

我将Dave的说明解释为“留给您两个小程序”,意味着我应该创建我的“ Executor”结构的两个版本,一个用于天气,另一个用于足球数据。 在一个实际的项目中,我将合并为一个结构,该结构接受闭包作为两种数据类型之间不同的每种方法的参数。

考虑到我略微潮湿的“法律法规”方法,有两种方法需要重构。

removeUnneededColumns()

由于每个文件都有我们需要使用的不同列,因此不再可以对其进行硬编码。 我的方法是包括一个validColumnIndexes:[Int]参数。 然后,我们遍历每个索引并返回该行中单元格的映射。

 静态函数removeUnneededColumns(fromTable表:[[String]],validColumnIndexes:[Int])-> [[String]] { 
 返回table.map {(行:[String])在 
 返回takeNeededColumns(行:行,有效列索引:有效列索引) 
  } 
  } 
 私有静态函数takeNeededColumns(行:[String],validColumnIndexes:[Int])-> [String] { 
 返回validColumnIndexes.map {row [$ 0]} 
  } 

。评估()

我们的评估方法也需要更改,因为在接受特定类型的数组之前。 为了解决这个问题,我创建了WeatherRecord和FootballResult都符合的DifferenceCalculatable协议。

 协议差异可计算{ 
  var名称:字符串{get} 
  var差异:Double {get} 
  } 

这样一来,我们就可以创建一个通用的评估方法,该方法的类型必须限制在DifferenceCalculatable中,从而可以访问.difference和.name,

 静态函数评价(项:[元素])->字符串?  { 
 令lettDelta = items.minElement {$ 0.difference <$ 1.difference} 
 警卫队让名字= minimumDelta?.name其他{返回nil} 
 返回“ \(名称)” 
  } 

符合DifferenceCalculatable意味着我必须将WeatherRecord的let dayOfMonthIndex:Int更改为name:String及其相应的init方法。

记得要保持干燥