作者 | Erik Engheim
译者 | 弯月
出品 | CSDN(ID:CSDNnews)
从已有代码的扩展和重用方面考虑 , 这几种语言的类扩展、duck type( 鸭子类型)和多分发孰优孰劣?
面向对象编程(OOP)是组织大型程序的方式之一 , 但并不是唯一的方式 。 本文将从代码重用的角度比较Swift、Go和Julia 。 Swift采用了OOP方式 , 还支持接口和类扩展 。 Go尝试从新的角度考虑代码重用问题 , 在静态类型语言中引入了duck类型 。 而Julia拒绝使用OOP范式 , 而是发明了自己的范式:多分发 。
下面 , 我们就来看看每种方式的优缺点 。
文章图片
Swift协议和类扩展
如果你想要传统的面向对象编程 , 那么很少有主流语言能打败Swift 。 没错 , 我的意思是 , 虽然Java和C#等语言与Swift差不多 , 但都不如Swift 。 那么Python如何?Python是一门优秀的面向对象语言 。 但这种比较不太容易 , 因为Python是动态类型 。 而Swift是静态类型 , 因此与Java或C#比较更容易 。
但究竟是什么让Swift 成为了一个强力的面向对象语言?答案是类扩展和协议 。 下面是最近的一段代码中的例子 。 我需要在有序数组中支持二分查找 。 这样就能在O(log N)的时间内找到数组中的某个元素 , 例如8 , 同时不需要检查每个元素 。 下面是Swift代码:
但Swift中的数组并不支持binarySearch 。 一些习惯了传统OOP语言的人可能会选择创建数组的子类 。 但是这会导致混乱的继承结构 。 继承应当用于表示新概念 , 而不是用来添加新功能 。
但是在Swift中 , 你可以扩展接口(Swift称之为协议)来添加新方法 。 Swift的Array类实现了RandomAccessCollection接口 , 它属于标准库 。 但我们可以向这个接口添加任何新方法 。 我们甚至可以提供默认实现:
你几乎可以扩展任何东西 , 而不仅仅是接口 。 你也可以扩展类、枚举和结构 。 NSRange是一个结构(值语义的类) , 表示范围 。 它可以表示诸如文本视图中选中的文本 , 或字体和颜色均相同的一段字符 。 我编写了自己的WrittenDoc类 , 用于容纳可以打标签的文本 。 我希望创建一个范围 , 表示从一个标签到下一个标签 。 因此只需要扩展NSRange结构 , 给它一个额外的初始化器:
这个特性可以实现许多想都不敢想的事情 。 例如 , 在Swift中 , 一个字符串可以自己在屏幕上描绘自己 。 听起来这不像是正确的设计 , 因为这样需要把GUI和图形代码放到核心库中 。 但是 , Swift并不是这样做的 。 如果只导入Foundation库 , 描绘功能是无法使用的 。
但是 , 如果还导入了Cocoa库 , 就会包含一个针对String的类扩展 , 允许字符串描绘自己 。 这样 , 扩展就可以应用到不同的库中 。 图形相关的代码可以专门放到图形库中 , 但依然可以扩展基本类型 。
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
