Что предпочтительнее; объявление и установка переменной и вызов дважды, или вычисление значения на лету дважды - PullRequest
1 голос
/ 27 августа 2009

Какой самый эффективный способ сделать это?

Sub pvaSetWeek(Optional weekOffset As Long = 0)
    Dim theDayToday As Long

    theDayToday = Weekday(Now, vbMonday)

    'Set start to Monday
    Range("pvaStartDate") = Int(Now) - (theDayToday - 1) - (weekOffset * 7)

    'Set end to Sunday
    Range("pvaEndDate") = Int(Now) + (7 - theDayToday) - (weekOffset * 7)
End Sub

или

Sub pvaSetWeek(Optional weekOffset As Long = 0)    
    'Set start to Monday
    Range("pvaStartDate") = Int(Now) - (Weekday(Now, vbMonday)- 1) - (weekOffset * 7)

    'Set end to Sunday
    Range("pvaEndDate") = Int(Now) + (7 - Weekday(Now, vbMonday)) - (weekOffset * 7)
End Sub

А почему?

Изменить, чтобы добавить: я обычно иду первым путем, так как его легче читать / отлаживать, и, очевидно, он лучше масштабируется, если одно и то же значение нужно использовать более пары раз, но когда значение можно использовать только несколько раз Я часто задавался вопросом, есть ли какое-либо наказание, пусть даже маленькое, за то или иное действие.

Ответы [ 4 ]

2 голосов
/ 30 августа 2009

Другие ответы хороши.

Я просто хотел бы отметить, что SO содержит много вопросов в форме "Является ли X более эффективным, чем Y?", Например, "Является ли ++ i более эффективным, чем i ++?" или "Эффективнее ли встроенные вызовы функций?" Ответ, чаще всего, как отмечал один из авторов, звучит так: «Подстричься, чтобы похудеть».

Конечно, это действительно может иметь значение, но не думайте, что это будет иметь существенное значение, пока вы не докажете, что это имеет значение в вашем случае .

1 голос
/ 27 августа 2009

Первый способ, безусловно, лучше с точки зрения читабельности. Я бы предпочел это.

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

0 голосов
/ 27 августа 2009

Я думаю, что некоторый "рефакторинг" доступен. Как насчет этого?

Sub pvaSetWeek(Optional weekOffset As Long = 0)  
  Dim TheDateToday as byte, lngRangeBase as Long, lngRangeStart As Long, lngRangeEnd As Long  
  TheDateToday = Weekday(Now, vbMonday)  
  lngRangeBase = (weekOffset * 7)  

  lngRangeStart =  - ((theDayToday - 1) - lngRangeBase )  
  lngRangeEnd =  (7 - theDayToday) - lngRangeBase  

  'Set start to Monday  
  Range("pvaStartDate") = Int(Now) + lngRangeStart  
  'Set end to Sunday  
  Range("pvaEndDate") = Int(Now) + lngRangeEnd  
End Sub  
0 голосов
/ 27 августа 2009

Это может показаться банальным ответом ... но вы пытались рассчитать время? Если нет «существенной разницы» *, определите, что является более читабельным / поддерживаемым.

** Я оставлю это тебе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...