Вызовите метод / функцию дважды.Сохранение в переменную и вызов один раз - PullRequest
1 голос
/ 07 июля 2011

Я часто прихожу к этому вопросу при кодировании.

Какой из следующих примеров является лучшей практикой? Я знаю, что другие факторы будут влиять на то, будет ли один или другой лучше. Но в целом, каковы преимущества одного над другим.

if(object.getA().Value != null) {
    return object.getA().Value;
}
return null;

Vs.

string x = string.null;
x = object.getA().Value;
return (x != null) ? x : null;

Вот еще один подобный пример:

var a = object.method(x).Value;
var b = object.method(x).Key;

Vs.

var y = object,method(x);
var a = y.Value;
var b = y.Key;

Другими словами, мой вопрос:

Лучше ли вызывать метод дважды и иметь на одну переменную меньше? или же Лучше сохранить его в переменную и вызвать метод дважды?

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

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

Большое спасибо

Ответы [ 3 ]

2 голосов
/ 07 июля 2011

Кэширование значения в переменной является базовой оптимизацией (связанной с запоминанием).

Когда становится действительно необходимым, если второй вызов функции находится в стеке значительный процент времени.

Например, если этот второй вызов выполняется в стеке 10% или 20% времени, то именно столько времени вы можете сэкономить, кэшируя первый результат.

Вы можете продолжать делать такие вещи, пока код не станет максимально быстрым.

Если я могу привести пример, давным-давно я работал над приложением, в котором был такой код:

if (!Done()){
  do some stuff
}
....
if (!Done()){
  do some other stuff
}

Поскольку Done() была такой короткой, простой и понятной функцией для вызова, ее вызывали много раз. Не берите в голову, что это сделало много, включая запрос тонны материала из БД и выбрасывание большей части этого. Stackshots мгновенно обнаружил проблему.

1 голос
/ 07 июля 2011

Общее правило: избегайте дополнительных переменных (без необходимости вводит состояния).(Нарушение правила, если двойной вызов функции добавляет слишком много накладных расходов)

1 голос
/ 07 июля 2011

Зависит от того, хотите ли вы быть потокобезопасным и может ли функция переключаться между вызовами.

например, с

if(object.getA().Value != null) {
    return object.getA().Value;
}
return null;

, если реализация свойства getter Value вернула aВо время второго вызова null у вас будет другой ответ.Он мог бы возвратить значение null во втором вызове либо путем реализации метода, либо если другой поток вызвал обновление между оператором if и return, который сделал результат свойства null.

Этот тест фактически избыточен, потому что вывозвращают нуль, если он ноль.Я предполагаю, что вы имели в виду if (object.getA() != null).Тогда предыдущий абзац по-прежнему применяется, но для getA () вместо Value, но тело if выдает исключение нулевой ссылки, если getA () возвращает null при втором вызове.

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

...