Позвольте мне начать с того, что я начал программировать на 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.
Beef # 2: В C точечный синтаксис используется для доступа к членам структур, а не к вызовам методов. Программисты могут переопределять методы setFoo:
и foo
объектов, но при этом получать к ним доступ через something.foo
. По-моему, когда я вижу выражения, использующие точечный синтаксис, я ожидаю, что они будут простым назначением в ивар. Это не всегда так. Рассмотрим объект контроллера, который является посредником массива и табличного представления. Если я вызову 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)