V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
banxi1988
V2EX  ›  程序员

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

  •  
  •   banxi1988 ·
    banxi1988 · 2015-04-23 18:56:49 +08:00 · 2358 次点击
    这是一个创建于 3508 天前的主题,其中的信息可能已经有所发展或是发生改变。

    从前学习 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 中各种花样操作符重载的 让代码难以理解.

    2 条回复    2015-04-24 15:37:24 +08:00
    saintarion
        1
    saintarion  
       2015-04-24 15:11:57 +08:00   ❤️ 1
    强大的操作符重载有利于开发DSL,但是会带来各种隐藏实现和黑魔法,这是双刃剑,在封闭环境领域会很有作用,但是不利于标准化,难于维护重构。就像是scala,学院派很欢迎,充满了学术气息和优美的语法,就像是哈利波特的世界,迷人但是神秘,还排斥麻瓜。
    banxi1988
        2
    banxi1988  
    OP
       2015-04-24 15:37:24 +08:00
    @saintarion 但是我看到我上面所例的JSON序列化使用操作符重载的例子,我就没有觉得有任何好处,除了可能少了几个字符.
    而且,像这种象形式的写法真的好吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2152 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 00:45 · PVG 08:45 · LAX 16:45 · JFK 19:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.