Дозвольте мені почати з того, що я почав програмувати на Visual / Real Basic, а потім перейшов на Java, тому я досить звик до синтаксису крапок. Однак, коли я нарешті перейшов до Objective-C і звик до дужок, а потім побачив введення Objective-C 2.0 та його синтаксис крапок, я зрозумів, що мені це дійсно не подобається. (для інших мов це добре, бо саме так вони котяться).
У мене є три основні яловичі фігури із синтаксисом крапок у Objective-C:
Яловичина №1: незрозуміло, чому у вас можуть виникати помилки. Наприклад, якщо у мене є рядок:
something.frame.origin.x = 42;
Тоді я отримаю помилку компілятора, оскільки something
є об'єктом, і ви не можете використовувати структури об'єкта як значення l виразу. Однак, якщо я маю:
something.frame.origin.x = 42;
Тоді це компілюється просто чудово, оскільки something
це сама структура, яка має член NSRect, і я можу використовувати її як значення lvalue.
Якби я приймав цей код, мені потрібно було б витратити якийсь час, намагаючись з’ясувати, що something
це таке. Це структура? Це об’єкт? Однак, коли ми використовуємо синтаксис дужок, це стає набагато зрозумілішим:
[something setFrame:newFrame];
У цьому випадку немає абсолютно ніякої двозначності, something
є об'єктом чи ні. Введення двозначності - це моя яловичина №1.
Яловичина №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 )