Подтвердить что ты не робот

Передача объекта цели и объекта объекта

Я думаю о решении для моего приложения. Здесь ситуация: у меня есть класс с методом, который принимает ObjectA как входной параметр и вызывает несколько небольших методов, каждый из этих методов нуждается в некоторых частях ObjectA (они не перекрываются, т.е. method1() требуется ObjectA.field1 и ObjectA.field2, method2() требуется ObjectA.field3 и т.д.). Теперь возникает вопрос: учитывая общие правила хорошего качества и производительность, лучше передать ObjectA каждому из этих методов, чтобы они могли извлечь значение они нужны сами по себе или лучше просто передать им ценности? Я имею в виду:

method1(ObjectA);
method2(ObjectA);

или

method1(Object1.getField1(), ObjectA.getField2());
method2(ObjectA.getField3());

Спасибо за любые ответы!

4b9b3361

Ответ 1

Имейте в виду, что с вашим кодом вы фактически не проходите ObjectA. А именно, вы передаете тип ссылки в ObjectA, поэтому в заметке о производительности разница между передачей ссылки на объект String и ссылкой на объект ObjectA будет незначительной.

Как бы я это написал

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

public void doSomethingRelatedToTheClass(String param)
{
    // Do something with param.
}

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

doSomethingRelatedToTheClass(myObject.getValue());

И это означает, что если вы обнаружите, что другой член ObjectA работает лучше в этом методе, или вы хотите получить доступ к другим членам ObjectA, и вы изменили doSomething(), чтобы отразить это изменение, вы необходимо изменить вызов метода, чтобы:

doSomethingRelatedToTheClass(myObject.getOtherValue(), myObject.getValue());

Таким образом, передавая весь объект, вы абстрагируете эту деталь, и метод может ее обработать; а именно:

doSomethingRelatedToTheClass(myObject); // Doesn't need to know what you do with it.

public void doSomethingRelatedToTheClass(ObjectA object)
{
    String val = object.getValue();

    String otherVal = object.getOtherValue();
}

Если изменение одного класса приводит к изменению других классов, это анти-шаблон называется Shotgun Surgery.

Изменить

У меня была возможность просмотреть мой ответ здесь, и я немного изменил свой первоначальный ответ, потому что я считаю, что это не лучшее решение для всех ситуаций. Как и выше, если метод связан конкретно с классом, то параметрированием должен быть экземпляр этого класса (или, более предпочтительно, его суперкласс или реализованный интерфейс [s]).

Это не тот случай, когда функциональность может быть общей. Примером универсальной функции может быть:

public String[] findNouns(String sentence);

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

Вкратце

  • Если метод является логикой, связанной с объектом, передайте объект

  • Если метод не имеет ничего общего с объектом, и объект просто использует его как служебную функцию, тогда передайте значение и присвойте ему имя функции.

Ответ 2

Давайте рассмотрим сценарий. Теперь это может быть или не быть вашим сценарием, но это иллюстрирует точку.

Давайте скажем, что поле1 и поле2 в вашем случае представляют собой два целых числа, а метод1 суммирует их и возвращает результат.

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

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

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

Исключения

AS maaartinus указывает, если, например, поле1 и поле2 были точками и методом1, вычисленным расстоянием между этими двумя точками, тогда мне пришлось бы согласиться, что прохождение двух точек будет лучше, чем передача 2 xy целых пар (4 параметра)

Надеюсь, что это поможет

Ответ 3

Я бы сказал, это зависит. Метод может быть более четким и более общим, если он использует аргументы, а не требует целого объекта. Иногда у вас есть аргументы готовые (например, x и y), и их сначала необходимо агрегировать в, например, a Point, чтобы иметь возможность вызвать метод. Иногда у вас есть другой несвязанный объект (например, некоторый ImmutablePoint, очевидно, не расширяющийся java.awt.Point), и ему нужно будет извлечь координаты и создать объект для передачи.

Обычно, если переданный объект является надлежащей абстракцией, то передача его в целом - это путь. Это не вопрос производительности, его читаемость и ремонтопригодность. См. Также Закон Деметры, который может привести к более слабой зависимости от переданного объекта.