В настоящее время я принимаю некоторые решения для своего первого API-интерфейса target-c. Ничего особенного, просто небольшая помощь для себя, чтобы сделать вещи быстрее в будущем.
Прочитав несколько часов о различных шаблонах, таких как создание категорий, одиночные игры и т. Д., Я наткнулся на то, что мне нравится, потому что мне кажется, что его легко поддерживать. Я делаю набор полезных функций, которые могут быть полезны везде.
Итак, что я сделал:
1) Я создал два новых файла (.h, .m) и дал «классу» имя: SLUtilsMath, SLUtilsGraphics, SLUtilsSound и так далее. Я считаю это своего рода «пространством имен», поэтому все эти вещи всегда будут называться SLUtils ******. Я добавил их все в Group SL, который содержит подгруппу SLUtils.
2) Затем я просто помещаю сигнатуры своих функций в файл .h, а реализации функций - в файл .m. И угадайте, что: это работает! Я доволен этим, и им легко пользоваться. Единственная неприятность в том, что я должен включать соответствующий заголовок каждый раз, когда мне это нужно. Но это нормально, так как это нормально. Я мог бы включить его в файл pch префикса заголовка.
Но затем я пошел в туалет, и там появился призрак, сказавший: «Эй! Разве не лучше создавать реальные методы вместо функций? Разве вы не должны создавать классовые методы, чтобы вам приходилось вызывать метод, а не функция? Разве это не намного круче и не лучше? " Ну, для удобства чтения я предпочитаю функции. С другой стороны, у них нет таких «именованных параметров», как методы, a.f.a.i.k ..
Так что бы вы предпочли в этом случае?
Конечно, я не хочу выделять объект перед использованием полезного метода или функции. Это было бы мучительно.
Может быть, туалетный призрак был прав. Есть более крутой способ. Ну, лично для меня это здорово:
MYNAMESPACECoolMath.h
#import <Foundation/Foundation.h>
@interface MYNAMESPACECoolMath : NSObject {
}
+ (float)randomizeValue:(float)value byPercent:(float)percent;
+ (float)calculateHorizontalGravity:(CGPoint)p1 andPoint:(CGPoint)p2;
// and some more
@end
Затем в коде я просто импортировал бы этот MYNAMESPACECoolMath.h и просто вызвал:
CGFloat myValue = [MYNAMESPACECoolMath randomizeValue: 10.0f byPercent: 5.0f];
без неприятных реализаций, инициализации, выделения, что угодно. Для меня этот шаблон выглядит как статический метод в Java, который довольно приятен и прост в использовании.
Преимущество перед функцией, насколько я заметил, заключается в лучшей читаемости кода. Когда вы смотрите на CGRectMake (10.0f, 42.5f, 44.2f, 99.11f), вам, возможно, придется посмотреть, что означают эти параметры, если вы не очень знакомы с ним. Но когда у вас есть вызов метода с «именованными» параметрами, вы сразу видите, что это за параметр.
Я думаю, что упустил момент, который имеет большое значение для одноэлементного класса, когда речь идет о простых полезных методах / функциях, которые могут понадобиться везде. Создание специального вида случайных значений ни к чему не относится, оно глобально. Как трава. Как деревья. Как воздух. Это нужно всем.