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

各位对objc的语法怎么看?

  •  
  •   frogs · 2013-09-15 22:09:16 +08:00 · 9472 次点击
    这是一个创建于 3847 天前的主题,其中的信息可能已经有所发展或是发生改变。
    写c和python程序好多年,觉得自己对语言的语法洁癖越来越厉害了。
    觉得ojbc的语法真是啰嗦,写个程序屏幕上满满的字。。真觉得苹果公司该出obj3.0了。
    57 条回复    1970-01-01 08:00:00 +08:00
    lidashuang
        1
    lidashuang  
       2013-09-15 22:16:14 +08:00
    同意,不喜欢
    ispinfx
        2
    ispinfx  
       2013-09-15 23:00:59 +08:00
    语法洁癖越来越严重了+1
    echo1937
        3
    echo1937  
       2013-09-15 23:15:57 +08:00
    不好意思,我看成odbc了.
    shinwood
        4
    shinwood  
       2013-09-15 23:23:54 +08:00
    可读性奇差无比,我本以为 Java 够啰嗦了,没想到 Objective-C 将 Java 直接给秒成渣了。
    frogs
        5
    frogs  
    OP
       2013-09-15 23:41:24 +08:00
    @lidashuang
    @ispinfx
    @echo1937
    @shinwood
    貌似大家都对objc怨念颇深。不知道苹果公司的人怎么想,这边有谁能给苹果公司写个吐槽的邮件。。
    xiaoye5200
        6
    xiaoye5200  
       2013-09-16 00:03:37 +08:00
    有慢慢在优化,有感觉到,但是到完美简明语法还有距离,急也没用,吐槽也没用
    liuxurong
        7
    liuxurong  
       2013-09-16 00:07:33 +08:00
    还是 Python 最整洁。
    Hysteria
        8
    Hysteria  
       2013-09-16 00:08:07 +08:00
    大学时候只用过c/c++,毕业之后一直使用OC。觉得已经习惯了这种很长很长的变量名、方法名了,可读性很高啊,缺点只是打起来麻烦。
    cyberscorpio
        9
    cyberscorpio  
       2013-09-16 00:30:13 +08:00
    我很喜欢 objc 这种自描述的函数调用方式。
    goodan
        10
    goodan  
       2013-09-16 00:33:48 +08:00 via iPhone
    喜欢…
    像读英文诗句…
    liaa
        11
    liaa  
       2013-09-16 01:08:17 +08:00
    看楼上说喜欢可读性很长的变量名,方法名很有同感, 比如: isLatestNoticeDateChanged ...求破
    ipconfiger
        12
    ipconfiger  
       2013-09-16 01:21:43 +08:00
    有靠谱的自动完成就不怕函数变量名长了
    xsown
        13
    xsown  
       2013-09-16 02:15:10 +08:00   ❤️ 1
    刚学的时候看着不习惯,学会了以后很喜欢,尤其是 + 表示 class method,- 表示 instance method,很可爱阿有木有

    然后就是方法的声明/调用格式,[reader readContentsFromFileNamed:file async:YES charset:UTF8]; 比起 reader.readContentsFromFile(file, YES, UTF8); 明显更清晰,各参数的意义一目了然,而且如 @goodan 所说,有英文句子的美感,看着很舒服
    alexrezit
        14
    alexrezit  
       2013-09-16 06:33:43 +08:00 via iPhone   ❤️ 1
    写 Python 神烦. 从来记不住有几个参数, 每个参数都是啥.
    angelface
        15
    angelface  
       2013-09-16 06:56:40 +08:00 via iPhone   ❤️ 1
    喜欢的不得了,简直完美,变量长并不是语言的问题objc并没有不然你使用短变量比如:NSString *a,短方法发明比如-(void)b;但问题是这样命名后你以后怎么维护呢,所以我宁愿-(void)updateRectIfNessesary;直观明了,名字长点怕什么,有自动完成呢。另外我喜欢objc的原因是即有java这样的OO,又不失c这样的简洁。更不用说命名参数了,前两天还和别人赞叹Apple的API完美的就像Apple的硬件一样,简单明了,基本不用常看文档就知道什么作用,没有oc的语法支持还真做不到,还有太多让人喜欢的地方了,就不一一列举。
    anerevol
        16
    anerevol  
       2013-09-16 07:23:28 +08:00
    想到一句话,Don't make me think。
    1. 用objective-C调用多个参数函数时候不用思考参数的位置。
    2. objective-C里面缩写较少,就算你第一次用这个函数基本上就能清楚这个函数是干嘛的,很多c函数的缩写太厉害,每次看到缩写就会不自觉的停顿下想想是什么的缩写。
    每次写代码的时候如果被1,2这样的情况打断多次就会觉得很不爽...
    代码是写给人看的嘛,挺喜欢objective-C的。
    hanf
        17
    hanf  
       2013-09-16 08:46:14 +08:00
    smalltalk的拙劣模仿,强扭的瓜
    kavi
        18
    kavi  
       2013-09-16 08:53:49 +08:00
    如果没有自动补全,objective-c 真不知道该怎么写了 = =!
    Numbcoder
        19
    Numbcoder  
       2013-09-16 09:02:41 +08:00
    非常喜欢 smalltalk 式的语法。
    可读性非常好,函数调用基本上不用看文档就知道什么意思。

    如果你的函数名定义的好,你也不用写什么文档注释,别人一看就懂。
    frogs
        20
    frogs  
    OP
       2013-09-16 09:03:25 +08:00
    @anerevol
    如果这么说的话,到还觉得有点道理。
    不过觉得苹果公司还是该与时俱进了。
    在大部分人都习惯string1 == string2这种语法的时候,
    苹果还固守着[string1 isEqualToString string2]这种语法,真让人觉得顽固不化。
    alexrezit
        21
    alexrezit  
       2013-09-16 09:19:12 +08:00
    @frogs
    == 比较的是内存地址, 如果用它来比较字符串内容的话, 那用什么来比较内存地址?
    fgwww
        22
    fgwww  
       2013-09-16 09:43:01 +08:00
    喜欢简洁的话,看看这个:
    component.setCentered(true, false);
    event.initKeyEvent("keypress", true, true, null, null,
    false, false, false, false, 9, 0);

    现在感觉如何了?
    lijia18
        23
    lijia18  
       2013-09-16 09:45:37 +08:00
    喜欢oc的语法,很强大,很清晰。
    SearchDream
        24
    SearchDream  
       2013-09-16 09:54:37 +08:00
    @anerevol Don't make me think +1
    chchwy
        25
    chchwy  
       2013-09-16 09:54:56 +08:00
    有Xocde的自動補全下,我只能說Objective-C的語法超棒,語句即文檔。
    fangzhzh
        26
    fangzhzh  
       2013-09-16 09:56:23 +08:00 via Android
    喜欢obj的库 靠猜都可以写代码
    PrideChung
        27
    PrideChung  
       2013-09-16 09:57:57 +08:00
    @frogs 不觉得有多啰嗦,字符数不等于可读性,强制命名参数可以消灭很多查文档的需求。
    一门语言的风格从诞生的时候就已经定下了,不要指望下个版本能有什么翻天覆地的变化。
    ldehai
        28
    ldehai  
       2013-09-16 10:02:59 +08:00
    一开始都这样,熟悉了就知道她的好了
    railgun
        29
    railgun  
       2013-09-16 10:13:42 +08:00
    习惯了……
    vingel
        30
    vingel  
       2013-09-16 10:32:23 +08:00
    我厂出品的一个 Objective-C 奇葩方法名,你们感受一下: [client responseContactRequestChangeContactWithRequest]
    66450146
        31
    66450146  
       2013-09-16 10:46:56 +08:00
    如果苹果提供的是一个命令行编译器而不是整个 IDE 的话,这语言确实很屎

    冗长的名称让它高度依赖 IDE,但是一个补全能力强大的 IDE 则可以让这种缺点变成一个特性。这样的名字可以减少很多查询文档的必要,也让查文档容易很多
    dorentus
        32
    dorentus  
       2013-09-16 10:52:56 +08:00
    @frogs 操作符重载是双刃剑啊。再说同类的里面,只有 C++ 支持这个吧。
    PrideChung
        33
    PrideChung  
       2013-09-16 11:59:00 +08:00
    @vingel 方法名起得奇葩能怪编程语言?
    client.responseContactRequestChangeContactWithRequest()
    这样就没问题了?
    vingel
        34
    vingel  
       2013-09-16 12:01:57 +08:00
    @PrideChung 我这又没怪 oc。

    我举例是为了说明,再好的语言也经不起人们瞎用。
    chisj
        35
    chisj  
       2013-09-16 12:16:21 +08:00
    自从加强了@的语法糖功能和[]的作用,我觉得objc几乎完美了。
    meta
        36
    meta  
       2013-09-16 12:29:17 +08:00
    我觉得objc语法上是比较别扭,但是语意还是很清晰的,像c++那种,格式看起来简洁,其实代码读起来相当费劲。
    timothyye
        37
    timothyye  
       2013-09-16 12:32:11 +08:00
    来黑一下,this is objc: [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
    so898
        38
    so898  
       2013-09-16 12:41:18 +08:00
    @frogs
    这里 == 应该是继承自C/C++的对比内存地址,貌似这货在某个SDK下会被标注为warming
    isEqualToString: 对比的是两个NSString的值
    楼主你不能把这两个当成一样的东西……

    至于两个方法为啥都存在,估计是为了方便继承C/C++代码,或者说OB-C和C/C++混写
    fgwww
        39
    fgwww  
       2013-09-16 12:55:23 +08:00
    @timothyye a->b.c->d.e->f.g->h->i.j->k->l.m->n->o.p->q->r.s->t->u.v->w.x->y.z
    PrideChung
        40
    PrideChung  
       2013-09-16 12:56:18 +08:00
    @frogs isEqualToString: 有什么难以接受的, 比较内存地址才是 == 本来的作用,其他语言里面能够用来比较字符串内容要么是运算符重载要么是编译器或者解析器动了手脚罢了。
    angelface
        41
    angelface  
       2013-09-16 12:58:57 +08:00
    @timothyye [tab]
    [tab]
    [tab]
    [tab]
    [tab]
    [tab]
    [100行后] [...]
    frogs
        42
    frogs  
    OP
       2013-09-16 12:59:22 +08:00
    @alexrezit
    @so898
    写了这么多年c,重来没用到过需要比较两个字符串地址的时候。
    当然我这个只是举个例子而已,类似这种的冗余语法还有很多。
    meta
        43
    meta  
       2013-09-16 13:07:57 +08:00
    @timothyye 如果这样的话,
    js就是:func()()()()()()()()()
    java就是:a.b.c.d.e.f.g
    perl就是:$_*&^$#%&()$
    alexrezit
        44
    alexrezit  
       2013-09-16 13:14:46 +08:00
    @frogs
    没写过 C, 难道 C 不需要 strcmp? stringA 和 stringB 本来就是两个 pointer, pointer 用 == 只能比较地址.
    ultragtx
        45
    ultragtx  
       2013-09-16 13:59:44 +08:00
    我一直想知道喷objc-c语法的到底写过obj-c多长时间,以及是不是用Xcode写
    davepkxxx
        46
    davepkxxx  
       2013-09-16 14:32:07 +08:00
    @meta lisp (a (b (c (d (e (f (g (h (i (j (k (l (m (n (o (p (q (r (s (t (u (v (w (x (y (z 1) 2) 3) 4) 5) 6) 7) 8) 9) 10) 11 ) 12) 13) 14) 15) 16) 17) 18) 19) 20) 21) 22) 23) 24) 25) 26)
    vincenttone
        47
    vincenttone  
       2013-09-16 14:32:33 +08:00   ❤️ 1
    我用过几个语言,多数是类似c语法的,用ObjC的时候确实感觉有些奇怪,但如果深入的用一段时间,我觉得还挺好的。ObjC相对来讲算是比较易读的了,比如你定义一个方法名:
    - (BOOL) checkWithUserName: (NSString *) username
    andPassword: (NSString *) password;
    这样的方法名定义不是挺好的吗? 很明显的英文。
    如果用Python呢?
    def checkByUserNameAndPassword(self, uname, pwd):
    # xxxx
    但是我为什么要写self呢?很多人说self是为了语义清晰,但是我就是不喜欢,因为我用python的时间不够长,理解不了太深刻的Python的东西,我就喜欢用起来简单。甚至有些人会吐槽python的缩进语法机制。

    我想说其实有时候一个东西好的地方可能恰恰是它的缺点。

    写Ruby的时候听说Ruby很耗资源,就四处说,但是ruby在语法上的便利是非常棒的。
    说PHP现在的状态是一团糟(其实我也这么认为),但是有什么关系呢,PHP本来就是为了更容易让用户学习和使用来设计的。
    js的语法,很多人觉得糟透了,但是他的动态特性反而也是这么表现出来的。
    lisp大家也都知道,括号,但是括号对于lisp来很重要。
    学Erlang时发现变量变不了,会吐槽我擦为什么变不了还叫变量啊!但是Erlang的变量为并行化做了不少事情。
    很多人觉得c太简单,觉得c++太复杂,但这也是他们的强大的地方。

    但是变量名太长如果没有XCode输入会吐血,这个我认同。
    tab
        48
    tab  
       2013-09-16 14:42:40 +08:00
    只有刚上手的时候觉得getter和setter的声明很诡异,习惯以后就还好了。
    无疑OC是语法非常简练,易学易上手。现在做游戏开发写C++感觉很多地方都复杂混乱,没有统一的标准。就拿String来说,很多类库会自己定义,搞得我晕头转向。
    另外我觉得OC和iOS SDK以及XCode已经到水乳交融、不可分割的地步了,毫无疑问这是一套非常成熟用起来非常舒服的组合(或者叫有机整体)。很多人不习惯是由于没有阅读官方文档或者不习惯不够了解iOS的API,甚至都没真正做过开发,如果只是看了表面语法就来喷的童鞋还是真正体会一段时间再说吧,相信会让你看到不一样的地方。
    refresh
        49
    refresh  
       2013-09-16 15:51:53 +08:00   ❤️ 1
    刚写还好,写多就习惯了,还挺好的,是有点冗长,特别是参数过多的时候
    frogs
        50
    frogs  
    OP
       2013-09-16 18:24:53 +08:00
    @ultragtx
    你的这个问题让我想起一句话。”吐着吐着就习惯了“
    开个玩笑,不要介意。
    offspring
        51
    offspring  
       2013-09-16 19:47:18 +08:00
    @timothyye 没人让你嵌套这么多层
    Linxing
        52
    Linxing  
       2013-09-17 17:55:43 +08:00
    刚刚开始写确实不习惯,久了之后就会觉得很多时候都没必要写注释了
    hengxin196
        53
    hengxin196  
       2013-09-17 20:04:06 +08:00
    @timothyye 建议不要超过三层
    觉得oc 可读性很好呀 不需要注释
    everedit
        54
    everedit  
       2013-09-17 20:26:28 +08:00 via iPad
    不喜欢objc
    wupher
        55
    wupher  
       2013-09-17 21:04:12 +08:00
    不明白一门语言的美,很难真正掌握它,使用好它。
    leafduo
        56
    leafduo  
       2013-09-17 21:53:05 +08:00
    感觉在黑的都是没怎么写过 OC 的……

    我自己认为 OC 的可读性是相当好的,就位置参数一点就完杀大部分语言。Java 的不自由跟 OC 的 verbosity 完全是两回事,OC 写出来虽然很长,但是跟 plain English 很像,基本不需要解释,可读性好。

    关于 -isEqualToString:,这个是因为不支持运算符重载吧,我觉得都好。
    Ricepig
        57
    Ricepig  
       2013-09-17 23:24:37 +08:00 via iPhone
    从某些特制来说蛮像c# vs和.net framework组合的。

    有了强力ide以后,变量名函数名的易读性是第一位的,长度倒是无关紧要了。但是用着编辑器写程序的开发者就会觉得不够简洁了。

    括号的问题也是同样,强力ide支持下勉强能收放自如。可读性倒是问题不大,但是在修改的时候还是有点儿麻烦。

    需要吐槽的就是sdk里类的各种前缀,NS什么的,能用个namespace什么的吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2873 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 11:17 · PVG 19:17 · LAX 04:17 · JFK 07:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.