Как я могу комбинировать методы с разными аргументами? - PullRequest
1 голос
/ 14 июля 2010

У меня есть четыре основных метода:

+ (NSArray *)findAll;
+ (NSArray *)findAllWithOrder:(NSArray *)order;
+ (NSArray *)findAllWithConditions:(NSDictionary *)conditions;
+ (NSArray *)findAllWithLimit:(NSRange)limit;

Кроме того, я хочу объединить эти методы (например, я могу find all по порядку и условиям). В настоящее время я делаю (все возможности, даже с аргументами в другом порядке, не показаны здесь):

+ (NSArray *)findAll;
+ (NSArray *)findAllWithOrder:(NSArray *)order;
+ (NSArray *)findAllWithConditions:(NSDictionary *)conditions;
+ (NSArray *)findAllWithLimit:(NSRange)limit;
+ (NSArray *)findAllWithOrder:(NSArray *)order conditions:(NSDictionary *)conditions;
+ (NSArray *)findAllWithOrder:(NSArray *)order limit:(NSRange)limit;
+ (NSArray *)findAllWithConditions:(NSDictionary *)conditions limit:(NSRange)limit;
+ (NSArray *)findAllWithOrder:(NSArray *)order conditions:(NSDictionary *)conditions limit:(NSRange)limit;

Но есть ли более простой способ, чем создание десятков методов для этого? Это было бы очень мило. Спасибо.

Ответы [ 4 ]

3 голосов
/ 14 июля 2010

Выберите тот, у которого есть все аргументы (findAllWithOrder:conditions:limit:), и используйте nil для определения неиспользуемых аргументов (или, в случае NSRange, { NSNotFound, 0 })

2 голосов
/ 14 июля 2010

Способ, которым Apple выполняет это, по моему мнению, является одним из лучших способов сделать это в Obj-C:

Определить универсальный метод, который принимает словарь options или битовую маскузатем внутри метода есть логика, которая на основе словаря или битовой маски выполнит соответствующий код.

0 голосов
/ 14 июля 2010

Для меня это выглядит как кандидат на шаблон проектирования Builder (http://en.wikipedia.org/wiki/Builder_pattern)

Вы создаете класс Finder с помощью методов:

-(void)searchOrder:(NSArray *)order;

-(void)searchCondition(NSDictionary *)conditions;

и т. Д. ... Эти методы устанавливают для членов объекта значения, которые вы передаете в этих методах.

Эти методы не являются обязательными, поэтому вы не можете вызывать (для объекта класса Finder) ни один из них(конечный эффект типа + (NSArray *)findAll; в вашей ситуации) или некоторые из них.

В конце вы вызываете объектный метод Finder, например -(NSArray *)find;, и у вас есть результаты.

0 голосов
/ 14 июля 2010

Нет, вот как ты это делаешь. Я уверен, что кто-то может найти способы обойти создание десятков подобных методов, но они очень редко используются. Обычно объекты Obj-C (особенно какао) имеют большое количество методов, которые незначительно отличаются друг от друга.

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