Почему бы не запустить удобные конструкторы с помощью «с»? - PullRequest
8 голосов
/ 19 июня 2009

Одна из вещей, которые мне больше всего нравятся в какао, это коэффициент читаемости.

Одна из вещей, которая меня раздражает больше всего, - это соглашение конструкторов удобства для принудительного повторения.

Вот пример:

[NSString stringWithString:s]

[NSNumber numberWithDouble:d]

[NSValue valueWithInt:i]

[NSDictionary dictionaryWithObjectsAndKeys:<blah>]

и т.д.

Почему конвенция просто не запускает конструкторы удобства со словом "with"? так что тогда мы будем иметь:

[NSString withString:s]

[NSNumber withDouble:d]

[NSValue withInt:i]

[NSDictionary withObjectsAndKeys:<blah>]

и т.д.

Это небольшой вопрос для обсуждения, но я подумал, что просто выброшу туда и посмотрю, сможет ли кто-нибудь с большим влиянием, чем я, объяснить все эхо в моей голове.

Очевидно, я не собираюсь ходатайствовать перед AAPL о переписывании appKit в пользу моего предложения, но есть ли какие-либо аргументы против именования моих собственных конструкторов удобства как таковых?

Конечно, я могу использовать любые условные обозначения, которые я хочу, в моем собственном коде, но я ненавижу слепо плыть вверх по течению.

Ответы [ 6 ]

13 голосов
/ 20 июня 2009

На самом деле техническая причина такова. Если бы каждый метод shoelaceWithString: -типа был изменен на withString:, мы бы получили ужасно огромное количество классов с одинаково именованными методами и разными сигнатурами. Это приводит к обману при статической проверке типов компилятора и может привести к появлению всевозможных раздражающих и ненужных предупреждений.

Есть также аспект культуры какао, когда разработчикам нравится, что их код самодокументируется. Это означает, что имена методов указывают как их аргументы, так и то, что они возвращают. Руководящие принципы Apple по кодированию на самом деле предупреждают о методах с неопределенными именами, предлагая, чтобы добавление слов к имени, чтобы прояснить, что метод делает, является предпочтительным.

10 голосов
/ 19 июня 2009

Потому что это соответствует.

Существуют такие методы, как:

[NSDictionary dictionary]
[NSArray array]

Избавиться от всего, вплоть до with, здесь явно не вариант. Сохранение этих, но сокращение других приведет к несогласованности в названии удобных методов.

А удобные методы соответствуют методам init и initWith….

3 голосов
/ 20 июня 2009

В конечном счете, я считаю, что философия Objective-C, воплощенная в инфраструктурах Какао (и до этого в инфраструктурах NextStep), заключается в том, что явное и простое в обслуживании преимущество имеет приоритет над краткостью кода. Основным доказательством этой философии является то, что селекторы Objective C назвали аргументы (например, -[NSObject performSelector:withObject:]).

В случае фабричных методов, таких как +[NSString stringWithString:], вы должны помнить, что подклассы могут переопределять эти методы класса, чтобы возвращать подклассы (например, кластеры классов, такие как NSNumber).

Таким образом, вы можете получить вызов типа [MyPoorlyNamedSubclass stringWithString:], и в этом случае -[MyPoorlyNamedSubclass withString:] не будет явно информативным в отношении типа возвращаемого объекта (напомним, что многие фабричные методы возвращают тип id). stringWithString:, с другой стороны, дает понять, что метод вернет строку (или ее подкласс).

3 голосов
/ 19 июня 2009

Я думаю, что это всего лишь часть общей философии многословия «какао». Несколько вариантов выбора:

[UIView setAnimationBeginsFromCurrentState]
[UITableView scrollToNearestSelectedRowAtScrollPosition]
[UIApplication didRegisterForRemoteNotificationsWithDeviceToken]

и т.д.

ETA:

Чтобы ответить на вопросы, касающиеся конкретно конструкторов, мне нравится то, как они выполняются, в x-коде легко определить, какие методы являются методами типа конструктора. Например, вы начинаете печатать:

[NSString string

И «intellisense» сокращает список методов до тех, которые начинаются со слова «string», которые, конечно, являются всеми методами конструктора (и все удобно сгруппированы вместе). То же самое относится и к соглашению "init".

2 голосов
/ 22 июня 2009

Они также используют это одно дополнительное слово, чтобы сказать, является ли объект автоматически выпущенным или нет. initWithFormat предназначен для не-автоматического освобождения, а когда его stringWithFormat, то оно автоматически выпущено ... Я полагаю, они просто использовали этот способ, чтобы сообщить читателю, какой тип управления памятью использует объект ...

0 голосов
/ 19 июня 2009

Если вам это не нравится, почему бы не написать кучу операторов #define, которые вы включаете во все свои проекты?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...