Практика кодирования для использования в Java для вложенной функции

Мне было интересно, какой тип кода мне написать:

public BigDecimal getItemSubTotal(BigDecimal quantity) {
        return getBasePrice().multiply(quantity).multiply(getRentalAdjustment()).add(getOtherAdjustments());
}

ИЛИ

public BigDecimal getItemSubTotal(BigDecimal quantity) {
    BigDecimal basePrice = getBasePrice();
    BigDecimal rentalAdj = getRentalAdjustment();
    BigDecimal otherAdj = getOtherAdjustments();
    return basePrice.multiply(quantity).multiply(rentalAdj).add(otherAdj);
}

Какой блок кода лучше, кроме читабельности кода и почему? Какой блок кода займет меньше времени и памяти?

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

Boris the Spider 04.01.2019 12:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
230
3

Ответы 3

apart from code readability

Единственное различие между этими двумя конкретными примерами состоит в том, что в первом случае вызовы getRentalAdjustment() и getOtherAdjustments() не будут выполняться, если - каким-то образом - вызов BigDecimal.multiply завершится неудачно.

Единственный задокументированный способ отказа BigDecimal.multiply - передача ему нулевого операнда. (И, конечно же, вызов multiply на нулевом приемнике тоже будет, если getBasePrice() вернет null).

Кроме этого, ничего. Все дело в удобочитаемости.

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

leftbit 04.01.2019 12:49

@leftbit это не повод писать уродливый код. Любой удаленно работающий отладчик не будет бороться с вызовами встроенных методов.

Boris the Spider 05.01.2019 08:01

@BoristheSpider Вопрос: «Какой блок кода лучше, кроме читабельности кода и почему?», Поэтому эстетика не затрагивает этот вопрос.

leftbit 07.01.2019 09:30

@leftbit удаляет оценочное суждение об уродстве кода, другой способ интерпретации комментария Boristhespider заключается в том, что вы не должны (и не должны) изменять способ написания кода просто для отладчика.

Andy Turner 07.01.2019 10:09

@AndyTurner Конечно, это должно быть правилом. Просто аргументирую здесь еще один аспект ремонтопригодности.

leftbit 07.01.2019 14:45

Это может зависеть от ваших требований. Но я хотел бы выделить несколько моментов, например:

  • Второй более читабельный, чем первый
  • Во втором вы сможете выполнять обработку исключений для каждого вызова, но в первом вы не можете сделать то же самое.
  • Каждое создание переменной в java занимает 4 байта (поскольку ссылка на переменную является целочисленным значением, а целое число занимает 4 байта в java). Так что по памяти первый лучше, чем второй

@BoristheSpider, как можно сказать, что последний пункт не правильный. Каждая ссылка в java занимает 4 байта памяти. БЮР ссылка на сайт

Deepak Kumar 06.01.2019 08:05

Это не так просто. Это зависит от типа машины (32/64) и от того, используются ли сжатые ссылки.

Boris the Spider 06.01.2019 09:45

Учитывая:

  1. Преимущества памяти и времени ничтожны, поскольку нет существенной разницы в сложности;
  2. Как упоминал @AndyTurner - функции не выполняются в одном и том же порядке, и отказ одной функции может помешать выполнению последующих вызовов.
  3. Инструменты Sonar / Linting не любят локальные ненужные переменные;
  4. Некоторые инструменты для линтинга могут воспринимать длинные строки как проблему:

Я бы выбрал:

public BigDecimal getItemSubTotal(BigDecimal quantity) {
        return getBasePrice()
            .multiply(quantity)
            .multiply(getRentalAdjustment())
            .add(getOtherAdjustments());
}

Другие вопросы по теме