花样操作符重载-让我感到忧心.

2015-04-23 18:56:49 +08:00
 banxi1988

从前学习 C++的时候,认识到各种花样的操作符重载的问题,引起过不少争论和问题
因此有很多语言是不提供操作符重载的.

Swift 的操作符重载支持说明

现在 Swift 是我所知对操作符重载支持最好的语言了.
各种自定义支持
示例:
Swift
prefix func - (vector: Vector2D) -> Vector2D {
return Vector2D(x: -vector.x, y: -vector.y)
}

参考:
https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/AdvancedOperators.html#//apple_ref/doc/uid/TP40014097-CH27-ID28

还可以重新声明各种运算符,如:
Swift
infix operator +- { associativity left precedence 140 }

文档中的一符操作符重载还是,比较直观易懂的.

两个开源库对操作符重载的使用

下面是我所忧心的:
今天在Github 趋势中浏览 Swift 项目时,
发现一个 JSON 序列化的库: https://github.com/thoughtbot/Argo
主页的上的一个花样运算符重载马上让我惊呆了:
Swift
static func decode(j: JSONValue) -> User? {
return User.create
<^> j <| "id"
<*> j <| "name"
<*> j <|? "email" // Use ? for parsing optional values
<*> j <| "role" // Custom types that also conform to JSONDecodable just work
<*> j <| ["company", "name"] // Parse nested objects
<*> j <|| "friends" // parse arrays of objects
}

我是比较笨的人,看了一陈子,没有明白这样的操作符重载是为哪般.
明显是增加代码理解难度嘛.

别个一个出名的 Swift 库对此则克制一些.
Bond https://github.com/SwiftBond/Bond
主要定义了以下三个新的操作符:
Swift
infix operator ->> { associativity left precedence 105 }
infix operator ->| { associativity left precedence 105 }
infix operator <->> { associativity left precedence 100 }

不过不看源代码, 还是不好明白这些操作符到底要做什么..

总结

我忧心的是,Swift 中各种花样操作符重载的 让代码难以理解.

2349 次点击
所在节点    程序员
2 条回复
saintarion
2015-04-24 15:11:57 +08:00
强大的操作符重载有利于开发DSL,但是会带来各种隐藏实现和黑魔法,这是双刃剑,在封闭环境领域会很有作用,但是不利于标准化,难于维护重构。就像是scala,学院派很欢迎,充满了学术气息和优美的语法,就像是哈利波特的世界,迷人但是神秘,还排斥麻瓜。
banxi1988
2015-04-24 15:37:24 +08:00
@saintarion 但是我看到我上面所例的JSON序列化使用操作符重载的例子,我就没有觉得有任何好处,除了可能少了几个字符.
而且,像这种象形式的写法真的好吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/185792

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX