Как создать хороший универсальный API для построения строк?
В наших приложениях мне часто нужно загружать изображения для таких элементов пользовательского интерфейса, как кнопки. Есть несколько вариантов каждого изображения, например, пейзаж / портрет, отключено / включено, нажата / обычная и даже цвета, такие как белый / красный / серый. Код загрузки имеет несколько переменных, которые сообщают ему, какой вариант загружать. В качестве примера рассмотрим следующий пример класса кнопок:
enum {
SampleImageButtonRed,
SampleImageButtonWhite
} SampleImageButtonStyle;
@interface SampleImageButton : NSObject
@property(assign) SampleImageButtonStyle style;
@property(assign) BOOL landscape;
@property(assign) BOOL disabled;
@property(assign) BOOL pushed;
@end
Здесь код загрузки должен посмотреть на свойства и загрузить button_white_pushed.png
, button_red_landscape.png
и так далее, в зависимости от типа кнопки. Код концептуально прост (только некоторое форматирование строки и [UIImage imageNamed:]
звонки), но в то же время много шума и шаблонов.
Я пытался придумать простой вспомогательный класс, который бы облегчил это. Класс будет принимать правила, сопоставляющие свойства с результирующим именем изображения, затем он будет получать действительные значения свойств и возвращать соответствующее изображение. Что-то вроде:
ImageBuilder *builder = [[ImageBuilder alloc] init];
[[[builder record] setPathTag:@"button_red"] setButtonStyle:SampleImageButtonRed];
[[[builder record] setPathTag:@"button_white"] setButtonType:SampleImageButtonWhite];
[[[builder record] setPathTag:@"disabled"] setDisabled:YES];
[[[builder record] setPathTag:@"enabled"] setDisabled:NO];
[[[builder record] setPathTag:@"landscape"] setLandscape:YES];
[[[builder record] setPathTag:@"portrait"] setLandscape:NO];
И тогда я бы назвал что-то вроде этого:
// would load “button_red_enabled.png”
UIImage *texture = [[[builder image]
setButtonStyle:SampleImageButtonRed]
setDisabled:NO];
В данный момент меня не интересует, стоит ли дополнительная сложность, меня интересует дизайн и реализация API. Я думаю, что API записи может работать, а API запросов - нет, так как setButtonStyle:
возвращается void
и, следовательно, я не могу связать звонки или вернуть изображение.
У вас есть идеи для хорошего общего API для этой проблемы, которая может работать?