Я бы согласился с гибридным предложением Чарльза Грэма, но я хочу добавить два своих цента, почему.
Многие из приведенных выше предложений говорят о сложности и оптимизации, но забудьте, что все это выходит за рамки, когда вы учитываете потребителя вашего класса. Если вы являетесь единственным потребителем, и вы использовали первую реализацию, скорее всего, вы помните:
double subTotal = myOrder.TotalCash;
double tax = subTotal * 0.05;
double shipping = subTotal > 100 ? 0 : 5.95;
double grandTotal = subTotal + tax + shipping;
OutputToUser(subTotal, tax, shipping, grandTotal);
Другие люди не могут. Видя, что myOrder.TotalCash
это свойство, а не метод, по крайней мере, я бы предположил, что это кэшированное значение. То есть доступ к subTotal
в приведенном выше примере сопоставим по эффективности с доступом к myOrder.TotalCash
. Не понимая, что за кулисами происходит расчет, они пишут:
double tax = myOrder.TotalCash * 0.05;
double shipping = myOrder.TotalCash > 100 ? 0 : 5.95;
double grandTotal = myOrder.TotalCash + tax + shipping;
OutputToUser(myOrder.TotalCash, tax, shipping, grandTotal);
оставив myOrder.TotalCash
для обозначения промежуточного итога. Теперь он был рассчитан 4 раза вместо 1.
Таким образом, я уверен, что я не единственный, кто считает, что свойство представляет переменную или кэшированное значение и метод обрабатывает что-то и возвращает значение . Имеет смысл хранить CalculateTotalCash()
и вызывать его только один раз, потому что вы ожидаете, что это будет падение производительности. С другой стороны, вы ожидаете, что TotalCash
будет кэшированным значением и сможете получить к нему доступ по своему усмотрению. Поэтому важно только пересчитать TotalCash
, когда он изменится.
Гибридное предложение выигрывает в случае нескольких наборов между чтениями. Таким образом, вы не тратите время на вычисление значения, которое нужно выбросить.