методы: несколько параметров или структура? - PullRequest
2 голосов
/ 03 декабря 2008

Я заметил, глядя на пример кода от Apple, что они склонны разрабатывать методы, которые получают структуры вместо нескольких параметров. Это почему? Что касается простоты использования, я лично предпочитаю последнее, но что касается производительности, есть ли один лучший выбор, чем другой?

[pencil drawPoint:Point3Make(20,40,60)]
[pencil drawPointAtX:20 Y:50 Z:60] 

Ответы [ 2 ]

5 голосов
/ 03 декабря 2008

Не путайте этот вопрос с проблемами производительности. Не делайте преждевременных оптимизаций (пока вы не узнаете, что у вас есть проблема), и когда вы думаете о проблемных точках производительности в вашем коде, это почти всегда в областях, связанных с вводом / выводом (например, база данных, файлы). Итак, разделите ваш вопрос о стиле передачи сообщений с производительностью. Вы хотите сначала принять наилучшее проектное решение , а затем оптимизировать производительность только при необходимости .

Учитывая вышесказанное, Apple не рекомендует и не предпочитает передавать несколько параметров структуре / объекту. Обобщая это вне области Objective-C, используйте отдельные параметры или объекты, когда это имеет смысл в конкретном сценарии. Другими словами, нет черно-белого ответа, которому вы могли бы следовать. Вместо этого используйте следующие рекомендации при принятии решения:

  • Передавать объекты / структуры, когда для метода имеет смысл понимать многие / все члены объекта
  • Передача объектов / структур, когда вы хотите проверить некоторые правила отношений между различными членами объекта. Это позволяет вам гарантировать, что потребитель вашего метода создает допустимый объект до вызова вашего метода (таким образом устраняя необходимость метода для проверки этих условий).
  • Передача отдельных аргументов, когда становится ясно, что метод имеет смысл и требует только определенных элементов, а не всего объекта

Используя вариант вашего примера, метод рисования, который принимает две координаты (X и Y), выиграл бы от использования объекта Point, а не двух переменных, X и Y.

Метод retrieveOrderByIdAndName лучше всего разрабатывать, принимая один параметр id и name, а не какой-либо контейнерный объект.

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

1 голос
/ 03 декабря 2008

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

Вероятность снижения производительности, вероятно, ничтожна для такой простой структуры, как 3 балла. Используйте удобочитаемое / повторно используемое решение, а затем профилируйте свой код, если считаете, что он медленный:)

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