Позвольте мне начать с того, что я начал программировать на Visual / Real Basic, а затем перешел на Java, поэтому я довольно привык к синтаксису точек. Однако когда я наконец перешел на Objective-C и привык к скобкам, а затем увидел введение Objective-C 2.0 и его точечный синтаксис, я понял, что мне это действительно не нравится. (для других языков нормально, потому что так катят).
У меня есть три основных недостатка с точечным синтаксисом в Objective-C:
Говядина №1: из-за этого неясно, почему вы можете получать ошибки. Например, если у меня есть строка:
something.frame.origin.x = 42;
Тогда я получу ошибку компилятора, потому что something
это объект, и вы не можете использовать структуры объекта в качестве lvalue выражения. Однако, если у меня есть:
something.frame.origin.x = 42;
Тогда это компилируется нормально, потому something
что сама структура имеет член NSRect, и я могу использовать ее как lvalue.
Если бы я использовал этот код, мне бы пришлось потратить некоторое время, пытаясь понять, что это something
такое. Это структура? Это объект? Однако, когда мы используем синтаксис скобок, он становится намного яснее:
[something setFrame:newFrame];
В этом случае нет никакой двусмысленности, something
является ли объект объектом или нет. Введение двусмысленности - моя претензия №1.
Говядина №2: в C синтаксис с точкой используется для доступа к членам структур, а не для вызова методов. Программисты могут переопределить setFoo:
и foo
Методы объектов, но до сих пор доступ к ним через something.foo
. На мой взгляд, когда я вижу выражения, использующие точечный синтаксис, я ожидаю, что они будут простым назначением в ivar. Это не всегда так. Рассмотрим объект контроллера, который является посредником между массивом и табличным представлением. Если бы я позвонил , то подумал бы: «Ага, метод. Мне нужно посмотреть определение этого метода, чтобы убедиться, что я знаю, что он делает».myController.contentArray = newArray;
, я ожидаю, что он заменит старый массив новым. Однако исходный программист мог setContentArray:
не только установить массив, но и перезагрузить табличное представление. Судя по строке, нет никаких указаний на такое поведение. Если бы я увидел[myController setContentArray:newArray];
Итак, я думаю, что мое резюме Beef # 2 состоит в том, что вы можете переопределить значение синтаксиса точки с помощью специального кода.
Говядина №3: Я думаю, это плохо выглядит. Как программист Objective-C, я полностью привык к синтаксису в скобках, так что читать и видеть строки и строки красивых скобок, а затем внезапно ломаться с и foo.name = newName; foo.size = newSize;
т.д. меня немного отвлекает. Я понимаю, что для некоторых вещей требуется точечный синтаксис (структуры C), но это единственный раз, когда я их использую.
Конечно, если вы пишете код для себя, используйте то, что вам удобно. Но если вы пишете код, который планируете использовать с открытым исходным кодом, или пишете что-то, что не ожидаете поддерживать вечно, я настоятельно рекомендую использовать синтаксис скобок. Это, конечно, только мое мнение.
Недавнее сообщение в блоге против синтаксиса точки: http://weblog.bignerdranch.com/?p=83
Опровержение вышеуказанного сообщения: http://eschatologist.net/blog/?p=226 (с оригинальной статьей в пользу синтаксиса с точкой: http://eschatologist.net/blog/?p=160 )