Swift有一个漏洞—一种类型驱动的开发

我喜欢Swift的类型系统。 首先,当我从大约两年前的Objective-C切换到时,我被它的前身所采用的动态方法所宠坏了,以至于我感到非常不舒服。 在写了几个小时的Swift之后,我很累。 我不得不遵循它的规则并投身于类型系统,但是直到我停止与它抗争并遵循它的建议才不久。 我们建立了联系。 如今,我觉得我们是好朋友。

自从我对Swift有了更多经验以来,我对静态类型语言的评价一直在稳定增长。 我无法想象在没有静态分析和编译时间检查的情况下编写任何代码。 即使使用Python编写脚本,编写一些Bash实用程序,我也害怕在没有任何证据证明其正确性的情况下运行该东西。

最近,我偶然发现了埃德温·布雷迪(Edwin Brady)的一本奇妙的书— Idris的类型驱动开发 。 Edwin是纯函数式语言Idris的创建者。 在本书的第一章中,他解释了本书的名称不是巧合,而且确实是在流行测试驱动开发方法。 在TDD中,我们首先编写测试。 测试使我们能够设计数据流,而无需过多地关注实现细节。 Edwin的想法也是如此,但与其编写测试,我们首先编写接受和返回类型的函数 Idris具有强大的字体系统,并且对Type-DD的重视不足为奇。 其销售功能是依赖类型 。 埃德温(Edwin)提出了一些非常简单的示例,在这些示例中正确使用类型可以使我们实现功能,而类型系统则使我们紧绷,因此我们不会做任何蠢事。 为了满足类型系统而不完成我们的实现,他引入了一个漏洞。 Hole是一个占位符,可以是您需要的任何类型,并且其类型由类型系统推断。 其目的是让您起草一个函数并快速跳转到下一个上下文并仅推迟其实现。

在编写Swift的一段时间里,我一直在使用一种非常相似的模式,在该模式中,我将使用fatalError来使编译器静音。

  func numberOfChildren(inRooms rooms:[Room])-> Int { 
   致命错误() 
  } 

上面的代码编译,编译器不会抱怨,因为fatalError调用abort()并且它知道程序的终止。 但是,如果我们可以满足编译器并继续运行该怎么办? 我认为这是一个很好的主意,并尝试模仿Idris的孔概念。 我创建了AHole 。 这是一个非常简单的孔实现。 只有一个公共协议AHoleType和一个公共函数_hole_()

  func _hole_ (文件:StaticString = #file,  
                            行:UInt = #line)-> A { 打印(“ AHole:在文件\(file)的行\(line)上为类型\(A.self)使用孔”) 
   返回A.holed() 
  } 

在存储库中,有第二个文件,该文件具有一些符合AHoleType的 Foundation类型。 您可以轻松地扩展对自己类型的一致性,并在应用程序中使用AHole 。 我添加了一个方便打印,它会通知您在代码中的位置和类型。

快乐的孔。

    Interesting Posts