Это не исчерпывающий список, но при принятии решения о том, следует ли передавать объект методу в качестве аргумента, необходимо учитывать некоторые из следующих факторов:
Является ли объект неизменным? Является ли функция «чистой»?
Побочные эффекты являются важным фактором для поддержки вашего кода. Когда вы видите код с множеством изменяемых объектов с изменяемым состоянием, которые передаются повсеместно, этот код часто менее интуитивен (так же, как глобальные переменные состояния часто могут быть менее интуитивно понятными), и отладка часто становится более трудной и временной. потребляя.
Как правило, старайтесь, насколько это возможно, гарантировать, что любые объекты, которые вы передаете методу, являются неизменными.
Избегайте (опять же, насколько это возможно) любой конструкции, в соответствии с которой ожидается, что состояние аргумента будет изменено в результате вызова функции - одним из самых сильных аргументов для этого подхода является Принцип наименьшего удивления ; т.е. кто-то читает ваш код и видит аргумент, переданный в функцию, «менее вероятно» ожидает, что его состояние изменится после того, как функция вернется.
Сколько аргументов у метода уже есть?
Методы с чрезмерно длинными списками аргументов (даже если большинство из этих аргументов имеют значения по умолчанию) начинают выглядеть как запах кода. Однако иногда такие функции необходимы, и вы можете подумать о создании класса, единственная цель которого - действовать как объект параметров .
Этот подход может включать небольшое количество дополнительного стандартного отображения кода из вашего «исходного» объекта в ваш объект параметров, однако это довольно низкая стоимость как с точки зрения производительности, так и сложности, и есть ряд преимуществ с точки зрения разделения и неизменность объекта.
Передается ли объект исключительно к «слою» в вашем приложении (например, ViewModel или объекту ORM?)
Подумайте о разделении интересов (SoC) . Иногда спрашивая себя, «принадлежит» ли объект к тому же слою или модулю, в котором существует ваш метод (например, отобранная вручную библиотека-обертка API или ваш базовый уровень бизнес-логики и т. Д.), Можно сообщить, действительно ли этот объект следует передать этому метод.
SoC является хорошей основой для написания чистого, слабосвязанного, модульного кода. например, объект сущности ORM (отображение между вашим кодом и схемой базы данных) в идеале не должен передаваться на вашем бизнес-уровне или, что еще хуже, на уровне презентации / пользовательского интерфейса.
В случае передачи данных между «слоями», передача параметров простых данных в метод обычно предпочтительнее, чем передача объекта из «неправильного» уровня. Хотя, вероятно, было бы неплохо иметь отдельные модели, которые существуют на «правильном» слое, на который вы можете вместо этого отображать.
Является ли сама функция слишком большой и / или сложной?
Когда функции требуется много элементов данных, возможно, стоит подумать, не выполняет ли эта функция слишком много обязанностей; Ищите потенциальные возможности для рефакторинга, используя меньшие объекты и более короткие, более простые функции.
Должна ли функция быть объектом команды / запроса?
В некоторых случаях связь между данными и функцией может быть тесной; в этих случаях подумайте, подходит ли вам объект Command или объект Query .
Вызывает ли добавление параметра объекта к методу содержащий класс принять новые зависимости?
Иногда самым сильным аргументом для аргументов «Обычные старые данные» является просто то, что принимающий класс уже аккуратно самодостаточен, и добавление параметра объекта к одному из его методов приведет к загрязнению класса (или, если класс уже загрязнен, тогда он будет усугубить существующую энтропию)
Вам действительно нужно обойти весь объект или вам нужна только небольшая часть интерфейса этого объекта?
Рассмотрим принцип разделения интерфейса в отношении ваших функций - то есть при передаче объекта он должен зависеть только от тех частей интерфейса этого аргумента, которые ему (функции) действительно нужны.