Задать вопрос
@ant123455432143

Нужно ли делать условие перед вызовом метода для избежания выделения дополнительной памяти?

Всем привет! Сделал задачу на php и коллега оставил замечание. Вот упрощенный пример кода:
private function setIsTestProperty(bool $isTest): void
{
  if (!$isTest) {
    return;
  }
 
  $this->orderIsTest>setValue('Y');
}


И вызов этого метода:
$isTestOrder = $this->getIsTest();
$this->setIsTestProperty(!is_null($isTestOrder));


Коллега говорит:
"Может лучше сделать проверку перед вызовом метода? При передаче параметра внутрь метода под него выделяется дополнительная память."
if ($isTestOrder)
$this->setIsTestProperty();


Тимлид говорит, что это экономия на спичках и так делать не нужно. Кто прав? Мне нужно аргументировать ответ, но я не знаю как ответить правильно.
  • Вопрос задан
  • 142 просмотра
Подписаться 1 Средний 3 комментария
Решения вопроса 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Если говорить про конкретный пример, то он просто бессмысленный, даже с точки зрения житейской логики.
Учитывая, что if ($isTestOrder) можно прочитать, как ЕСЛИ переменная не занимает памяти то проверка выглядит просто глупостью. "Если переменная не занимает памяти, то не передавать её. Так мы с экономим память!" Если переменная и так не занимает никакой памяти, то какого еще дополнительно выделения памяти она может потребовать?

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

В общем случае тут не будет никакой экономии, ни на спичках, ни без.

При передаче параметра внутрь метода под него выделяется дополнительная память

- это чушь и неправда.

При передаче в функцию параметра, который в принципе может занимать хоть какую-то осмысленную память (то есть не числа, не булева значения, и не null), память под него НЕ выделяется.
  • Объекты изначально передаются по ссылке
  • Строки и массивы - с использованием механизма copy-on-write. Что означает, что память будет выделяться только если переданное значение будет изменено в процессе обработки. А если оно будет только считываться, то дополнительной памяти занимать не будет

Для всех остальных типов, как было правильно сказано тимлидом - это будет экономия на спичках.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Мне нужно аргументировать ответ, но я не знаю как ответить правильно.
Очень просто: Так как проверка отнимает процессорное время, то экономия все равно будет липовой, вместо памяти потратится ресурс процессора. Сколь ни будь значительной экономии это не даст ни в том, ни в другом случае, точнее экономия будет в случае отсутствия проверки и существования переменной, что будет происходить скорее всего чаще чем несуществование переменной, ну или по крайней мере в каком-то числе случаев, в то время как проверка будет осуществляться всегда.
Ответ написан
Комментировать
Lopar
@Lopar
системный администратор
В отрыве от более профессиональных коллег совет со стороны, совет чисто с практической стороны.
Если bool $isTest имеет прямое отношение к методу\классу, стоит вызывать его изнутри, если это чисто внешняя проверка не имеющая прямого отношения - стоит вызывать извне. Чисто чтобы не смешивать логику.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы