9

Предположим, что у меня есть следующиеПередача одного объекта против передачи нескольких параметров

Class A { 
    Foo getFoo(); 
    Bar getBar(); 
    Baz getBaz(); 
} 

И мне нужно, чтобы определить функцию, которая использует doStuffFoo, Bar, Baz из один объекта и делает некоторые вещи

Я борюсь между тем, какой метод внедрения doStuff лучше (предположим, что было бы нежелательно размещать doStuff внутри класса A)

Метод А

void doStuff(Foo foo, Bar bar, Baz baz) 
{ 
    //some operation 
} 

или

Метод B

void doStuff(A a) 
{ 
    Foo foo = a.getFoo(); 
    Bar bar = a.getBar(); 
    Baz baz = a.getBaz(); 
    //some operation 
} 

К моему ограниченному знанию, (+ плюсы, минусы -)

Me ThOD A

+ Понятно, что именно параметры doStuff() работает на

-Susceptible в длинных списках параметров и более восприимчивы к ошибкам пользователя

Метод B

+ Простой, легкий в метод использования

+ Кажется более растяжимым (?)

-создает ненужную зависимость по отношению к классу A


Может кто-нибудь представить дополнительная проницательность в стороне плюсов и минусов этих двух методов?

+0

Это, как говорится, метод B – JavaHopper

ответ

11

Метод A (обнаженные параметры) всегда имеет те преимущества, которые

  • это требует метод автора набрать меньше, так как они не должны реализовать параметров объекта,
  • это требует метод абонента чтобы напечатать меньше, так как им не нужно создавать экземпляр объекта параметра
  • он работает лучше, так как не нужно создавать объект параметров и собирать мусор
  • читатель может видеть, какие индивидуальные параметры указаны только в методе (но t его обоюдоострый меч; смотри ниже)

Метод B (Parameter Object) имеет свои преимущества, когда

  • параметры имеют домен значение, как группы, так что объект параметра может быть присвоено имя, которое объясняет, что значение, экономя читателя от чтобы читать и понимать каждого члена группы и как они относятся
  • список параметров используется более чем одним способом, поэтому использование каждого параметра в каждом случае уменьшает дублирование
  • значения в списке параметров передаются среди несколько м этады как группы, что проще, когда их можно передать в виде одного объекта параметра
  • некоторые комбинации значений недействительны; объект Parameter может предотвратить эти комбинации
  • некоторые значения являются необязательными, которые могут быть предоставлены объектом параметра, а не (в зависимости от вашего языка) значениями параметров по умолчанию или перегруженными методами
  • существует более одного параметра того же типа , делая ошибки стоимостью замены более вероятно (хотя параметр объекта не лучше в этом случае, если он имеет конструктор с тем же списком параметров, как метод)

, что объект параметров вводит новую зависимость, на которой зависание звонящего и вызываемого абонента не является большим недостатком, поскольку это простой класс без собственных зависимостей.

Таким образом, параметр Объект

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

Parameter Object s действительно обеспечивает хороший подход инкапсулировать related параметров, чтобы уменьшить общий параме ter для любого метода или конструктора. Нужно быть очень осторожным, чтобы убедиться, что объекты параметров действительно содержат действительно связанные параметры.

На самом деле существует множество способов приблизиться к этой проблеме в зависимости от того, с чем вы столкнулись. Если вы имеете дело с параметрами, которые являются общими типами, например, более чем одним String s или Int s, и существует вероятность того, что клиент действительно пройдет неверную последовательность аргументов, часто возникает смысл создавать custom types т.е.создайте enum с возможными значениями. Это может обеспечить хорошую проверку времени компиляции ваших аргументов. Другим хорошим использованием их является то, что вы можете использовать их для return сложных значений из функций. См. here.

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

В основном я стараюсь следовать рекомендациям Боба Мартина максимум из трех параметров. Ну, он на самом деле говорит, что это должно быть в основном не более одного! Любое увеличение должно иметь обоснованные причины. Рекомендовать эту замечательную книгу: Clean Code

Смежные вопросы