Самый простой способ инкапсулировать несколько аргументов метода? - PullRequest
0 голосов
/ 17 января 2012
+ (Planet *)createPlanetInContext:(NSManagedObjectContext *)context 
                         withName:(NSString *)name 
                             type:(NSString *)type 
                            group:(NSString *)group 
                      andDiameter:(NSNumber *)diameter {

Если бы я хотел инкапсулировать аргументы «имя», «тип», «группа» и «диаметр» в одну сущность для передачи описанному выше методу, какой тип лучше использовать для инкапсуляции? Вышеприведенный метод является лишь быстрым примером, который, как вы могли бы поспорить, просто отлично представлен, но что если бы было еще много аргументов, которые нужно было передать. Мне нужно было бы упаковать данные перед вызовом метода, чтобы решение было быстрым и простым в настройке.

+ (Planet *)createPlanetWithData:(Data *)data inContext:(NSManagedObjectContext *)context {

Или это более соответствует практикам target-c (более читабельным) для индивидуального перечисления всех аргументов?

Ответы [ 4 ]

2 голосов
/ 17 января 2012

Чтение кода сложнее, чем написание кода, поэтому оптимизируйте его для удобства чтения. Короткость селекторов не должна быть фактором; ясность должна быть.

Спросите себя, какая версия более читабельна, и придерживайтесь этой. Я думаю, что это относительно очевидно, что версия с прямыми аргументами более читабельна.

Objective-C имеет прекрасный синтаксис для методов с несколькими аргументами, поэтому используйте его в своих интересах. На языке с c-подобным синтаксисом я также не решался бы использовать много аргументов.

2 голосов
/ 17 января 2012

Я бы сказал, что, как правило, вы хотели бы перечислить свои аргументы для ясности.Пример метода, который вы опубликовали выше, не очень длинный, в контексте Objective-C.

Это действительно связано с удобочитаемостью и документацией.Когда вы перечисляете все аргументы, разработчикам, приходящим в ваш проект, становится понятно, что и где передается, и какие объекты перемещаются вокруг.Автоматическая генерация документации (например, Doxygen) также особенно хорошо обрабатывает списки аргументов.

Но есть момент, когда, как вы говорите, он становится немного громоздким.Двадцать параметров для передачи, и ваши вызовы методов будут очень и очень длинными!Так что есть и другие доступные варианты - возможно, самый простой - использовать NSDictionary или аналогичный, который уже используется в iOS для пересылки определенных фрагментов данных (особенно с уведомлениями, где у вас есть словарь userInfo).

1 голос
/ 17 января 2012

Вы можете заполнить словарь одной парой ключ / значение для каждого свойства в NSManagedObject.

0 голосов
/ 17 января 2012

Если вы хотите быть очень гибким, вы можете использовать комментарий @ Novarg и передать словарь в качестве аргумента. Таким образом, вы можете добавлять в него параметры, не влияя на сигнатуру вашего метода.

У меня есть особые предпочтения для создания пользовательского объекта args для передачи в мои методы. Это не только обладает гибкостью словаря, но также может иметь некоторые встроенные утилиты или дополнительную логику. Кроме того, в отличие от словаря, вам не нужно жестко кодировать имена ключей и / или константы, и НАМНОГО проще для рефакторинга, если вам, скажем, нужно изменить имя свойство с использованием возможностей рефакторинга Xcode:

+ (Planet *)createPlanet:(PlanetArgs *)args
{
           //args.context
           //args.name
           //args.type
           //args.group
           //args.diameter   

           //Args can even have some built-in logic
           //planet.color = [args generateRandomColor]; <<-Just a rough idea
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...